Subshell
El shell bash permite la agrupación de órdenes mediante los caracteres ( ) y { }. La diferencia entre ambos agrupamientos es el ambiente de ejecución.
Un aspecto importante de ambos tipos de agrupaciones de órdenes es que funcionan como una unidad a nivel de redireccionamiento, es decir, la salida de todos los comandos del agrupamiento puede enviarse a un único fichero:
$ ( ls -l /etc/passwd ; ls -l /etc/group ) > salida
$ cat salida
-rw-r--r-- 1 root root 1769 oct 28 22:35 /etc/passwd
-rw-r--r-- 1 root root 913 oct 28 22:35 /etc/group
Si utilizamos los paréntesis, el agrupamiento se ejecuta en un subshell, es decir, en un ambiente de ejecución distinto al del proceso padre. Sin embargo, si se emplean las llaves, se ejecutan en el mismo ambiente del proceso padre.
Un subshell es una copia separada del shell padre, por lo tanto, una copia de las variables, funciones y alias del shell padre está disponible en el subshell y si se modifican, no afectan al padre por ser copia.
$ var=hola
$ echo $var
hola
$ ( echo $var; var=adiós; echo $var; )
hola
adiós
$ echo $var
hola
Veamos el mismo ejemplo, pero usando las llaves, que hacen que la ejecución sea sobre el propio ambiente del padre:
$ var=hola
$ echo $var
hola
$ { echo $var; var=adiós; echo $var; }
hola
adiós
$ echo $var
adiós
Cuando se usan las llaves es obligatorio acabar la última instrucción en punto y coma (;), en el caso de usar paréntesis (subshells) no es obligatorio.
Licencia: licencia de software libre GPL