Problème de compréhension de la command 'hash' dans un file .sh

Donc, je voulais installer etherpad Lite sur une machine Linux.

Si j'essaie de l'exécuter, j'obtiendrai l'erreur "Veuillez installer node.js ( http://nodejs.org )"

la command 'quel noeud' me donne le path correct vers le noeud js.

Donc je suis allé dans le file .sh de Etherpad Lite et j'ai trouvé ceci:

#Is node installed? hash node > /dev/null 2>&1 || { echo "Please install node.js ( http://nodejs.org )" >&2 exit 1 } 

Je suppose que cela signifie: vérifier pour le noeud -> si la ligne d'printing n'est pas disponible et quitter. Mais que fait exactement ce code? Que fait le hash? Quel est avec tous ces & &>? Toute personne qui peut m'expliquer ces 3 lignes serait vraiment appréciée.

Lorsque vous tapez des commands dans un shell bash, le shell search ces commands dans la variable $ PATH. Le hachage est juste un index des commands que vous avez tapé et où ils ont été trouvés pour aider à accélérer la découverte d'eux la prochaine fois.

NOTE: La réponse de @ Anthon donne une bonne définition de ce que le hash est!

Par exemple, si vous exécutez uniquement le hash command sans arguments, vous obtiendrez une list des commands précédemment trouvées ainsi que le nombre de fois où elles ont été utilisées (par exemple: hits):

 % hash hits command 2 /usr/bin/host 1 /bin/more 1 /home/saml/bin/autossh_mail.sh 3 /usr/bin/zip 2 /bin/rm 2 /bin/date 2 /usr/bin/vim 1 /usr/bin/htop 2 /bin/mv 3 /bin/ps 8 /usr/bin/ssh 1 /usr/bin/yum 1 /usr/bin/xfreerdp 1 /bin/cp 2 /bin/mkdir 4 /usr/bin/man 1 /usr/bin/gvim 1 /usr/bin/unzip 1 /usr/bin/w 5 /usr/bin/nslookup 51 /bin/ls 15 /usr/bin/find 

Le hash node command renvoie une valeur d'état (0 ou 1) selon que cette valeur était présente dans la list de hachage ou non:

hash node n'est pas sur ma list

 % hash node bash: hash: node: not found % echo $? 1 

REMARQUE: l'état de toute command précédemment exécutée est temporairement stocké dans une variable d'environnement $? . C'est là que l'état (0 = succès, 1 = échec) est mis après l'exécution de chaque command.

La construction "cmd1" || {"cmd2" …} est un ou une instruction. Pense et / ou de la logique ici. Donc, cela signifie faire la première chose, si elle échoue, puis faire la seconde, sinon ne pas faire la deuxième chose.

Un exemple plus élaboré:

 % true && echo "1st cmd ret. 1" || echo "1st cmd ret. 0" 1st cmd ret. 1 % false && echo "1st cmd ret. 1" || echo "1st cmd ret. 0" 1st cmd ret. 0 

La logique est toujours déroutante (au less pour moi) car un 1 renvoyé signifie que la command a échoué, alors qu'un 0 renvoyé signifie qu'il a bien fonctionné.

En plus des réponses précédemment affichées, j'aimerais append une explication de la partie "2> & 1".

 > /dev/null 

Redirige le descripteur de file de sortie (les descripteurs de files sont un nombre que le process utilise pour lire et écrire dans les files, les pipes et le terminal) au file / dev / null qui est une "poubelle" du système, écrit dessus, et rejette ces données.

 2>&1 

Redirige le descripteur de file stderr (un file de sortie pour les erreurs) numéroté 2 vers le descripteur de file 1, qui vient d'être redirigé vers / dev / null, c'est-à-dire ignoré.

Donc, ces deux parties set s'assurent qu'aucune sortie ne sera vue de la command de hachage.

Du manuel bash:

 Each time hash is invoked, the full pathname of the command name is determined by searching the directories in $PATH and remembered. Any previously-remembered pathname is discarded. 

hash est une command interne à bash, utilisée pour travailler avec le hash-table bash utilise pour searchr des paths complets vers les commands que vous tapez.

Ce script l'utilise pour s'assurer que l'exécutable du node est recherché dans le path.

hash node search PATH pour la première command nommée nœud et ajoute ou met à jour l'location du nœud sur la list des locations mémorisés ou renvoie 1 si le nœud n'a pas été trouvé.

hash est utilisé à la place de ce qui suit:

  • qui n'est pas défini par POSIX.
  • Dans certains environnements, qui est un script csh qui peut changer PATH.
  • Par exemple dans bash hash est un builtin mais qui ne l'est pas, et le hash est généralement plus rapide.

Comme l'OP mentionné dans un commentaire, le problème était que le nœud manquait réellement de PATH lorsque le script a été exécuté. Alors, which node aurait eu le même résultat.