Một cách khác đảm bảo lỗi kịch bản của bạn đang bị bắt cũng như lỗi rsync, là thực hiện một việc như sau:
#!/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
Bây giờ, tất cả dữ liệu được viết cho stderr sẽ được ghi lại, không chỉ từ rsync. Tuy nhiên, bỏ qua stdout
thường là một ý tưởng tồi khi nói đến gỡ lỗi, vì thông tin hữu ích có thể làm nổi bật nguyên nhân gây ra lỗi có thể được ghi lại ở đó. Nếu bạn muốn phân biệt giữa stderr và stdout, chỉ không qua suối:
exec 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script")
Để đóng một cách rõ ràng xử lý hoặc khôi phục chúng, hãy xem xét những điều sau đây:
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}>&-
Đối với các phiên bản cũ của bash, bạn có thể phải hơi cùn hơn một chút:
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>&-
Có thể bạn có nghĩa là “cả stdout và stderr” chứ không phải “STDERR thay thế”. –
thực sự tôi chỉ sau stderr, vì nó không nên tạo ra bất kỳ đầu ra nào khác. – Gnutt