Bash

按 {} vs () 分組執行命令集

  • May 30, 2022

我讀了這篇文章:

{}我理解答案,但是可以選擇通過其中一個或make來執行一組命令()來創建這篇文章。

如果存在場景:何時強制使用{}——()反之亦然——為什麼?

兩者的區別在於()創建了一個子shell。例如,你可以試試這個:

cd $HOME ; ls

這些命令的輸出將列出您為目前使用者擁有的文件和目錄。

現在,使用 subshel​​l,你可以試試這個:

( 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 更改為檢查不同的行為(){}

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