Nach dieser , eine Liste von Befehlen zwischen geschweiften Klammern Platzieren bewirkt , dass die Liste in dem aktuellen Shell Kontext ausgeführt werden. Es wird keine Subshell erstellt .
Verwenden Sie ps
, um dies in Aktion zu sehen
Dies ist die Prozesshierarchie für eine Prozesspipeline, die direkt in der Befehlszeile ausgeführt wird. 4398 ist die PID für die Login-Shell:
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
Es folgt nun die Prozesshierarchie für eine Prozesspipeline zwischen geschweiften Klammern, die direkt in der Befehlszeile ausgeführt wird. 4398 ist die PID für die Login-Shell. Dies ähnelt der obigen Hierarchie, um zu beweisen, dass alles im aktuellen Shell-Kontext ausgeführt wird :
{ 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
Dies ist nun die Prozesshierarchie, wenn das sleep
in der Pipeline befindliche Element selbst in geschweiften Klammern steht (also insgesamt zwei Ebenen von Klammern).
{ { 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
Warum muss bash
eine Subshell erstellt werden, um sleep
im dritten Fall ausgeführt zu werden, wenn in der Dokumentation angegeben ist, dass Befehle zwischen geschweiften Klammern im aktuellen Shell-Kontext ausgeführt werden?
{ sleep 2 | command ps -H; }