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/stderr
etc. 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/null
un 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/null
la 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/null
dentro 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/null
al 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/null
o 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