簡體   English   中英

如果 bash 管道命令在 subshell 中運行,為什么 echo 命令可以訪問未導出的變量?

[英]If bash pipeline commands run in subshell, why echo command can access the non-exported variables?

Bash 手冊說“管道中的每個命令都作為單獨的進程(即,在子外殼中)執行”。 我測試了兩個簡單的命令。

場景 1

cd /home/work
str=hello
echo $str | tee a.log

它輸出:

hello

似乎 echo 命令沒有在子 shell 中執行,因為它可以訪問未導出的變量$str

場景 2

cd /home/work
cd src | pwd
pwd

它輸出:

/home/work

看起來 cd 命令是在子 shell 中執行的,因為它不會影響原始 shello 的工作目錄。

誰能解釋為什么行為不一致?

誰能解釋為什么行為不一致?

好吧,因為這就是它的設計方式。 “子shell”繼承了整個上下文,而不僅僅是導出的變量。

Bash 手冊說“管道中的每個命令都作為單獨的進程執行(即在子外殼中)”

Bsah 手冊可在此處獲得 你提到的那句話字面上有一個解開謎團的鏈接:

管道中的每個命令都在其自己的子 shell 中執行,這是一個單獨的進程(請參閱命令執行環境)。

然后您可以從中檢查“命令執行環境”(強調我的):

shell有一個執行環境,包括以下內容:

  • ...
  • shell 通過變量賦值設置的參數...
  • ...

...

命令替換、用括號分組的命令和異步命令在與 shell 環境重復的子 shell 環境中調用,...

子shell 擁有所有環境(好吧,除了陷阱)。 另一方面命令:

當要執行除內置命令或 shell function 以外的簡單命令時,將在包含以下內容的單獨執行環境中調用它。 ……

  • ...
  • shell 標記為導出的變量和函數,...

如果 bash 管道命令在 subshell 中運行,為什么 echo 命令可以訪問未導出的變量?

因為子shell繼承了父環境,包括所有未導出的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM