Command-Substitution

什麼是 shell 中的命令替換?

  • January 18, 2021

我將 Ubuntu 16.04 與 Bash 一起使用,我試圖在Wikipediaherehere中閱讀,但我無法理解 shell 腳本中“命令替換”的含義,尤其是在 Bash 中,如下所示:

$(command)

或者

`command`

這個詞的含義是什麼?

編輯:當我第一次發布這個問題時,我已經知道了替換的純概念以及變數替換的 Linux 概念(通過執行用它的值替換變數),但是我仍然錯過了文件中這個 shell 功能的目的原因或一組原因。


問題鎖定後我的回答

命令替換是一種具有專用語法的操作,既可以執行命令,又可以通過變數保存(儲存)該命令的輸出以供以後使用。

一個例子date

thedate="$(date)"

然後我們可以使用以下命令列印結果printf

printf 'The date is %s\n' "$thedate"
  1. 命令替換語法是$().
  2. 命令本身是date.
  3. 結合我們得到$(date)的,它的值是替換的結果(我們可以在執行後得到)。
  4. 我們將該值保存在變數 中$thedate,以備後用。
  5. printf根據上面的命令,我們用 顯示變數保存的輸出值。

注意:\ninprintf是換行符。

“命令替換”是 shell 語言功能的名稱,它允許您執行命令並讓該命令的輸出替換(替換)命令的文本。

Shell 語言沒有其他功能可以讓您這樣做。

命令替換,即整個$(...)表達式,被它的輸出替換,這是命令替換的主要用途。

命令替換執行的命令在子 shell 中執行,這意味著它有自己的環境,不會影響父 shell 的環境。

不過,並非所有子 shell 執行都是命令替換(請參閱末尾的更多範例)。

顯示在子 shell 中執行命令替換的範例:

$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123

在這裡,變數s被設置為字元串123。在下一行,echo在包含命令替換結果的字元串上呼叫。命令替換設置s為字元串world並回顯該字元串。該字元串world是*命令替換中命令的輸出,*因此,如果在 下執行set -x,我們會看到上面的第二行將擴展為echo 'hello world',這會hello world在終端上產生:

$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world

(在跟踪輸出中的每個級別的命令替換子外殼中bash添加額外級別的+提示,其他外殼可能不會這樣做)

最後,我們展示了命令替換中的命令是在它自己的子 shell 中執行的,因為它不影響s呼叫 shell 中的值(的值s仍然是123,不是world)。

在其他情況下,命令在子 shell 中執行,例如

echo 'hello' | read message

bash中,除非您設置lastpipe選項(僅在非互動式實例中),否則將read在子 shell 中執行,這意味著$message在父 shell 中不會更改,即echo "$message"在上述命令之後執行將回顯一個空字元串(或任何值$message以前)。

程序替換bash也在子shell中執行:

cat < <( echo 'hello world' )

這也不同於命令替換。

引用自:https://unix.stackexchange.com/questions/440088