I need to access the stdout, stderr and exit code of each command separately. This makes it difficult to chain the commands using && or ;.
Bem, não sei se realmente recomendo isso, mas você poderia escrever uma função de shell como esta:
function prefix ()
(
PREFIX="$1"
OUT=''
while read -r ; do
OUT="${OUT}${PREFIX}${REPLY}"$'\n'
done
echo "$OUT"
)
function run_cmd ()
{
echo "Running command << $@ >> . . ."
(
( ( "$@" ; echo "\$?: $?" >&3 ) | prefix 'STDOUT: ' >&3 ) 2>&1 \
| prefix 'STDERR: '
) 3>&1
}
Em seguida, se ./foo.sh bar
imprimir foo\nbar\n
na saída padrão e baz\nbip\n
no erro padrão e sair com o código 1, run_cmd ./foo.sh bar
imprimirá algo como:
Running command << ./foo.sh bar >> . . .
$?: 0
STDOUT: foo
STDOUT: bar
STDERR: baz
STDERR: bip
Isso permitirá encadear uma sequência de comandos, desde que você use run_cmd
para todos os códigos necessários para STDOUT / STDERR / exit-codes. (Mas como o comando em si é executado em subcamadas com cinco camadas de profundidade, não é possível usar run_cmd
para executar qualquer comando que precise definir variáveis de ambiente para uso por outros comandos. Espero que você não tenha nenhum comando que ambos geram variáveis de saída e ?