通常情況下,Bash函數定義使用大括號括身體:bash的功能:封閉體在括號與括號
foo()
{
...
}
在shell腳本工作今天在企業廣泛應用的功能,我我們遇到了與調用函數中調用名稱相同的變量問題,即那些變量是相同的。然後我發現可以通過在本地函數中定義局部變量來防止這種情況:local var=xyz
。
然後,在某些時候,我發現在它被解釋說,它只是爲有效使用括號像這樣來定義一個函數線程(Defining bash function body using parenthesis instead of braces):
foo()
(
...
)
這樣做的效果是函數體是在一個子shell中執行的,這有利於函數具有自己的變量作用域,這使我可以在沒有本地的情況下定義它們。由於具有功能本地範圍似乎使更多的意義,並要安全得多比所有變量是全球性的,我馬上問自己:
- 爲什麼默認情況下用於封閉函數體,而不是括號的括號?
不過,我很快也發現了一個重大的缺點在子shell執行的功能,特別是從函數內退出腳本不工作了,而不是強迫我沿着返回狀態工作整個調用樹(在嵌套函數的情況下)。這使我這個跟進的問題:
- 是否有其他重大缺點(*)使用括號,而不是括號(這或許可以解釋爲什麼括號似乎是優選)?
(*)我知道(在異常相關的討論,我在一段時間偶然),一些將明確使用錯誤狀態認爲是比能夠從任何地方退出好得多,但我更喜歡後者。
顯然這兩種款式都有其優點和缺點。所以我希望你們中的一些有經驗的bash用戶可以給我一些一般性的指導:
- 我什麼時候用大括號括函數體,當是最好切換到括號?
編輯:從答案
謝謝您的回答,我的頭現在關於這更清楚的一個位外賣店。所以,我從答案帶走的是:
固守傳統的花括號,如果僅僅是爲了不混淆潛在的其他用戶/開發者的腳本(甚至使用大括號如果整個身體包裹在括號內)。
花括號的唯一真正的缺點是父範圍中的任何變量都可以改變,儘管在某些情況下這可能是一個優點。通過聲明變量爲
local
可以很容易地避免這種情況。另一方面,使用括號可能會產生一些嚴重的不良影響,例如搞亂退出,導致殺死腳本和隔離變量作用域等問題。
您的編輯是一個很好的包裝! – fedorqui