Bash
按 {} vs () 分組執行命令集
我讀了這篇文章:
{}
我理解答案,但是可以選擇通過其中一個或make來執行一組命令()
來創建這篇文章。如果存在場景:何時強制使用
{}
——()
反之亦然——為什麼?
兩者的區別在於
()
創建了一個子shell。例如,你可以試試這個:cd $HOME ; ls
這些命令的輸出將列出您為目前使用者擁有的文件和目錄。
現在,使用 subshell,你可以試試這個:
( cd / ; ls ; ) ; ls
我們在這裡所做的是創建一個子shell (cd / ; ls)用於將目前目錄更改為
/
然後列出其文件和目錄。之後,一旦子shell結束,我們會列出目前目錄的文件,但這不是/
目錄,在這種情況下,目前目錄是使用者主文件夾($HOME)現在,如果您更改
()
for{}
行為將有所不同。{ cd / ; ls ; } ; ls
在這裡,輸出將列出
/
兩個ls
命令的目錄中的文件和目錄。讓我們看看另一個例子:
( echo Subshell is $BASH_SUBSHELL ; ) ; echo Subshell is $BASH_SUBSHELL
這些命令將分別回顯:
Subshell is 1 Subshell is 0
如您所見,使用環境變數
$BASH_SUBSHELL
可以獲得目前的子shell級別,因此,當您使用更改時(您可以根據需要使用嵌套子shell)()
。BASH_SUBSHELL
還有另一個例子:
( vartmp=10 ; echo var is $vartmp ; ) ; echo var is $vartmp
在這種情況下,輸出將是:
var is 10 var is
如您所見,在第二行中
$vartmp
是空的。這是正確的,因為當子shell 以執行結束時,所有變數、函式和一些更改(如修改環境變數)都將被清除。因此,當您要顯示$vartmp
子shell 結束後,輸出將為空,因為該變數不存在。您可以嘗試將這些命令中的 to 更改為檢查不同的行為
()
。{}