Я изучаю сценарии оболочки с помощью bash, и мне нужно знать разницу между (...)
и {...}
. Как выбрать один из двух при написании сценария?
Если Вы хотите побочные эффекты списка команд влиять на Ваш текущий оболочка, используйте {...}
, Если Вы хотите отбросить какие-либо побочные эффекты, используйте (...)
, Например, я мог бы использовать подоболочку если я:
$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
От чиновника документация удара :
()
( list )
Размещение списка команд между круглыми скобками заставляет подсреду оболочки быть созданной, и каждая из команд в списке, который будет выполняться в той подоболочке. Так как список выполняется в подоболочке, переменные присвоения не остаются в силе после того, как подоболочка завершается.
{}
{ list; }
Размещение списка команд между фигурными скобками заставляет список выполняться в текущем контексте оболочки. Никакая подоболочка не создается. Точка с запятой (или новая строка) после списка требуется.
Код в '{}' выполнен в текущем потоке/process/environment, и изменения сохраняются, выражаясь более кратко, код выполняется в текущей области.
Код в' ()' выполняется в отдельном, дочернем процессе удара, который отбрасывается после выполнения. Этот дочерний процесс часто упоминается как подоболочка и может считаться новым, искренним объемом.
Как пример рассматривают следующее...
~ # { test_var=test }
~ # echo $test_var
test
~ # ( test_var2=test2 )
~ # echo $test_var2
~ #
Уведомление в первом примере с '{}' переменная все еще установлено даже после закрытия '} ', тогда как в примере с' ()' переменная не установлена вне объема' ()'.
(...)
используются для выполнения кода в подоболочке. Используемый bewteen {...}
кода не будет использоваться в подоболочке.