Quelle est la différence entre et dans bash?

71

Quelle est la différence entre << , <<< et < < in bash?

    
posée Searene 27.09.2015 - 09:42
la source

4 réponses

82

Ici le document

<< est connu sous le nom de structure here-document . Vous laissez le programme savoir ce que sera le texte de fin, et chaque fois que ce séparateur est vu, le programme lira tout ce que vous avez donné au programme en entrée et effectuera une tâche dessus.

Voilà ce que je veux dire:

$ wc << EOF
> one two three
> four five
> EOF
 2  5 24

Dans cet exemple, nous indiquons au programme wc d’attendre EOF string, puis de taper cinq mots, puis de taper EOF pour signaler que nous avons fini de donner. En fait, cela revient à exécuter wc par lui-même, en tapant des mots, puis en appuyant sur Ctrl D

Chaîne ici

<<< est appelé here-string . Au lieu de taper du texte, vous donnez une chaîne de texte pré-établie à un programme. Par exemple, avec un programme tel que bc , nous pouvons faire en sorte que bc <<< 5*4 obtienne juste une sortie pour ce cas spécifique, inutile d'exécuter bc de manière interactive.

Substitution de processus

Comme l'explique tldp.org ,

  

La substitution de processus alimente la sortie d'un processus (ou de processus) en   le stdin d'un autre processus.

Donc, en fait, cette méthode est similaire au stdout d’une commande à une autre, par ex. echo foobar barfoo | wc . Mais remarquez: dans la page de manuel bash , vous verrez qu’elle se nomme <(list) . Donc, fondamentalement, vous pouvez rediriger la sortie de plusieurs commandes (!).

Note: techniquement lorsque vous dites < < vous ne faites pas référence à une chose, mais deux redirection avec un seul < et un processus de redirection de sortie de <( . . .) .

Que se passe-t-il si nous ne faisons que traiter la substitution?

$ echo <(echo bar)
/dev/fd/63

Comme vous pouvez le voir, le shell crée un descripteur de fichier temporaire /dev/fd/63 où la sortie va (ce qui, selon la réponse de Gilles , est un tuyau anonyme). Cela signifie que < redirige ce descripteur de fichier en entrée dans une commande.

Un exemple très simple serait de faire en sorte que la substitution de processus de la sortie de deux commandes echo dans wc:

$ wc < <(echo bar;echo foo)
      2       2       8

Ici, nous faisons en sorte que shell crée un descripteur de fichier pour toutes les sorties qui apparaissent dans les parenthèses et le redirige en tant qu’entrée vers wc . Comme prévu, wc reçoit ce flux à partir de deux commandes echo , chacun ayant un mot, et de manière appropriée, nous avons 2 mots, 2 lignes et 6 caractères, plus deux nouvelles lignes comptées.

Side Note: La substitution de processus peut être appelée bashism (une commande ou une structure utilisable dans les shells avancés tels que bash , mais non spécifiée par POSIX), mais il a été implémenté dans ksh avant l'existence de bash en tant que page de manuel ksh et cette réponse suggère. Les shells tels que tcsh et mksh n'ont cependant pas de substitution de processus. Alors, comment pouvons-nous rediriger la sortie de plusieurs commandes vers une autre commande sans substitution de processus? Regroupement et tuyauterie!

$ (echo foo;echo bar) | wc
      2       2       8

Effectivement, c'est la même chose que dans l'exemple ci-dessus. Cependant, ceci est différent de la substitution de processus, puisque nous faisons stdout de tout le sous-shell et stdin de wc lié ​​au canal D'autre part, la substitution de processus permet à une commande de lire un descripteur de fichier temporaire.

Donc, si nous pouvons faire du regroupement avec la tuyauterie, pourquoi avons-nous besoin de la substitution de processus? Parce que parfois nous ne pouvons pas utiliser la tuyauterie. Considérez l'exemple ci-dessous - en comparant les sorties de deux commandes avec diff (qui nécessite deux fichiers, et dans ce cas nous lui donnons deux descripteurs de fichiers)

diff <(ls /bin) <(ls /usr/bin)
    
réponse donnée Sergiy Kolodyazhnyy 27.09.2015 - 09:56
la source
22

< < est une erreur de syntaxe:

$ cat < <
bash: syntax error near unexpected token '<'

< <() est une substitution de processus ( <() ) combinée à une redirection ( < ):

Un exemple élaboré:

$ wc -l < <(grep ntfs /etc/fstab)
4
$ wc -l <(grep ntfs /etc/fstab)
4 /dev/fd/63

Avec la substitution de processus, le chemin d'accès au descripteur de fichier est utilisé comme un nom de fichier. Si vous ne voulez pas (ou ne pouvez pas) utiliser directement un nom de fichier, vous combinez la substitution de processus avec la redirection.

Pour être clair, il n'y a pas d'opérateur < < .

    
réponse donnée muru 27.09.2015 - 10:05
la source
10

< < est une erreur de syntaxe, vous voulez probablement dire command1 < <( command2 ) qui est une redirection d'entrée simple suivie d'une substitution de processus et qui est très similaire mais pas équivalente à:

command2 | command1

La différence en supposant que vous exécutiez bash is command1 est exécutée dans un sous-shell dans le second cas alors qu’elle est exécutée dans le shell actuel du premier. Cela signifie que les variables définies dans command1 ne seront pas perdues avec la variante de substitution de processus.

    
réponse donnée jlliagre 27.09.2015 - 10:09
la source
8

< < donnera une erreur de syntaxe. L'utilisation appropriée est la suivante:

Explication à l'aide d'exemples:

Exemple pour < <() :

while read line;do
   echo $line
done< <(ls)

Dans l'exemple ci-dessus, l'entrée dans la boucle while proviendra de la commande ls qui peut être lue ligne par ligne et echo ed dans la boucle.

<() est utilisé pour la substitution de processus. Vous trouverez plus d’informations et d’exemples sur <() à ce lien:

Substitution de processus et traitement

    
réponse donnée snoop 27.09.2015 - 10:06
la source

Lire d'autres questions sur les étiquettes