Se o objetivo for apenas manipular a configuração ENV
antes de executar um processo e evitar afetar o shell atual, então exec
ing o executável bash
pode não ser a maneira mais eficiente de fazer isso.
( . /dev/fd/4 && echo "$i" ) 4<<\SCRIPT
i='i is set here in the subshell'
#END
SCRIPT
echo ${i?but i isnt set here because it was set in the subshell}
OUTPUT
i is set here in the subshell
sh: line 5: i: but i isnt set here because it was set in the subshell
É claro que você pode substituir o link do descritor de arquivo do heredoc por um arquivo normal - eu o usei apenas para demonstrá-lo.
Mas se você fizer exec
um processo externo - como bash
ou qualquer outro - em vez de um shell embutido, você não precisará da subshell.
one=1 two=2 \
bash -c 'echo "${cmd=This is command #}$one"
echo "${cmd}$two"'
echo "${one?this var was only set for the execed ENV}"
OUTPUT
This is command #1
This is command #2
sh: line 2: one: this var was only set for the execed ENV
E se esse processo externo for bash
ou qualquer outro shell em conformidade com o padrão POSIX de aceitar -s
tdin como padrão, você pode simplesmente escrever seu script diretamente em um arquivo |pipe
...
{ echo PS1=
echo 'echo "$PS1"'
cat /etc/skel/.bashrc
echo 'echo "$PS1"'
} | bash
echo "${PS1:?unset here again}"
OUTPUT
#blank line from first echo
[\u@\h \W]\$
sh: line 7: PS1: unset here again