2014-10-29 101 views
3

爲什麼

${username=`whoami`} 

拋出一個錯誤,而

: ${username=`whoami`} 

中不進行任何不良影響的轉讓?

據我所知:是一個佔位符。這個命令有什麼用處?這是相當於運行: 'whoami'


作爲參考,前者的用法被稱爲#3,而新的用法被稱爲#4。

+0

':''是TRUE',它不與行的其餘部分做任何事情@'#4'。簡而言之:如果'$ {username ='whoami'}'不會產生你想運行的函數/命令的名字,不要像'#3'那樣運行它。不是'$()'是一個全新的subshel​​l_,這就是爲什麼你不能使用那裏使用的任何變量,因爲它們在shell結束後立即消失。 – Wrikken 2014-10-29 16:49:57

+1

......如果你唯一突出的問題是#3和#4的不同之處,我會刪除所有其他的東西(而且真的,那時你根本不需要列表)。 – 2014-10-29 17:08:58

+0

完成。在評論中保留對引用的列表 – imagineerThat 2014-10-29 17:12:21

回答

6
${parameter=value} 

做了兩兩件事:它分配給value如果parameterparameter尚未設置的副作用,並擴展到的parameter完成時的價值的直接影響。

的錯誤是那直接作用的結果:當你在自己的行運行

${user=`whoami`} 

...,那麼擴展到,並嘗試運行的whoami輸出爲命令。假設用戶變量先前未分配給,並且whoami的輸出是james;它會嘗試運行命令james,這會引發錯誤。

相比之下,運行

: ${user=`whoami`} 

...首先執行的副作用(做一個分配user如果user尚未設置),然後運行:

: james 

。 ..沒有效果,所以只執行(賦值)的副作用。

+0

我不認爲這很明顯,爲什麼你用':='替換,所以我發表了評論。 – imagineerThat 2014-10-29 17:30:54

+0

':'是'true'的快捷方式。 – 2014-10-29 17:31:13

+0

@EdouardThiel,...好。在70年代的Bourne shell中,':'是內建的,而'true'則運行'/ bin/true',所以實際上它們之間存在效率差異。可以說,如果一個人正在編寫能夠運行在過時平臺上的代碼,那麼仍然需要記住。 – 2014-10-29 17:34:40

3

在#3中,根據bash手冊頁,您試圖執行whoami命令輸出,即如果whoami命令輸出是「peter」,#3意味着調用「peter」命令。此外,「用戶名」變量被賦值爲「彼得」

bash的手冊描述${parameter:=word}如下:

分配默認值。如果參數未設置或爲空,則將單詞的擴展分配給參數。然後用參數的值代替。這種方式可能不會分配位置參數和特殊參數。

同樣地,對於:命令 -

無影響;該命令除了擴展參數和執行任何指定的重定向之外什麼都不做。返回零退出代碼。

相關問題