Shell-Script

將命令分配給沒有別名的變數

  • June 28, 2016

我只是偶然發現在 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

我正在使用這個版本的 bashbash --version GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

我研究了stackexchangetldp abs,但沒有發現我們可以這樣做。那麼這是 bash 的新功能還是被忽略的東西?這被認為是命令替換嗎?

在互動式使用中,shell 從終端設備讀取輸入行。輸入一行後,通過拆分為標記(單詞和運算符)對其進行*解析。*然後以特定順序擴展或解析標記或單詞。

注意:一般來說,最好參考項目文件或行業規範等規範資訊源,而不是高級 Bash 腳本指南、線上教程、書籍或什至 Stack Exchange 等二手資源:)。這種二手資料對於用更簡單的語言介紹和解釋概念很有用,但它們通常不打算完整或替代官方文件。二手來源中的資訊也可能已過時。

在這種情況下,解析簡單命令的 POSIX 規範指出

  1. 不是變數賦值或重定向的詞應被擴展。如果擴展後仍有任何欄位,則第一個欄位應視為命令名稱,其餘欄位是命令的參數。

簡單命令擴展的Bash 手冊部分還指出

  1. 不是變數賦值或重定向的詞被擴展(參見 Shell 擴展)。如果展開後還剩下任何單詞,則將第一個單詞作為命令的名稱,其餘單詞作為參數。

這不是命令替換,而是變數替換。您不是將命令分配給變數,而是分配字元串。該命令在您使用變數時執行,而不是在賦值時執行。

g=date將字元串儲存date在變數中g。如果然後執行echo "$g",這將列印 的值g,即date(後跟換行符),因為 的值作為第一個參數g傳遞給命令。echo如果您執行"$g",這會將字元串date放在命令的第一個位置,因此它是命令名稱。

隨著$jj,第二個因素開始發揮作用。因為變數擴展在引號之外,所以“split+glob 運算符”應用於該值。在這種情況下,這意味著 的值jj被分成兩個以空格分隔的單詞。因此,該詞ping以命令位置結束,並且該詞yahoo.com是第一個參數。

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