De acordo com isso , a colocação de uma lista de comandos entre chaves faz com que a lista seja executada no contexto atual do shell. Nenhum subshell é criado .
Usando ps
para ver isso em ação
Esta é a hierarquia de processos para um pipeline de processos executado diretamente na linha de comandos. 4398 é o PID para o shell de login:
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
Agora segue a hierarquia do processo para um pipeline de processo entre chaves executadas diretamente na linha de comando. 4398 é o PID para o shell de logon. É semelhante à hierarquia acima, provando que tudo é executado no contexto atual do 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
Agora, essa é a hierarquia do processo quando o sleep
próprio pipeline é colocado dentro de chaves (portanto, dois níveis de chaves)
{ { 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 que é bash
necessário criar um subshell para execução sleep
no terceiro caso, quando a documentação declara que os comandos entre chaves são executados no contexto atual do shell?
{ sleep 2 | command ps -H; }