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 if
condição e ver se o comando foi executado com sucesso ou não e ainda armazenar o resultado do comando stdout
em stderr
uma variável
if ! var=$(cmd 2>&1); then
printf 'process stderr contents from $var'
fi
Você pode ver isso funcionando se eu simular a cmd
execuçã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 stdout
se a substituição do comando for bem-sucedida, o que estará na else
clá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