¿Por qué un script Bash todavía genera salida estándar incluso si lo redirijo a stderr?

¿Por qué un script Bash todavía genera salida estándar incluso si lo redirijo a stderr?

Tengo un script Bash:

#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0

Además, tengo una aplicación personalizada que inicia este script. La aplicación captura ambos: stdout y stderr. La salida estándar está vacía y el stderr contiene el texto proporcionado. Hasta ahora, todo bien. Pero cuando inicio el script desde la consola (terminal física):

./my_script.sh

Espero que no imprima nada en la pantalla, pero imprime. Probé varias combinaciones de redireccionamiento, por ejemplo, >&2, >/dev/stderretc. pero los resultados son los mismos. También intenté redirigir stdout a null 1>&2 >/dev/null, pero obviamente también envía mi texto a null.

¿Dónde está configurado esto? ¿Cómo puedo hacer que mi terminal no muestre stderr?

Respuesta1

Para evitar que el script envíe su flujo de error estándar al terminal, debe redirigirlo a /dev/nullun archivo.

Para ello, invoque el script con el flujo de error estándar redirigido en la línea de comando o permita que el script redirija su flujo de error.

Para redirigir el flujo de error a /dev/nullla línea de comando, invoque el script usando

./my_script 2>/dev/null

Si desea que el script descarte automáticamente su flujo de error estándar, redirija el flujo /dev/nulldentro del 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.'

Cambie /dev/nullal nombre de ruta de un archivo para pasar el resultado del diagnóstico a ese archivo.

El flujo de salida estándar no se ve afectado por la redirección del flujo de error estándar hacia /dev/nullo hacia un archivo.

Tenga en cuenta que normalmente un script no debe finalizar con exit 0.

Respuesta2

Para hacer que este script específico descarte su salida estándar:

Dado un guión:

date
date -r /var/empty/foo

edítalo para convertirlo en uncomando de grupo. Agrupar los comandos de esta manera permite manejar la salida estándar y los flujos de error estándar de los comandos combinados (redireccionados, canalizados, descartados, etc.) como si el grupo fuera lógicamente un solo comando.

Por ejemplo:

{
date
date -r /var/empty/foo
} > /dev/null

descartará la salida estándar pero no alterará el enrutamiento del flujo de error estándar.

El siguiente guión:

{
date
date -r /var/empty/foo
} > /dev/null 2>&1

redirigirá su salida estándar a /dev/null, y luego redirigirá su error estándar a su salida estándar, descartando así tanto stderr como stdout. Esa sintaxis particular es equivalente a:

{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null

información relacionada