Tôi không thể làm cho một lớp lót rất đơn giản của Dennis hoạt động, vì vậy đây là một phương pháp phức tạp hơn nhiều. Tôi sẽ thử đầu tiên của anh ấy.
Như đã đề cập, bạn có thể sử dụng exec để chuyển hướng lỗi & tiêu chuẩn ra cho toàn bộ tập lệnh. Giống như vậy:
exec > $LOGFILE 2>&1
Điều này sẽ xuất tất cả các thiết bị xuất chuẩn và thiết bị xuất chuẩn thành $ LOGFILE.
Bây giờ, vì bạn muốn hiển thị bảng điều khiển này cho bảng điều khiển cũng như logfile, bạn cũng sẽ phải sử dụng một ống có tên để thực thi để ghi và đọc từ đó.
(Về mặt kỹ thuật, một lớp lót của Dennis cũng thực hiện điều này, mặc dù rõ ràng theo một cách khác) Bản thân đường ống được tạo ra mkfifo $PIPEFILE
. Sau đó làm như sau.
# Bắt đầu viết tee vào logfile, nhưng kéo đầu vào của nó từ đường ống được đặt tên của chúng tôi.
tee $ LOGFILE <$ PIPEFILE &
# chụp ID tiến trình của tee cho lệnh chờ.
TEEPID = $!
# chuyển hướng phần còn lại của thiết bị xuất chuẩn và thiết bị xuất chuẩn đến đường ống được đặt tên của chúng tôi.
thực thi> $ PIPEFILE 2> & 1
echo "Thực hiện các lệnh của bạn ở đây"
echo "Tất cả các tiêu chuẩn của họ sẽ nhận được teed."
echo "Lỗi tiêu chuẩn của họ cũng vậy"> & 2
# đóng mô tả tập tin stderr và stdout.
thực hiện 1> & - 2> & -
# Đợi tee kết thúc vì bây giờ đầu kia của ống đã đóng.
chờ $ TEEPID
Nếu bạn muốn kỹ lưỡng, bạn có thể tạo và hủy tệp đường ống được đặt tên ở đầu và cuối tập lệnh của mình.
Để ghi lại, tôi đã lượm lặt được hầu hết những điều này từ một bài đăng trên blog rất nhiều thông tin của một anh chàng ngẫu nhiên: ( Phiên bản lưu trữ )