[BASH] Priorité des métacharactere (Résolu)

Applications, problèmes de configuration réseau
Avatar de l’utilisateur
z3bra
archer
Messages : 127
Inscription : jeu. 28 juin 2012, 23:17

Re: [BASH] Priorité des métacharactere

Message 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...
archlinux - 2bwm [ blog | git ]
oktoberfest
Maître du Kyudo
Messages : 1855
Inscription : mer. 06 janv. 2010, 13:51
Localisation : Ried - Alsace - France

Re: [BASH] Priorité des métacharactere

Message 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é !)
La majorité des bugs se situe entre la chaise et le clavier...
Arrêtez de vous prendre la tête avec les partitions... passez au LVM
Répondre