Có thể chuyển hướng tất cả đầu ra của tập lệnh shell Bourne sang một nơi nào đó, nhưng với các lệnh shell bên trong chính tập lệnh không?
Chuyển hướng đầu ra của một lệnh đơn giản là dễ dàng, nhưng tôi muốn một cái gì đó giống như thế này:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
Ý nghĩa: nếu tập lệnh được chạy không tương tác (ví dụ: cron), hãy lưu đầu ra của mọi thứ vào một tệp. Nếu chạy tương tác từ shell, hãy để đầu ra đi ra thiết bị xuất chuẩn như bình thường.
Tôi muốn làm điều này cho một tập lệnh thường được chạy bởi tiện ích định kỳ FreeBSD. Đó là một phần của hoạt động hàng ngày, mà tôi thường không quan tâm để thấy mỗi ngày trong email, vì vậy tôi không gửi nó. Tuy nhiên, nếu một cái gì đó bên trong một kịch bản cụ thể này thất bại, điều đó quan trọng đối với tôi và tôi muốn có thể nắm bắt và gửi email đầu ra của một phần của công việc hàng ngày này.
Cập nhật: Câu trả lời của Joshua là ngay lập tức, nhưng tôi cũng muốn lưu và khôi phục thiết bị xuất chuẩn và thiết bị xuất chuẩn xung quanh toàn bộ tập lệnh, được thực hiện như sau:
# save stdout and stderr to file descriptors 3 and 4, then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
exec 1>&3 2>&4 3>&- 4>&-