{} 및 ()를 사용하여 그룹의 명령 세트를 실행합니다.

{} 및 ()를 사용하여 그룹의 명령 세트를 실행합니다.

나는 이 기사를 읽었습니다:

답변을 이해하지만 일련의 명령을 실행 {}하여 ()이 게시물을 작성하는 옵션이 있습니다.

시나리오가 있는 경우: 언제 필수이며 {}()반대의 경우도 마찬가지이며 그 이유는 무엇입니까?

답변1

둘의 차이점은 ()서브쉘을 생성한다는 것입니다. 예를 들어 다음을 시도해 볼 수 있습니다.

cd $HOME ; ls

이 명령의 출력에는 현재 사용자가 소유한 파일과 디렉터리가 나열됩니다.

이제 서브쉘을 사용하여 다음을 시도해 볼 수 있습니다.

( cd / ; ls ; ) ; ls

여기서 우리가 하는 일은 서브쉘을 만드는 것입니다.(CD / ; ls)현재 디렉터리를 변경한 /다음 해당 파일과 디렉터리를 나열합니다. 그 후 서브쉘이 끝나면 현재 디렉터리의 파일을 나열하지만 이는 /디렉터리가 아닙니다. 이 경우 현재 디렉터리는 사용자의 홈 폴더($HOME)

()이제 행동을 바꾸면 {}달라집니다.

{ cd / ; ls ; } ; ls

여기서 출력에는 두 명령 /모두 ls에 대한 디렉터리의 파일과 디렉터리가 나열됩니다.

또 다른 예를 살펴보겠습니다.

( echo Subshell is $BASH_SUBSHELL ; ) ; echo Subshell is $BASH_SUBSHELL

이러한 명령은 각각 다음과 같이 에코됩니다.

Subshell is 1
Subshell is 0

보시다시피 환경 변수를 사용하면 현재 하위 쉘 수준을 얻을 수 있으므로 변경 사항을 $BASH_SUBSHELL사용할 때 (원하는 경우 중첩된 하위 쉘을 사용할 수 있습니다).()BASH_SUBSHELL

또 다른 예는 다음과 같습니다.

( vartmp=10 ; echo var is $vartmp ; ) ; echo var is $vartmp

이 경우 출력은 다음과 같습니다.

var is 10
var is

보시다시피 두 번째 행 $vartmp은 비어 있습니다. 이는 서브셸 실행이 끝나면 모든 변수, 함수 및 일부 변경 사항(예: 환경 변수 수정)이 지워지기 때문에 정확합니다. 따라서 서브쉘이 종료된 후 내용을 표시하려는 경우 $vartmp변수가 존재하지 않기 때문에 출력이 비어 있게 됩니다.

()이 명령에서 를 변경하여 {}다른 동작을 확인할 수 있습니다.

관련 정보