Un altro modo per garantire i vostri errori di script vengono catturati così come gli errori rsync, è di fare qualcosa di simile:
#!/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
Ora, tutti i dati scritti su stderr verranno registrati, non solo quelli da rsync. Tuttavia, ignorare stdout
è in genere una cattiva idea quando si tratta di eseguire il debug, poiché è possibile che vengano registrate informazioni utili che potrebbero evidenziare la causa di un errore. Se si vuole distinguere tra stderr e stdout, basta non attraversare i torrenti:
exec 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
Per chiudere in modo esplicito le maniglie o il ripristino, considerare quanto segue:
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}>&-
Per le versioni più vecchie di bash, potresti dover essere un po 'più schietto:
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>&-
Forse vuoi dire "sia stdout che stderr" non "STDERR invece". –
in realtà ero solo dopo stderr, dal momento che non dovrebbe altrimenti generare alcun output. – Gnutt