답변:
명령 목록의 부작용이 현재 쉘 에 영향을 미치려면 사용 {...}
하십시오. 부작용을 폐기하려면 다음을 사용하십시오.(...)
예를 들어, 다음과 같은 경우 서브 쉘을 사용할 수 있습니다.
$IFS
몇 가지 명령에 대해,하지만 변경하지 않으려는 $IFS
현재 쉘에 대해 전역cd
어딘가에 있지만 $PWD
현재 셸의을 변경하고 싶지 않습니다.괄호는 함수 정의에 사용될 수 있습니다.
정상적인 사용법 : 중괄호 : 함수 본문은 현재 쉘에서 실행됩니다. 기능이 완료된 후에도 부작용이 남아 있습니다
$ count_tmp() { cd /tmp; files=(*); echo "${#files[@]}"; }
$ pwd; count_tmp; pwd
/home/jackman
11
/tmp
$ echo "${#files[@]}"
11
특이한 사용법 : 괄호 : 함수 본문은 서브 쉘에서 실행됩니다. 서브 쉘이 종료되면 부작용이 사라집니다
$ cd ; unset files
$ count_tmp() (cd /tmp; files=(*); echo "${#files[@]}")
$ pwd; count_tmp; pwd
/home/jackman
11
/home/jackman
$ echo "${#files[@]}"
0
local
키워드를 사용하면 오염을 제거 할 수 있습니다.
pwd; (count_tmp); pwd;
'{}'의 코드가 현재 스레드 / 프로세스 / 환경에서 실행되고 변경 사항이 보존되어보다 간결하게 코드가 현재 범위에서 실행됩니다.
'()'의 코드는 실행 후 버려진 bash의 별도의 자식 프로세스 내에서 실행됩니다. 이 자식 프로세스는 종종 하위 셸이라고하며 새로운 자식 같은 범위로 생각할 수 있습니다.
예를 들어 다음을 고려하십시오 ...
~ # { test_var=test }
~ # echo $test_var
test
~ # ( test_var2=test2 )
~ # echo $test_var2
~ #
'{}'이있는 첫 번째 예에서 변수는 닫는 '}'후에도 여전히 설정되지만 '()'이있는 예에서는 변수가 '()'의 범위를 벗어나지 않습니다.