19Aug
Se você é uma pessoa ocupada, a última coisa que precisa é ser incomodado com uma quantidade enorme de notificações "inúteis", então, como você acalma as coisas? O super-usuário Q & A Post tem algumas ótimas respostas para ajudar um leitor a reduzir a quantidade de saída.
Pergunta de hoje e amp;A sessão de atendimento chega a cortesia do SuperUser - uma subdivisão do Stack Exchange, um agrupamento comunitário de sites Q & A.
A pergunta
O leitor SuperUser Xster quer saber como executar um comando em segundo plano sem saída, a menos que haja um erro:
Como você suprime a saída de um comando, mas mostra se a saída do comando codifica um erro?
Como você recebe um comando para executar em segundo plano sem saída, a menos que haja um erro?
A resposta
SuperUser contribuintes Bob e Maximillian Laumeister têm a resposta para nós. Primeiro, Bob:
Infelizmente, a suposição de que stderr é usado apenas para saída de erro nem sempre é correta. Em vez disso, stderr é freqüentemente usado para qualquer saída interativa e diagnóstico( ou seja, saída destinada ao usuário para ler em um prompt interativo).
( 1) wget e dd são exemplos bem conhecidos.Alguns comandos fornecerão uma bandeira( ou seja, -quiet ou -silent ) para suprimir a saída não-erro. Leia suas páginas man para ver se existe.
Outra convenção que contém mais frequentemente é o código de saída , um programa retorna um código de saída quando ele sai. Normalmente ( 2) , um código de saída do 0 indica sucesso, e qualquer outro código de saída indica um erro.
Com bash , você pode obter o código de saída do último comando do $?Variável .Em peixe , use a variável $ status .Você pode filtrar stderr em um arquivo temporário e apenas imprimi-lo se ocorrer um erro. Por exemplo( fish ):
Você também pode usar alguns atalhos se você não estiver encadeando comandos:
Ou:
Você também pode filtrar stdout para o mesmo buffer usando 2 & gt; & 1 & gt;/tmp/ outputbuffer .
( Nota: Eu realmente não conheço peixe , então estou adaptando o conceito ao que posso encontrar em sua documentação. A sintaxe pode ser um pouco errado. Além disso, você pode usar mktemp para gerar um único temporárioarquivo. Executá-lo e gravar o nome do arquivo em uma variável.)
Se você precisa executar o todo no fundo de um shell que você também está usando interativamente ao mesmo tempo, então é melhor escrever um script para lidara saída-esconder e executar esse script em segundo plano com as técnicas padrão( peixe ).Heck, você pode colocar algo como a seguinte função em ~ /.config/fish/ config.fish :
Chamada com run-silent somecommand &( onde o e que atirou faz com que ele seja executado em segundo plano)
Observe que isso irá engolir o código de saída original e irá despejar stdout e stderr em caso de falha. Você pode personalizá-lo conforme necessário.
( 1) Não há garantia de que a saída de erro não apareça no stdout , alguns programas irão despejar toda a saída lá!
( 2) Infelizmente, isso ainda não é sempre o caso. O código de saída é completamente controlado pelo programa e alguns indicam algumas condições de sucesso com saídas não-zero. Novamente, verifique o manual.
Seguido pela resposta de Maximillian Laumeister:
Os utilitários Unix enviam mensagens gerais para stdout e mensagens de erro para stderr , então, se queremos apenas ver mensagens de erro, então será suficiente para suprimir stdout para queapenas stderr obtém saída para o console.
A maneira de fazer isso( em bash e Fish ) é anexar & gt;/dev/ nulo para o comando. Este tubo stdout em nada, mas stderr ( com suas mensagens de erro) ainda vem para o console.
Então, por exemplo:
O comando echo 1 & gt;/dev/ nulo O não imprime nada, porque a saída padrão está suprimida e nada foi escrito em stderr .
O comando man doesnotexist & gt;/dev/ null imprime uma mensagem de erro, porque man escreve sua mensagem de erro para stderr .
Tem alguma coisa a adicionar à explicação? Som desligado nos comentários. Deseja ler mais respostas de outros usuários Tech-savvy Stack Exchange? Confira o tópico de discussão completo aqui.