Page 2 sur 2

Re: [BASH] Priorité des métacharactere

Publié : mer. 12 févr. 2014, 10:07
par z3bra
Si j'ai bien compris où tu veux en venir (puisque tu tiens tant à avoir un "ordre"). Pense à ça:

';' : 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
Si on résume, on a donc:
';' 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...

Re: [BASH] Priorité des métacharactere

Publié : mer. 12 févr. 2014, 11:31
par oktoberfest
http://www.teiser.gr/icd/staff/nikolaid ... _shell.pdf
Si tu regardes pages 328 et suivantes, tu trouveras la grammaire de bash en version BNF.
C'est la réponse à toutes tes questions si tu as vu la notion de grammaire (ça me rappelle le bon vieux temps de l'université !)