Otra forma de asegurar sus errores de script son capturados, así como los errores rsync, es hacer algo como esto:
#!/bin/bash
set -eu
set -o pipefail
exec 1>/dev/null 2> >(logger -t "stderr-from-my-script")
: do some interesting things
rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup
: do some other interesting things
Ahora, todos los datos escritos en stderr se registrarán, no solo los de rsync. Sin embargo, ignorar stdout
suele ser una mala idea cuando se trata de depurar, ya que la información útil que podría resaltar la causa de un error podría registrarse ahí. Si desea diferenciar entre stderr y stdout, simplemente no cruzan las corrientes:
exec 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
Para cerrar explícitamente las asas o restaurarlos, considere lo siguiente:
exec {OLD_STDOUT}>&1 {OLD_STDERR}>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
: Do some interesting things
eval exec 1>&${OLD_STDOUT} 2>&${OLD_STDERR} ${OLD_STDOUT}>&- ${OLD_STDERR}>&-
Para versiones anteriores de bash, puede que tenga que ser un poco más contundente:
exec 3>&1 4>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
: Do some interesting things
exec 1>&3 2>&4 3>&- 4>&-
Quizás se refiera a "stdout y stderr" no "STDERR en su lugar". –
en realidad solo estaba después de stderr, ya que de lo contrario no debería generar ninguna salida. – Gnutt