Se você armazenar a saída de um comando em uma variável, esse comando será executado em um . Não há como escapar disso. Se você quiser manter as alterações no contexto da shell (variáveis, redirecionamentos etc.) e capturar a saída, será necessário organizar seu script de maneira diferente.
Uma maneira é usar um arquivo temporário. Isto é portátil (funciona em qualquer POSIX sh, exceto que a maneira de criar um arquivo temporário não é POSIX) e não invasivo (você pode tratar any_command
como uma caixa preta, você não precisa modificá-lo).
unset tmp1
trap 'rm -f "$tmp1"' EXIT INT TERM HUP
tmp1="$(mktemp)"
any_command >"$tmp1"
V1=$(cat "$tmp1")
rm "$tmp1"
Uma forma portátil, mas invasiva, de evitar o uso de um arquivo temporário é alterar any_command
para que ele colete sua saída em uma variável. Isso requer que cada chamada de comando externo seja anexada a essa variável. Isso é particularmente complicado se houver chamadas de função, já que o código da função precisa ser alterado. Exemplo:
f () {
echo "$1"
a=$((a+$1))
echo "$2"
}
V1=$(f 4 2)
deve ser alterado para
f_into_V1 () {
V1="${V1}${1}"
a=$((a+$1))
V1="${V1}${2}"
}
f_into_V1 4 2