Có thể chuyển hướng tất cả đầu ra của một kịch bản lệnh shell Bourne đến một nơi nào đó, nhưng với các lệnh shell bên trong chính kịch bản lệnh đó?Làm cách nào để chuyển hướng đầu ra của toàn bộ tập lệnh shell trong tập lệnh?
Chuyển hướng đầu ra của một lệnh duy nhất là dễ dàng, nhưng tôi muốn một cái gì đó 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 kịch bản được điều hành không tương tác (ví dụ, cron), tiết kiệm tắt đầu ra của mọi thứ vào một tập tin. Nếu chạy tương tác từ một trình bao, hãy để đầu ra đi đến stdout 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 để xem hàng ngày trong email, vì vậy tôi không có nó gửi đi. Tuy nhiên, nếu một cái gì đó bên trong một kịch bản cụ thể này không thành công, điều đó quan trọng với tôi và tôi muốn có thể nắm bắt và gửi email kết quả đầu ra của phần này của công việc hàng ngày.
Cập nhật: Câu trả lời của Giô-suê là chỗ-on, nhưng tôi cũng muốn lưu và khôi phục stdout và stderr xung quanh toàn bộ kịch bản, được thực hiện như thế này:
# 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
Kiểm tra $ TERM không phải là cách tốt nhất để kiểm tra chế độ tương tác. Thay vào đó, kiểm tra xem stdin là một tty (test -t 0). –
Nói cách khác: nếu [! -t0]; sau đó exec> somefile 2> & 1; fi –
Xem tại đây để biết tất cả sự tốt lành: [http://tldp.org/LDP/abs/html/io-redirection.html](http://tldp.org/LDP/abs/html/io-redirection.html Về cơ bản những gì đã được Joshua nói. exec> tập tin chuyển hướng stdout vào một tập tin cụ thể, exec
Loki