';' : séparateur de commande, ce qu'il y a avant et après n'intéragieront jamais
'>>', '<' et '>' : redirige un flux de texte vers un autre (typiquement, stdout vers fichier, ou fichier vers stdin)
'<<' : Here-document (cf. le lien de FoolEcho)
'|' : redirige stdout vers stdin
Bash va 'lire' ta commande de gauche à droite.
Code : Tout sélectionner
#affiche foo sur stdout, puis redirige stdout vers file1 (en écrasant le fichier)
# Puis (commande suivante), fait pareil pour file2
echo "foo" > file1; echo "bar" > file 2
# file 1 : foo
# file 2 : bar
# affiche foo sur stdout, puis redirige stdout vers stdin de la prochaine commande
# xargs exécute "echo $stdin" (en gros), et donc: echo "foo". Puis il redirige stdout vers file1
# ah non, attends, il y en a un autre, vers file2 en fait
echo "foo" | xargs echo > file1 > file2
# file1: <vide>
# file2: foo
# Pour pallier à ce "problème" tu peux utiliser les sous-shell
# Le shell va d'abord exécuter ENTIÈREMENT la commande dans (), puis parser le reste
# Donc ici "foo" sera redirigé dans file1, puis ce qui sort sur stdout de cette commande
# ira dans file2
(echo "foo" >file1) > file2
# file1: foo
# file2: <vide>
# affiche foo sur stdout, puis redirige stdout vers file1. Ensuite, stdout et envoyé
# sur stdin de la commande suivante, qui redirigera stdout dans file2.
# Mais comme "foo" a été redirigé vers file1 au début, plus rien ne sera pipé
echo "foo" > file1 | xargs echo > file2
# file1: foo
# file2: <vide>
# redirige la sortie de la commande 'cat' vers file1.
# La commande 'cat' va afficher le contenu du document sur stdout
# Tiens! Le document est un here-document. On attends que l'utilisateur nous
# done le document.
# Une fois terminé, on affiche ce document (qui sera redirigé vers file1
# Pour file2, on affiche le contenu du here-document sur stdout, puis on redirige
# stdout vers file2 (sans écraser le contenu précédent)
cat > file1 <<EOF; cat <<EOF >> file2
> foo
> EOF
> bar
> EOF
# file1: foo
# file2: bar
# enfin, le chevron 'inversé' qui permet de passer un fichier sur stdin.
# ici, on va rediriger le résultat de la commande 'cat' dans file2.
# cat va lire sur stdin, et on va lui passer le contenu de file1 sur stdin.
# typiquement, c'est un cp file1 file2 ^^
# Note que les deux commandes ont EXACTEMENT le même effet
echo "foo" > file1; cat <file1 >file2
echo "foo" > file1; cat >file2 <file1
# Petit exercice, deviens le contenu de file1 et file2 après ça (sans exécuter bien sûr ^^)
echo "foo" > file1 | cat <<EOF >> file1; cat <<EOF | echo file1 | xargs cat > file2
> foo
> bar
> EOF
> gabuzomeu
> EOF
';' et '|': séparateurs de commandes
'<', '>', '>>': redirection de flux de données
'<<': here-document
Donc en gros, bash va lire de gauche à droite TOUS LES TERMES. Une fois qu'il aura compris ce qu'il doit faire, il va exécuter la commande.
Il n'y a pas d'ordre à proprement parler, juste de la cohérence. Les flux sont "réarrangés" lors de l'exécution. Ainsi
>file2 <file1
et <file1 >file2
sont similaires.En cas de "doublon" (exemple:
>file1 >file2
), c'est le dernier déclaré qui prend la main. C'est bien la seule notion d'ordre ici ^^J'espère avoir répondu à ta question. SInon, je dois avouer que je vois absolument pas de quoi tu veux parler...