( 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)가 메인 쉘에 영향을 미쳤습니다.
따라서 일반적으로 특정 측면에 관심이 있다면 주의하여 쉘의 실제 동작을 확인하십시오.