在 bash 中建立子 shell 有哪些方法?

在 bash 中建立子 shell 有哪些方法?

目前我知道的主要有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 programls | wclswc

有趣的是,將其包含在管道中可能會導致一個內建的 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

不影響主殼。

相關內容