什麼是 shell 中的命令替換?
我將 Ubuntu 16.04 與 Bash 一起使用,我試圖在Wikipedia、here和here中閱讀,但我無法理解 shell 腳本中“命令替換”的含義,尤其是在 Bash 中,如下所示:
$(command)
或者
`command`
這個詞的含義是什麼?
編輯:當我第一次發布這個問題時,我已經知道了替換的純概念以及變數替換的 Linux 概念(通過執行用它的值替換變數),但是我仍然錯過了文件中這個 shell 功能的目的原因或一組原因。
問題鎖定後我的回答
命令替換是一種具有專用語法的操作,既可以執行命令,又可以通過變數保存(儲存)該命令的輸出以供以後使用。
一個例子
date
:thedate="$(date)"
然後我們可以使用以下命令列印結果
printf
:printf 'The date is %s\n' "$thedate"
- 命令替換語法是
$()
.- 命令本身是
date
.- 結合我們得到
$(date)
的,它的值是替換的結果(我們可以在執行後得到)。- 我們將該值保存在變數 中
$thedate
,以備後用。printf
根據上面的命令,我們用 顯示變數保存的輸出值。注意:
\n
inprintf
是換行符。
“命令替換”是 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' )
這也不同於命令替換。