Comment les parenthèses sont-elles interprétées sur la ligne de commande?

45

En lisant comment installer grub, je suis tombé sur un article affirmant que je devais utiliser l'une des deux syntaxes suivantes,

echo \(hd0,0\) >> /boot/grub/grub.conf

ou

echo '(hd0,0)' >> /boot/grub/grub.conf

parce que, sur la ligne de commande, les parenthèses sont interprétées de manière particulière. Quelle est la particularité des parenthèses? Comment sont-ils interprétés?

Steve Brown
la source

Réponses:

46

Les parenthèses désignent un sous-shell en bash. Pour citer la man bashpage:

(list)    list  is  executed  in  a  subshell  environment (see COMMAND
          EXECUTION ENVIRONMENT below).  Variable assignments and builtin 
          commands that affect the shell's environment do not remain in 
          effect after the command completes.  The return status is the
          exit status of list.

où a listest juste une séquence normale de commandes.

Ceci est en fait assez portable et pas spécifique à juste bashsi. La spécification du langage de commande POSIX Shell présente la description suivante pour la (compound-list)syntaxe:

Exécuter la liste de composés dans un environnement de sous-shell; voir Environnement d'exécution du shell . Les assignations de variables et les commandes intégrées qui affectent l'environnement ne doivent pas rester en vigueur une fois la liste terminée.

jw013
la source
En bash et autres coquillages ...?
jasonwryan
3
bash est celui que je demandais ...
Steve Brown
5
Quelle est la différence entre $()et ()?
CMCDragonkai
5
@CMCDragonkai La $()est une substitution de commande, la ()est un sous-shell. Les deux exécutent des commandes, la différence est ce qui arrive à la sortie. Les noms sont beaucoup plus faciles à rechercher que les symboles. Voir aussi unix.stackexchange.com/q/213530/9537
jw013
12

Une liste de commandes intégrée entre parenthèses est exécutée en tant que sous-shell.

Les variables d'un sous-shell ne sont pas visibles en dehors du bloc de code du sous-shell. Ils ne sont pas accessibles au processus parent, au shell qui a lancé le sous-shell. Ce sont en fait des variables locales.

Voir Linuxtopia - Chapitre 20. Sous-shell

marque
la source