Đối với một giải pháp để chuyển hướng nhiều lệnh cùng một lúc:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Tại sao giải pháp ban đầu của bạn không hoạt động: exec 2> & 1 sẽ chuyển hướng đầu ra lỗi tiêu chuẩn sang đầu ra tiêu chuẩn của shell của bạn, nếu bạn chạy tập lệnh của mình từ bàn điều khiển, sẽ là bàn điều khiển của bạn. chuyển hướng ống trên các lệnh sẽ chỉ chuyển hướng đầu ra tiêu chuẩn của lệnh.
Theo quan điểm của somecommand
nó, đầu ra tiêu chuẩn của nó đi vào một đường ống được kết nối tee
và lỗi tiêu chuẩn đi vào cùng một tệp / pseudofile như lỗi tiêu chuẩn của vỏ, mà bạn chuyển hướng đến đầu ra tiêu chuẩn của vỏ, đó sẽ là bàn điều khiển nếu bạn chạy chương trình của bạn từ bàn điều khiển.
Cách duy nhất để giải thích là xem điều gì thực sự xảy ra:
Môi trường ban đầu của shell của bạn có thể trông như thế này nếu bạn chạy nó từ thiết bị đầu cuối:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Sau khi bạn chuyển hướng lỗi tiêu chuẩn thành đầu ra tiêu chuẩn ( exec 2>&1
), về cơ bản, bạn ... không thay đổi gì. Nhưng nếu bạn chuyển hướng đầu ra tiêu chuẩn của tập lệnh thành một tệp, bạn sẽ kết thúc với một môi trường như thế này:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Sau đó, chuyển hướng lỗi tiêu chuẩn shell thành đầu ra tiêu chuẩn sẽ kết thúc như thế này:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
Chạy một lệnh sẽ kế thừa môi trường này. Nếu bạn chạy một lệnh và chuyển nó sang tee, môi trường của lệnh sẽ là:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Vì vậy, lỗi tiêu chuẩn của lệnh của bạn vẫn đi vào cái mà shell sử dụng làm lỗi tiêu chuẩn của nó.
Bạn thực sự có thể thấy môi trường của một lệnh bằng cách nhìn vào /proc/[pid]/fd
: sử dụng ls -l
để liệt kê nội dung của liên kết tượng trưng. Các 0
tập tin ở đây là đầu vào tiêu chuẩn, 1
là đầu ra tiêu chuẩn và 2
là lỗi tiêu chuẩn. Nếu lệnh mở thêm tệp (và hầu hết các chương trình làm), bạn cũng sẽ thấy chúng. Một chương trình cũng có thể chọn chuyển hướng hoặc đóng đầu vào / đầu ra tiêu chuẩn và tái sử dụng 0
, 1
và 2
.
|&
hoạt động như một phím tắt cho2>&1 |
, nó ít nhất thuận tiện hơn một chút.