나는 이 기사를 읽었습니다:
답변을 이해하지만 일련의 명령을 실행 {}
하여 ()
이 게시물을 작성하는 옵션이 있습니다.
시나리오가 있는 경우: 언제 필수이며 {}
그 ()
반대의 경우도 마찬가지이며 그 이유는 무엇입니까?
답변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
변수가 존재하지 않기 때문에 출력이 비어 있게 됩니다.
()
이 명령에서 를 변경하여 {}
다른 동작을 확인할 수 있습니다.