Eu tenho um script Bash:
#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0
Além disso, tenho um aplicativo personalizado que inicia esse script. O aplicativo captura ambos - stdout e stderr. O stdout está vazio e o stderr contém o texto fornecido. Até agora tudo bem. Mas quando inicio o script no console (terminal físico):
./my_script.sh
Espero que não imprima nada no display, mas imprime. Tentei várias combinações de redirecionamento, por exemplo, >&2
, >/dev/stderr
, etc., mas os resultados são os mesmos. Também tentei redirecionar o stdout para null 1>&2 >/dev/null
, mas obviamente ele também envia meu texto para o null.
Onde isso está configurado? Como posso fazer com que meu terminal não exiba stderr?
Responder1
Para impedir que o script envie seu fluxo de erro padrão para o terminal, você precisa redirecioná-lo para /dev/null
ou um arquivo.
Você faz isso invocando o script com o fluxo de erros padrão redirecionado na linha de comando ou deixando o próprio script redirecionar seu fluxo de erros.
Para redirecionar o fluxo de erros para /dev/null
a linha de comando, invoque o script usando
./my_script 2>/dev/null
Se você quiser que o script descarte seu fluxo de erros padrão automaticamente, redirecione o fluxo para /dev/null
dentro do script:
#!/bin/bash
# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null
echo 'This should not be visible.' >&2
echo 'This should be visible.'
Altere /dev/null
para o nome do caminho de um arquivo para passar a saída de diagnóstico para esse arquivo.
O fluxo de saída padrão não é afetado pelo redirecionamento do fluxo de erro padrão para /dev/null
ou para um arquivo.
Observe que um script normalmente não deve ser finalizado por exit 0
.
Responder2
Para fazer com que este script específico descarte sua saída padrão:
Dado um script:
date
date -r /var/empty/foo
edite-o para se tornar umcomando de grupo. Agrupar os comandos dessa maneira permite que a saída padrão e os fluxos de erro padrão dos comandos combinados sejam tratados (redirecionados, canalizados, descartados, etc.) como se o grupo fosse logicamente um único comando.
Por exemplo:
{
date
date -r /var/empty/foo
} > /dev/null
descartará a saída padrão, mas não alterará o roteamento do fluxo de erro padrão.
O seguinte roteiro:
{
date
date -r /var/empty/foo
} > /dev/null 2>&1
redirecionará sua saída padrão para /dev/null e, em seguida, redirecionará seu erro padrão para sua saída padrão, descartando assim stderr e stdout. Essa sintaxe específica é equivalente a:
{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null