[英]Command substitution and field splitting in shell
我理解為什么以下命令失敗。
$ a=foo bar
-bash: bar: command not found
它嘗試首先執行a=foo
然后執行失敗的bar
,因為沒有名為bar
命令。
但我不明白為什么會這樣。 我期待以下命令也失敗。
$ a=$(echo foo bar)
$ echo "$a"
foo bar
根據http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05,首先發生命令替換,然后發生字段拆分。
2.6 Word擴展
本節介紹對單詞執行的各種擴展。 並非所有擴展都在每個單詞上執行,如以下部分所述。
在單個單詞中出現的Tilde擴展,參數擴展,命令替換,算術擴展和引用刪除擴展為單個字段。 只有字段拆分或路徑名擴展才能從單個字創建多個字段。 此規則的唯一例外是在雙引號內擴展特殊參數“@”,如特殊參數中所述。
詞擴展的順序如下:
應始終執行Tilde擴展(參見Tilde Expansion),參數擴展(參見參數擴展),命令替換(參見命令替換)和算術擴展(參見算術擴展)。 請參見令牌識別中的第5項。
除非IFS為空,否則應對步驟1生成的字段部分執行字段拆分(請參見字段拆分)。
除非set -f生效,否則應執行路徑名擴展(請參閱路徑名擴展)。
報價刪除(參見報價刪除)應始終執行。
所以在命令替換后,
a=$(echo foo bar)
變
a=foo bar
然后在字段拆分后,首先執行a=foo
,然后執行bar
,然后我們應該有相同的錯誤,即bar: command not found
。 為什么a=$(echo foo bar)
工作正常呢?
答案是2.9.1簡單命令我相信。
具體點1和4:
1.根據Shell語法規則識別為變量賦值或重定向的單詞將保存,以便在步驟3和4中進行處理。
4.在分配值之前,應擴展每個變量賦值以進行波形擴展,參數擴展,命令替換,算術擴展和引用刪除。
或者在3.4 Shell參數中的bash參考手冊中:
可以通過表單的語句分配變量
名稱= [值]
如果未給出值,則為變量分配空字符串。 所有值都經過波形擴展,參數和變量擴展,命令替換,算術擴展和報價刪除(詳見下文)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.