將命令分配給沒有別名的變數
我只是偶然發現在 bash 中,我們可以在不使用
alias
.g=date $g Mon Jun 27 13:00:40 MYT 2016
這樣可行。這是另一個例子:
jj="ping yahoo.com" $jj PING yahoo.com (98.138.253.109) 56(84) bytes of data. 64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=1 ttl=41 time=347 ms 64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=2 ttl=41 time=345 ms 64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=3 ttl=41 time=345 ms
我正在使用這個版本的 bash
bash --version GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
我研究了stackexchange和tldp abs,但沒有發現我們可以這樣做。那麼這是 bash 的新功能還是被忽略的東西?這被認為是命令替換嗎?
在互動式使用中,shell 從終端設備讀取輸入行。輸入一行後,通過拆分為標記(單詞和運算符)對其進行*解析。*然後以特定順序擴展或解析標記或單詞。
注意:一般來說,最好參考項目文件或行業規範等規範資訊源,而不是高級 Bash 腳本指南、線上教程、書籍或什至 Stack Exchange 等二手資源:)。這種二手資料對於用更簡單的語言介紹和解釋概念很有用,但它們通常不打算完整或替代官方文件。二手來源中的資訊也可能已過時。
在這種情況下,解析簡單命令的 POSIX 規範指出
- 不是變數賦值或重定向的詞應被擴展。如果擴展後仍有任何欄位,則第一個欄位應視為命令名稱,其餘欄位是命令的參數。
簡單命令擴展的Bash 手冊部分還指出
- 不是變數賦值或重定向的詞被擴展(參見 Shell 擴展)。如果展開後還剩下任何單詞,則將第一個單詞作為命令的名稱,其餘單詞作為參數。
這不是命令替換,而是變數替換。您不是將命令分配給變數,而是分配字元串。該命令在您使用變數時執行,而不是在賦值時執行。
g=date
將字元串儲存date
在變數中g
。如果然後執行echo "$g"
,這將列印 的值g
,即date
(後跟換行符),因為 的值作為第一個參數g
傳遞給命令。echo
如果您執行"$g"
,這會將字元串date
放在命令的第一個位置,因此它是命令名稱。隨著
$jj
,第二個因素開始發揮作用。因為變數擴展在引號之外,所以“split+glob 運算符”應用於該值。在這種情況下,這意味著 的值jj
被分成兩個以空格分隔的單詞。因此,該詞ping
以命令位置結束,並且該詞yahoo.com
是第一個參數。