目前我知道的主要有2種方式:
明確地: 將指令列表括在括號中
隱含地:管道中的每個命令
是否有更多方法(顯式或隱式)在 bash 中建立子 shell?
答案1
從man bash
:
- 如果指令由控制運算子終止
&
,則 shell 會在子 shell 的背景執行該指令。 shell 不等待指令完成,回傳狀態為 0。 - 協進程是前面有保留字的 shell 指令
coproc
。
協進程在子 shell 中非同步執行,就像命令已使用 & 控制運算子終止一樣 - Shell 內建
complete
指令:當使用-C command
選項呼叫時,command
在子 shell 環境中執行,其輸出用作可能的補全。 - 命令替換、用括號分組的命令以及非同步命令在與 shell 環境重複的子 shell 環境中調用
答案2
這取決於您所說的“子shell”是什麼意思。您可能錯過了“管道中的每個命令”要點中的要點。
任何時候你跑步任何(外部)程式(即腳本或二進位可執行文件,與 shell 內建程式相反),除非您使用,否則您將在子進程(或多個進程)中運行它。 shell 分叉並執行程式。 與單獨執行操作一樣,不會建立子 shell 。exec program
ls | wc
ls
wc
有趣的是,將其包含在管道中可能會導致一個內建的 shell在子 shell 中運行。考慮這個例子:
$ 讀 v 貓 # 這是使用者輸入的內容。 $回顯“$v” 貓 $ 迴音美洲獅 |讀 v $回顯“$v” 貓
第二個read v
命令在子 shell 中運行,因為它是echo cougar | read v
管道的一部分。因此,該值cougar
丟失,並$v
保留其最初的值。
同樣,像這樣的命令
$ echo foo | cd /
$ cd / | cat
$ echo foo | exit
$ exit | cat
不影響主殼。