Когда использовать () против {} в bash?

Я изучаю сценарии оболочки с помощью bash, и мне нужно знать разницу между (...) и {...}. Как выбрать один из двух при написании сценария?

75
задан 7 April 2015 в 19:24

4 ответа

Если Вы хотите побочные эффекты списка команд влиять на Ваш текущий оболочка, используйте {...}
, Если Вы хотите отбросить какие-либо побочные эффекты, используйте (...)

, Например, я мог бы использовать подоболочку если я:

  • хочу измениться $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
    

Документация

106
ответ дан 7 April 2015 в 19:24

От чиновника документация удара :

()

( list )

Размещение списка команд между круглыми скобками заставляет подсреду оболочки быть созданной, и каждая из команд в списке, который будет выполняться в той подоболочке. Так как список выполняется в подоболочке, переменные присвоения не остаются в силе после того, как подоболочка завершается.

{}

{ list; }

Размещение списка команд между фигурными скобками заставляет список выполняться в текущем контексте оболочки. Никакая подоболочка не создается. Точка с запятой (или новая строка) после списка требуется.

31
ответ дан 7 April 2015 в 19:24

Код в '{}' выполнен в текущем потоке/process/environment, и изменения сохраняются, выражаясь более кратко, код выполняется в текущей области.
Код в' ()' выполняется в отдельном, дочернем процессе удара, который отбрасывается после выполнения. Этот дочерний процесс часто упоминается как подоболочка и может считаться новым, искренним объемом.

Как пример рассматривают следующее...

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

 ~ # 

Уведомление в первом примере с '{}' переменная все еще установлено даже после закрытия '} ', тогда как в примере с' ()' переменная не установлена вне объема' ()'.

10
ответ дан 7 April 2015 в 19:24

(...) используются для выполнения кода в подоболочке. Используемый bewteen {...} кода не будет использоваться в подоболочке.

6
ответ дан 7 April 2015 в 19:24

Другие вопросы по тегам:

Похожие вопросы: