Redirecione stdout para comando-A se tiver sucesso, caso contrário, stderr para comando-b. Evitando o uso de arquivos temporários

Redirecione stdout para comando-A se tiver sucesso, caso contrário, stderr para comando-b. Evitando o uso de arquivos temporários

Eu tenho um comando que grava em stdout quando está feliz e stderr quando não está. Quero verificar o status de saída do comando e fazer algo com stdout ou stderr.

if ! command >/tmp/stdout 2>/tmp/stderr; then
  // do something with /tmp/stderr
  exit 1
fi

// do something else with /tmp/stdout

Certamente é possível ter apenas um arquivo em vez de dois, mas eu gostaria de me livrar de todos os arquivos, não apenas de um.

Existe uma maneira de evitar os arquivos temporários? Tentei com mkfifo e descritores de arquivo personalizados, mas não consigo fazer isso funcionar.

Responder1

Você pode usar a $(..)sintaxe de substituição de comando na ifcondição e ver se o comando foi executado com sucesso ou não e ainda armazenar o resultado do comando stdoutem stderruma variável

if ! var=$(cmd 2>&1); then
    printf 'process stderr contents from $var'
fi

Você pode ver isso funcionando se eu simular a cmdexecução como um script simples que faz isso

# cat temp.sh    
echo foo >&2
exit 1

e se eu executar o script como

if ! var=$(bash tmp.sh 2>&1); then
    printf '%s\n' 'process stderr contents from $var'
    printf '%s\n' "$var"
fi

Da mesma forma que você pode fazer funcionar para capturar stdoutse a substituição do comando for bem-sucedida, o que estará na elsecláusula do exemplo acima. Em ambos os casos, manipular o conteúdo de "$var"(certifique-se de que as aspas estejam ativadas) garantirá que você esteja processando o resultado como se estivesse armazenado em um arquivo.

Você pode prosseguir e citar a sintaxe de substituição de comando paranãodeixe o shell realizar a divisão de palavras nos resultados. Por exemplo, fazendo como abaixo. Pode não ser necessário para casos simples como o que mostrei aqui, mas para casos em que os resultados contêm alguns metacaracteres especiais do shell

if ! var="$(bash tmp.sh 2>&1)"; then

Observação: o título da pergunta foi reformulado desde que a primeira versão da resposta foi publicada.

Responder2

você pode usar o código abaixo

if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi

informação relacionada