Ligne de commande: <<< au lieu de <<

63

Pourquoi la commande md5sum <<< 'ddd' (sortie :) est-elle d6d88f2e50080b9602da53dac1102762 -correcte et md5sum << 'ddd'non?

Qu'est-ce que ça <<<veut dire?

Jean Paulus
la source

Réponses:

45

La <<<commence une “chaîne ici”: la chaîne est développée et transmise au stdin du programme. (Dans votre cas, il n'y a pas beaucoup d'expansion en cours.) Cela équivaut à ceci:

echo ddd | md5sum

D'autre part, <<commence un document ici. Toutes les lignes suivantes, jusqu’à une ligne contenant le marqueur ddd, constitueront l’entrée du programme. (Vous devez utiliser un marqueur qui n’apparaîtra probablement pas dans vos données.) Vous pouvez obtenir le même effet que ci-dessus, comme ceci:

md5sum <<END
ddd
END

Il y a une différence entre <<ENDet <<'END': sans les guillemets, toutes les variables, séquences d'échappement, etc. du document ici seront étendus comme d'habitude.

chirlu
la source
3
Là où ce n’est pas équivalent, c’est que sauf que rc, <<<(comme <<) utilise un fichier temporaire et peut donc être utilisé par des commandes qui utilisent lseekleur stdin.
Stéphane Chazelas
32

<<<introduit une chaîne here : la chaîne suivante <<<est transmise en entrée à la commande. Cela provient du port de Byron Rakitzis rc(un shell Plan 9) vers Unix, et est également présent dans zsh, ksh93 et ​​bash.

<<introduit un document here : les lignes suivantes du script shell sont passées en entrée de la commande et la chaîne suivante <<est un terminateur. Ici, les documents fonctionnent dans tous les shells Bourne (Bourne, POSIX, Ash, Bash, Ksh, Zsh,…), Shells de style C (csh, tcsh) et Shells Plan 9 (rc, es).

Gilles, arrête de faire le mal
la source
3
Non, ce <<<n'est pas une kshextension, le chemin est rc-> zsh-> ksh93-> bash(les kshnotes de version accusent réception du emprunt pour une fois zsh). <<travaille aussi dans le rcstyle des coquillages
Stéphane Chazelas
Il y a une différence entre le rcet zsh <<<même si cela rcn'inclut pas un caractère de fin de ligne et n'utilise pas de fichier temporaire (utilise un canal et un processus supplémentaire le chargeant au moins dans le port vers Linux).
Stéphane Chazelas
Pour être plus précis, cela semble provenir <<<du port Unix, rccar il ne semble pas que le Plan9 l’ rcait.
Stéphane Chazelas