In base a ciò , posizionare un elenco di comandi tra parentesi graffe fa sì che l'elenco venga eseguito nel contesto della shell corrente. Non viene creata alcuna subshell .
Usando ps
per vedere questo in azione
Questa è la gerarchia dei processi per una pipeline del processo eseguita direttamente sulla riga di comando. 4398 è il PID per la shell di accesso:
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
Ora segue la gerarchia dei processi per una pipeline del processo tra parentesi graffe eseguita direttamente sulla riga di comando. 4398 è il PID per la shell di accesso. È simile alla gerarchia sopra che dimostra che tutto viene eseguito nel contesto della shell corrente :
{ 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
Ora, questa è la gerarchia dei processi quando la stessa sleep
nella pipeline viene posizionata all'interno di parentesi graffe (quindi due livelli di parentesi graffe in tutto)
{ { 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
Perché bash
è necessario creare una subshell da eseguire sleep
nel terzo caso quando la documentazione afferma che i comandi tra parentesi graffe vengono eseguiti nel contesto della shell corrente?
{ sleep 2 | command ps -H; }