Wax-Reggea a écrit :Il y a des priorités sur les redirections, par exemple si je fais : "ls > toto << salut", le bash va d'abord faire les '<<' (donc que je tape "salut") puis le '>'.
C'est ce genre de priorité qui m'intéresse.
Évidemment, si tu tapes dans ce genre de construction, on n'est pas sorti.
benjarobin a écrit :Je ne vois aucune priorité... Il lit séquentiellement les commandes.
est identique à
Absolument.
Pour développer...
http://www.gnu.org/software/bash/manual ... -Documents
Appelle ça une priorité si tu veux, mais ce n'est pas le cas: c'est juste que tu indiques au shell qu'il y a encore des choses à tenir compte
avant d'exécuter la commande ; c'est pourquoi "toto" est vide si tu interrompts avec CTRL+C par exemple (avec <<, c'est comme de faire une phrase en s'interrompant à la moitié: bash attend que la phrase soit complète avant de l'interpréter).
Ton exemple n'est pas le meilleur pour comprendre ce qu'il se passe...
Je te laisse méditer sur... Mettons:
Code : Tout sélectionner
$ cat > toto << salut
> Salut toto
> bye
> salut
$ cat toto
Salut toto
bye
Pour bash, c'est effectivement équivalent à écrire
cat << salut > toto
.
Autre exemple qui te parlera peut-être mieux (tiré de
http://en.wikipedia.org/wiki/Here_document):
Code : Tout sélectionner
$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES
Le truc est que tr lit sur l'entrée standard par défaut, tu me suis ? Donc
tr a-z A-Z
attend des choses à analyser, d'accord ? Par conséquent, il ne va s'exécuter qu'après complétement du << ici.
Ainsi si tu veux on peut rajouter l'écriture dans un fichier:
Code : Tout sélectionner
$ tr a-z A-Z > toto << END_TEXT # tr a-z A-Z << END_TEXT > toto est plus clair à mon avis
> one two three
> uno dos tres
> END_TEXT
$ cat toto
ONE TWO THREE
UNO DOS TRES
Là encore avant d'écrire dans le fichier, il faut que le tr soit complet et il le sera dans l'exemple via le << (sinon c'est la même chose que faire tr a-z A-Z > toto , toto n'est rempli qu'une fois fini sur l'entrée standard avec CTRL+D ; la seule différence par rapport à l'entrée standard tient au fait que toto n'est créé qu'après END_TEXT, mais c'est normal comme je te disais: bash attend d'avoir tout sous la main).