De acuerdo con esto , colocar una lista de comandos entre llaves hace que la lista se ejecute en el contexto de shell actual. No se crea ninguna subshell .
Usando ps
para ver esto en acción
Esta es la jerarquía de proceso para una tubería de proceso ejecutada directamente en la línea de comando. 4398 es el PID para el shell de inicio de sesión:
sleep 2 | ps -H;
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29696 pts/23 00:00:00 sleep
29697 pts/23 00:00:00 ps
Ahora sigue la jerarquía de procesos para una tubería de proceso entre llaves entregadas directamente en la línea de comando. 4398 es el PID para el shell de inicio de sesión. Es similar a la jerarquía anterior que demuestra que todo se ejecuta en el contexto actual del shell :
{ sleep 2 | ps -H; }
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29588 pts/23 00:00:00 sleep
29589 pts/23 00:00:00 ps
Ahora, esta es la jerarquía del proceso cuando el sleep
en la tubería se coloca dentro de llaves (por lo tanto, dos niveles de llaves en total)
{ { sleep 2; } | ps -H; }
PID TTY TIME CMD
4398 pts/23 00:00:00 bash
29869 pts/23 00:00:00 bash
29871 pts/23 00:00:00 sleep
29870 pts/23 00:00:00 ps
¿Por qué bash
tiene que crear un subshell para ejecutarse sleep
en el tercer caso cuando la documentación establece que los comandos entre llaves se ejecutan en el contexto actual del shell?
{ sleep 2 | command ps -H; }