터미널에서 괄호와 중괄호의 차이점은 무엇입니까? [복사]

터미널에서 괄호와 중괄호의 차이점은 무엇입니까? [복사]
( du /etc; du /var; ) > tmp.txt

{ du /etc; du /var; } > tmp.txt

()와 {} 사이에 차이가 있나요?

tmp.txt의 출력은 정확히 동일한 것 같은데 여기에 뭔가 빠진 것이 있는지 궁금합니다.

답변1

괄호를 사용하면 명령이 하위 쉘에서 실행됩니다.

그룹 명령을 함께 중괄호로 묶지만 서브셸 내에서는 묶지 않습니다.

귀하의 예가 부작용을 사용하지 않는다는 점을 감안할 때 둘 사이에는 실제 차이가 없습니다. 쉘 변수를 설정하거나 수정하는 등의 부작용이 있는 경우에는 서브쉘에 적용된 부작용이 서브쉘이 종료되면 잊어버리기 때문에 차이가 있습니다.

"부작용"을 이해하려면 다음 예를 참조하세요.

괄호를 사용하세요 ():

v="test"; 
( echo $v; v="modified"; echo $v; ); 
echo $v;

# output:
#   test
#   modified
#   test

중괄호를 사용하세요 {}.

v="test"; 
{ echo $v; v="modified"; echo $v; }; 
echo $v;

# output:
#   test
#   modified
#   modified

그러나 서로 다른 셸 구현의 동작을 자세히 살펴보고 비교하면 혼란스러워집니다.

예를 들어, Bourne Shell은 I/O 리디렉션을 방지하기 위해 서브셸에서 그룹화된 명령을 실행하고, ksh93은 새 매개변수의 임시 복사본을 생성하여 가상 서브셸 동작을 구현함으로써 서브셸 사용을 방지합니다. 이것이 항상 100% 올바른지 여부는 명확하지 않습니다. ksh93 Version M 1993-12-28 s+2009년 현재 $(...)가 잘못 구현되었고 $(alias a=b)가 메인 쉘에 영향을 미쳤습니다.

따라서 일반적으로 특정 측면에 관심이 있다면 주의하여 쉘의 실제 동작을 확인하십시오.

관련 정보