Như những người khác đã nói, linux cung cấp hai luồng đầu ra khác nhau:
stdout , hay "đầu ra tiêu chuẩn" là nơi tất cả đầu ra thông thường đi.
Bạn có thể tham khảo nó bằng cách sử dụng mô tả tập tin 1
.
stderr , hoặc "lỗi tiêu chuẩn" là một luồng riêng cho thông tin ngoài băng.
Bạn có thể tham khảo nó bằng cách sử dụng mô tả tập tin 2
.
Tại sao hai luồng đầu ra khác nhau? Hãy xem xét một đường dẫn của các lệnh tưởng tượng:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
Bây giờ hãy tưởng tượng decrypt
lệnh thất bại và tạo ra một thông báo lỗi. Nếu nó gửi tin nhắn đó đến stdout
, nó sẽ gửi vào đường ống, và trừ khi nó có từ "bí mật", bạn sẽ không bao giờ nhìn thấy nó. Vì vậy, bạn kết thúc với một tập tin đầu ra trống rỗng, không biết điều gì đã xảy ra.
Tuy nhiên, do đường ống chỉ chụp stdout
, nên decrypt
lệnh có thể gửi lỗi đến stderr
, nơi chúng sẽ được hiển thị trên bàn điều khiển.
Bạn có thể chuyển hướng stdout
và stderr
, cùng nhau hoặc độc lập:
# Send errors to "errors.txt" and output to "secrets.txt"
# The following two lines are equivalent, as ">" means "1>"
decrypt $MY_FILE 2> errors.txt > secrets.txt
decrypt $MY_FILE 2> errors.txt 1> secrets.txt
Bạn có thể chuyển hướng các lỗi đến stdout
và xử lý chúng như thể chúng là đầu ra bình thường:
# The operation "2>&1" means "redirect file descriptor 2 to file
# descriptor 1. So this sends all output from stderr to stdout.
# Note that the order of redirection is important.
decrypt $MY_FILE > errors.txt 2>&1
# This may be confusing. It will store the normal output in a file
# and send error messages to stdout, where they'll be captured by
# the pipe and then sorted.
decrypt $MY_FILE 2>&1 > output.txt | sort
Bạn cũng có thể sử dụng ký hiệu "tốc ký" để chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn vào cùng một tệp:
decrypt $MY_FILE &> output.txt
Và cuối cùng, >
toán tử trước tiên sẽ cắt bớt tệp đầu ra của nó trước khi ghi vào nó. Thay vào đó, nếu bạn muốn nối thêm dữ liệu vào một tệp hiện có, hãy sử dụng >>
toán tử:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1