exec và tee to logfile: giải thích các lệnh bash này


15

Tôi đã thấy điều này ở đầu tập tin bash của tôi:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

Nó làm gì? Hai quá trình exec đang làm gì ở đây? Tôi nhận ra rằng giữ nó như thế này, tất cả đầu ra của việc thực thi tập lệnh được chuyển sang $LOGFILEnhưng tôi muốn hiểu từ góc độ của các execcâu lệnh.


Điều này có thể làm cho nó rõ ràng: linuxjournal.com/content/bash-redirections-USE-exec
coffeMug

1
Bạn đã thấy điều này ở đầu tập tin bash của bạn ? ;)
Sebb

1
Hai execdòng hoàn toàn có thể chỉ là một ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler

Câu trả lời:


18

Trong shell, exec1) mở tệp và chuyển hướng 2) execing thực tế (thay thế hình ảnh quá trình hiện tại bằng hình ảnh quá trình khác).

Đây execlà những chuyển hướng.

Trước tiên, bạn chuyển hướng ( exec 1> >(tee $LOGFILE)) bộ stdoutmô tả (1) sang một đường ống được tạo thay thế quy trình được kết nối với một teequy trình chạy đồng thời có $LOGFILEđối số đầu tiên và sau đó bạn chuyển hướng bộ stderrmô tả (2) đến cùng một nơi với bộ mô tả 1bây giờ (tee ống).

Hãy nhớ rằng các trình biên dịch được kế thừa, bạn đã tạo ra tất cả tương lai stdoutstderrđầu ra đi vào teequy trình, ghi nó đến $LOGFILEvà bất cứ nơi nào trình biên bản 1 chỉ vào ban đầu (có thể là thiết bị đầu cuối của bạn).


Lưu ý: Quá trình tee xuất ra thiết bị xuất chuẩn ban đầu (= filedescriptor gốc 1) bởi vì, khi bạn có thể tìm hiểu từ / tìm kiếm bash (1) cho Mở rộng lệnh đơn giảnThay thế quy trình, thay thế quy trình ( >() <()) xảy ra (cùng với các mở rộng khác) trước đó chuyển hướng được thực thi, có nghĩa là chuyển hướng exec 1> >(tee "$LOGFILE")xảy ra sau khi tee đã bắt đầu, để lại teecùng một filedescriptor 1 mà nó được thừa hưởng từ vỏ cha. (Nếu nó là cách khác, teesẽ được thực hiện để ghi vào đầu vào của chính nó, điều này có thể làm cho nó bế tắc, tùy thuộc vào mẫu IO của nó).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.