Por que um script Bash ainda gera stdout mesmo que eu o redirecione para stderr?

Por que um script Bash ainda gera stdout mesmo que eu o redirecione para stderr?

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/nullou 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/nulla 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/nulldentro 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/nullpara 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/nullou 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

informação relacionada