Se você quiser que os efeitos colaterais da lista de comandos afetem seu shell atual , use {...}
Se você quiser descartar efeitos colaterais, use (...)
Por exemplo, eu posso usar um subshell se eu:
- deseja alterar
$IFS
para alguns comandos, mas não quero alterar$IFS
globalmente para o shell atual -
cd
em algum lugar, mas não quero alterar o$PWD
do shell atual
Vale a pena observar que os parênteses podem ser usados em uma definição de função:
-
uso normal: chaves: corpo da função é executado no shell atual; efeitos colaterais permanecem após a conclusão da função
$ count_tmp() { cd /tmp; files=(*); echo "${#files[@]}"; } $ pwd; count_tmp; pwd /home/jackman 11 /tmp $ echo "${#files[@]}" 11
-
uso incomum: parênteses: corpo da função é executado em um subshell; efeitos colaterais desaparecem quando a subshell sai
$ cd ; unset files $ count_tmp() (cd /tmp; files=(*); echo "${#files[@]}") $ pwd; count_tmp; pwd /home/jackman 11 /home/jackman $ echo "${#files[@]}" 0