¿Cómo se interpretan los paréntesis en la línea de comando?

45

Mientras leía cómo configurar grub, me encontré con un artículo que decía que necesitaba usar una de las siguientes dos sintaxis,

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

o

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

porque, en la línea de comando, los paréntesis se interpretan de manera especial. ¿Qué tienen de especial los paréntesis? ¿Cómo se interpretan?

Steve Brown
fuente

Respuestas:

46

Los paréntesis denotan una subshell en bash. Para citar la man bashpágina:

(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.

donde a listes solo una secuencia normal de comandos.

Sin bashembargo, esto es bastante portátil y no específico . La especificación POSIX Shell Command Language tiene la siguiente descripción para la (compound-list)sintaxis:

Ejecute la lista compuesta en un entorno de subshell; ver Entorno de ejecución de Shell . Las asignaciones variables y los comandos integrados que afectan el entorno no permanecerán vigentes una vez que finalice la lista.

jw013
fuente
¿En bash y otras conchas ...?
jasonwryan
3
bash es lo que estaba preguntando ...
Steve Brown
55
¿Cuál es la diferencia entre $()y ()?
CMCDragonkai
55
@CMCDragonkai La $()sustitución del comando es, ()es una subshell. Ambos ejecutan comandos, la diferencia es lo que le sucede a la salida. Los nombres son mucho más fáciles de buscar que los símbolos. Consulte también unix.stackexchange.com/q/213530/9537
jw013
12

Una lista de comandos incrustada entre paréntesis se ejecuta como un subshell.

Las variables en una subshell no son visibles fuera del bloque de código en la subshell. No son accesibles para el proceso padre, para el shell que lanzó el subshell. Estas son, en efecto, variables locales.

Ver Linuxtopia - Capítulo 20. Subshell

marca
fuente