В соответствии с этим , размещение списка команд между фигурными скобками приводит к тому, что список выполняется в текущем контексте оболочки. Никакая подоболочка не создана .
Используя, ps
чтобы увидеть это в действии
Это иерархия процессов для конвейера процессов, выполняемого непосредственно в командной строке. 4398 - это PID для оболочки входа в систему:
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
Теперь следует иерархия процессов для конвейера процессов между фигурными скобками, выполняемыми непосредственно в командной строке. 4398 - это PID для оболочки входа в систему. Это похоже на иерархию выше, доказывающую, что все выполняется в текущем контексте оболочки :
{ 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
Теперь это иерархия процессов, когда сам sleep
конвейер помещается в фигурные скобки (так что всего два уровня скобок)
{ { 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
Почему bash
нужно создавать подоболочку для запуска sleep
в третьем случае, когда в документации говорится, что команды между фигурными скобками выполняются в текущем контексте оболочки?
{ sleep 2 | command ps -H; }