Pagina inicial » como » Como você executa um comando em segundo plano sem saída a menos que haja um erro?

    Como você executa um comando em segundo plano sem saída a menos que haja um erro?

    Se você é uma pessoa ocupada, então a última coisa que você precisa é ser incomodado com uma enorme quantidade de notificações 'inúteis', então como você acalma as coisas? A postagem de perguntas e respostas do SuperUser de hoje tem ótimas respostas para ajudar um leitor a diminuir a quantidade de saída.

    A sessão de perguntas e respostas de hoje nos é oferecida por cortesia do SuperUser - uma subdivisão do Stack Exchange, um agrupamento de sites de perguntas e respostas conduzido pela comunidade..

    A questão

    Leitor SuperUser O 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ê obtém um comando para ser executado em segundo plano sem saída, a menos que haja um erro?

    A resposta

    Os colaboradores do SuperUser 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 está correto. Em vez, stderr é frequentemente usado para toda e qualquer saída e diagnóstico interativos (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 um sinalizador (por exemplo,. -quieto ou -silencioso) para suprimir a saída sem erros. Leia as man pages para ver se existe.

    Outra convenção que mantém mais frequentemente é a código de saída, um programa retorna um código de saída quando sai. Tipicamente(2), um código de saída de 0 indica sucesso, e qualquer outro código de saída indica um erro.

    Com bater, você pode obter o código de saída do último comando do $? variável. Em peixe, use o $ status variável. Você pode canalizar stderr para um arquivo temporário e somente imprimi-lo se ocorrer um erro. Por exemplo (peixe):

    Você também pode usar alguns atalhos se não estiver encadeando comandos:

    Ou:

    Você também pode canalizar stdout para o mesmo buffer usando 2> & 1> / tmp / outputbuffer.

    (Nota: Eu realmente não sei peixe, então estou adaptando o conceito ao que posso encontrar em sua documentação. A sintaxe pode estar um pouco errada. Além disso, você pode usar mktemp para gerar um arquivo temporário exclusivo. Execute-o e registre o nome do arquivo em uma variável.

    Se você precisar executar a coisa toda no plano de fundo de um shell que também está usando interativamente ao mesmo tempo, é melhor escrever um script para manipular a saída ocultando e executando esse script em segundo plano com as técnicas padrão (peixe). Heck, você pode colocar algo como a seguinte função ~ / .config / fish / config.fish:

    Ligue com executar silencioso somecommand & (onde o arrasto E faz com que seja executado em segundo plano)

    Observe que isso engolirá o código de saída original e despejará os dois 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 stdout, alguns programas despejam toda a saída lá!

    (2) Infelizmente, isso nem sempre é o caso. O código de saída é completamente controlado pelo programa e alguns indicarão algumas condições de sucesso com saídas diferentes de zero. Mais uma vez, verifique o manual.

    Seguido pela resposta de Maximillian Laumeister:

    Os utilitários Unix enviam mensagens gerais para stdout, e mensagens de erro para stderr, por isso, se queremos apenas ver mensagens de erro, então será suficiente para suprimir stdout de modo que apenas stderr Obtém saída para o console.

    A maneira de fazer isso (em ambos bater e peixe) é anexar > / dev / null para o comando. Este canos stdout no nada, mas stderr (com suas mensagens de erro) ainda chega ao console.

    Então, por exemplo:

    O comando echo 1> / dev / null não imprime nada, porque o normal stdout saída é suprimida, e nada foi escrito para stderr.

    O comando homem doesnotexist> / dev / null imprime uma mensagem de erro, porque homem escreve sua mensagem de erro para stderr.


    Tem algo a acrescentar à explicação? Som desligado nos comentários. Quer ler mais respostas de outros usuários do Stack Exchange com experiência em tecnologia? Confira o tópico de discussão completo aqui.