Lệnh Unix / Linux của Kyle thực hiện công việc chuyển đổi STDERR bằng STDOUT; tuy nhiên lời giải thích không hoàn toàn đúng. Các toán tử chuyển hướng không thực hiện bất kỳ sao chép hoặc sao chép nào, chúng chỉ chuyển hướng luồng sang một hướng khác.
Viết lại lệnh của Kyle bằng cách tạm thời di chuyển 3> & 1 đến cuối, sẽ giúp dễ hiểu khái niệm hơn:
find /var/log 1>&2 2>&3 3>&1
Được viết theo cách này, Linux sẽ hiển thị lỗi vì & 3 chưa tồn tại vì nó nằm trước 3> & 1. 3> một cái gì đó là một cách để tuyên bố (xác định) rằng chúng ta sẽ sử dụng một ống thứ ba, vì vậy nó phải được đặt trước khi chúng ta chảy nước vào ống đó, ví dụ như cách Kyle viết. Hãy thử cách này chỉ để cho vui:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Không có cách để làm bản sao là một sự xấu hổ. Bạn không thể thực hiện những việc như "3> & 1 3> & 2" trong cùng một lệnh, bởi vì Linux sẽ chỉ sử dụng cái đầu tiên được tìm thấy và loại bỏ cái thứ hai.
Tôi chưa (chưa) tìm ra cách gửi cả lỗi và đầu ra thông thường vào một tệp và cũng gửi một bản sao lỗi đến đầu ra độc lập bằng một lệnh. Đối với instace, tôi có một công việc định kỳ mà tôi muốn cả hai kết quả đầu ra (lỗi và tiêu chuẩn) đi đến một tệp nhật ký và để lỗi cũng xuất hiện để tạo một thông điệp email được gửi tới blackjack của tôi. Tôi có thể làm điều đó với hai lệnh bằng cách sử dụng "tee" nhưng lỗi không hiển thị theo đúng thứ tự giữa các dòng đầu ra thông thường trong tệp. Đây là cách xấu xí mà tôi đã giải quyết vấn đề:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Lưu ý rằng tôi phải sử dụng log1 hai lần và tôi phải nối thêm trong cả hai trường hợp, một trong số đó sử dụng tùy chọn "-a" cho lệnh "tee" và lần thứ hai sử dụng ">>".
Làm một con mèo log1 bạn nhận được như sau:
STD1
STD2
-bash: sdfr: command not found
Lưu ý rằng lỗi không hiển thị trong dòng thứ hai như bình thường.