爲什麼
${username=`whoami`}
拋出一個錯誤,而
: ${username=`whoami`}
中不進行任何不良影響的轉讓?
據我所知:
是一個佔位符。這個命令有什麼用處?這是相當於運行: 'whoami'
?
作爲參考,前者的用法被稱爲#3,而新的用法被稱爲#4。
爲什麼
${username=`whoami`}
拋出一個錯誤,而
: ${username=`whoami`}
中不進行任何不良影響的轉讓?
據我所知:
是一個佔位符。這個命令有什麼用處?這是相當於運行: 'whoami'
?
作爲參考,前者的用法被稱爲#3,而新的用法被稱爲#4。
${parameter=value}
做了兩兩件事:它分配給value
如果parameter
parameter
尚未設置的副作用,並擴展到的parameter
完成時的價值的直接影響。
的錯誤是那直接作用的結果:當你在自己的行運行
${user=`whoami`}
...,那麼擴展到,並嘗試運行的whoami
輸出爲命令。假設用戶變量先前未分配給,並且whoami
的輸出是james
;它會嘗試運行命令james
,這會引發錯誤。
相比之下,運行
: ${user=`whoami`}
...首先執行的副作用(做一個分配user
如果user
尚未設置),然後運行:
: james
。 ..沒有效果,所以只執行(賦值)的副作用。
我不認爲這很明顯,爲什麼你用':='替換,所以我發表了評論。 – imagineerThat 2014-10-29 17:30:54
':'是'true'的快捷方式。 – 2014-10-29 17:31:13
@EdouardThiel,...好。在70年代的Bourne shell中,':'是內建的,而'true'則運行'/ bin/true',所以實際上它們之間存在效率差異。可以說,如果一個人正在編寫能夠運行在過時平臺上的代碼,那麼仍然需要記住。 – 2014-10-29 17:34:40
在#3中,根據bash手冊頁,您試圖執行whoami命令輸出,即如果whoami命令輸出是「peter」,#3意味着調用「peter」命令。此外,「用戶名」變量被賦值爲「彼得」
bash的手冊描述${parameter:=word}
如下:
分配默認值。如果參數未設置或爲空,則將單詞的擴展分配給參數。然後用參數的值代替。這種方式可能不會分配位置參數和特殊參數。
同樣地,對於:
命令 -
無影響;該命令除了擴展參數和執行任何指定的重定向之外什麼都不做。返回零退出代碼。
':''是TRUE',它不與行的其餘部分做任何事情@'#4'。簡而言之:如果'$ {username ='whoami'}'不會產生你想運行的函數/命令的名字,不要像'#3'那樣運行它。不是'$()'是一個全新的subshell_,這就是爲什麼你不能使用那裏使用的任何變量,因爲它們在shell結束後立即消失。 – Wrikken 2014-10-29 16:49:57
......如果你唯一突出的問題是#3和#4的不同之處,我會刪除所有其他的東西(而且真的,那時你根本不需要列表)。 – 2014-10-29 17:08:58
完成。在評論中保留對引用的列表 – imagineerThat 2014-10-29 17:12:21