bash에서 () 대 {}를 언제 사용합니까?


74

나는 배쉬와 쉘 스크립트를 공부하고 난 사이의 차이를 알아야 (...)하고 {...}. 스크립트를 작성할 때 둘 중 하나를 어떻게 선택합니까?



3
당신은 명령 그룹화의 맥락에서만 의미합니까?
heemayl

답변:


87

명령 목록의 부작용이 현재 쉘 에 영향을 미치려면 사용 {...}
하십시오. 부작용을 폐기하려면 다음을 사용하십시오.(...)

예를 들어, 다음과 같은 경우 서브 쉘을 사용할 수 있습니다.

  • 변경하려는 $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

문서


11
수년간의 셸 개발 후 괄호를 사용하여 하위 셸에서 함수를 실행할 수 있다는 것을 몰랐습니다. 글로벌 네임 스페이스를 오염시키지 않는 것이 좋습니다!
l0b0

7
local키워드를 사용하면 오염을 제거 할 수 있습니다.
glenn jackman

2
예, 그러나 모든 변수를 로컬로 선언해야하며 코드가 복잡합니다.
l0b0

4
힌트 : 부작용이없는 함수를 원하지만 코드 편집기가 인식하지 못하는 비정상적인 함수 선언 구문을 피하려면 선언 대신 함수 호출에 괄호를 사용하십시오.pwd; (count_tmp); pwd;
Juve

2
쉘에 ... foo () (:;)는 foo () {(:;)와 같습니다. } 요청하면보고하는 방식입니다!
앤서니

23

공식 bash 문서에서 :

()

( list )

괄호 사이에 명령 목록을 배치하면 서브 쉘 환경이 작성되고 목록의 각 명령이 해당 서브 쉘에서 실행됩니다. 목록이 서브 쉘에서 실행되기 때문에 변수 지정은 서브 쉘이 완료된 후에도 유효하지 않습니다.

{}

{ list; }

중괄호 사이에 명령 목록을 배치하면 현재 쉘 컨텍스트에서 목록이 실행됩니다. 서브 쉘이 작성되지 않습니다. 세미콜론 (또는 줄 바꿈) 다음 목록이 필요합니다.


9

'{}'의 코드가 현재 스레드 / 프로세스 / 환경에서 실행되고 변경 사항이 보존되어보다 간결하게 코드가 현재 범위에서 실행됩니다.
'()'의 코드는 실행 후 버려진 bash의 별도의 자식 프로세스 내에서 실행됩니다. 이 자식 프로세스는 종종 하위 셸이라고하며 새로운 자식 같은 범위로 생각할 수 있습니다.

예를 들어 다음을 고려하십시오 ...

 ~ # { test_var=test }
 ~ # echo $test_var
 test
 ~ # ( test_var2=test2 )
 ~ # echo $test_var2

 ~ # 

'{}'이있는 첫 번째 예에서 변수는 닫는 '}'후에도 여전히 설정되지만 '()'이있는 예에서는 변수가 '()'의 범위를 벗어나지 않습니다.


4

(...)하위 셸에서 코드를 실행하는 데 사용됩니다. 사용 된 코드 {...}는 하위 셸에서 사용되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.