簡體   English   中英

為什么在反引號內執行的命令不會影響當前的shell?

[英]Why commands executed inside backticks doesn't affect the current shell?

我知道反引號用於命令替換,但為什么這些命令不會影響當前的shell。 例如,執行以下命令會將當前工作目錄更改為我以前的目錄。

$> cd -

另一方面,以下命令會顯示我以前工作目錄的內容,但不會更改它。

$> ls `cd -`

同樣,可能還有其他例子

$>ls `PATH=""`

在這里,它確實顯示了我的工作目錄的內容,但PATH變量沒有被更改。

反引號內的命令/表達式是否在子shell中執行?

它在某些編程語言中的工作方式與eval(exp)類似:

它在外部作用域中進行評估,該作用域是當前作用域的“子”(也稱為子shell環境) - 因此它“知道”當前env中的所有變量,並僅返回結果 - 因此,不能導致對當前環境的任何副作用。

反引號是舊式的,應該使用$()代替。 要閱讀有關命令替換的更多信息,請參閱文檔

子shell有不同的$BASHPID的-它們fork ED掉原來的殼。

$ echo $BASHPID; echo "`echo $BASHPID`"; echo $BASHPID

當您在Unix上進行分支時,子進程寫入時復制會從父進程繼承(或者只是通過急切復制繼承)數據。 子進程(子shell)可以讀取所有變量,但寫入任何變量將為子進程創建一個私有副本(或者如果內核不執行寫時復制操作,它已經有自己的副本) 。

暫無
暫無

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

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