Gostaria de simplificar a saída de um script suprimindo a saída de comandos secundários que geralmente são bem-sucedidos.
No entanto, usá -q
-los oculta a saída quando eles ocasionalmente falham, então não tenho como entender o erro. Além disso, esses comandos registram sua saída stderr
.
Existe uma maneira de suprimir a saída de um comando apenas se for bem-sucedida ?
Por exemplo (mas não limitado a) algo como isto:
mycommand | fingerscrossed
Se tudo correr bem, fingerscrossed
pega a saída e a descarta. Caso contrário, ele ecoará na saída padrão ou de erro (qualquer que seja).
scripting
error-handling
Matthieu Napoli
fonte
fonte
moreutils
. Bom para mim, de qualquer maneira :)Isso provavelmente deve funcionar. Ele armazenará em buffer a saída de cada
command
um em um arquivo temporário excluído e, posteriormente, desviará a saída para/dev/null
stderr, dependendo de seu status de retorno não ser zero. Como o arquivo temporário é excluído antecipadamente, ele não pode ser lido por nenhum processo, exceto pelo shell atual e seus filhos em seu descritor de arquivo (barrando/proc/$pid/fd
bisbilhoteiros sorrateiros com permissões apropriadas) , e não requer limpeza durante o processo.Talvez uma solução mais conveniente em sistemas Linux:
... que, na maioria das conchas, funciona muito como o outro, exceto que você pode chamá-lo assim:
divert some simple-command with args
. Cuidado com os comandos de alta saída"$@"
, porém, paradash
,yash
ou alguns outros shells que aqui documentam com pipes - acho que nesses shells pode ser possível preencher o buffer do pipe (com um padrão de cerca de 128 kb em linuxes) e, portanto, um impasse . Isso não deve ser uma preocupação paraksh
,mksh
,bash
,zsh
, ou o shell Bourne, embora - todos aqueles fazem basicamente a mesma coisa que eu fiz explicitamente acima comexec
.fonte
Normalmente, em caso de erro, o comando envia mensagens para
stderr
que, para sua tarefa, você possa simplesmente suprimirstdout
fonte
stderr
(portanto, não tem efeito).Para fazer sua própria crônica
fonte
Eu faço algo assim nos meus makefiles:
Adaptando isso à sua situação, você pode fazer algo assim:
Portanto, "if" executa o comando e canaliza a saída para mycommand.log. Se você precisar capturar stdout vs stdout vs o que for, pode ser necessário alterar o comando de pipe '&>' para '>'. Se o comando falhar, capture o código de erro, imprima o conteúdo de mycommand.log, remova mycommand.log e, finalmente, retorne com o código de erro original.
Sem o (exit $ c) você retornaria com o código de saída que corresponde ao que o comando 'rm' retornou.
Finalmente, se você quiser um liner, algo assim funcionaria.
fonte
(...)
assim? Porque ele não faz nada útil para você, mas gera subcascas extras.(exit $c)
está definido$?
, o que é algo que você não pode fazer de outra maneira.if ! (mycommand) &>x
é significativo com o redirecionamento se o comando usar, por exemplo,time
ou der um erro de shell.{ ; }
@ MichaelHomer - para essas coisas existem os curlies ... emboraexit
seja um pouco complicado lá, é certo.$?
, poderá usar,exit $c
mas sim, em outros casos(exit $?)
tem valor (embora uma função shellrret() { return $1; }
seja melhor em geral, eu diria). O subshell para comandos ainda não parece realmente como mikeserv indicou.Acabei de encontrar esta resposta muito mais simples nesta outra questão :
Funciona como um encanto!
fonte