Trong các hệ thống giống như Unix, có hai đường dẫn đầu ra mà nếu không được sửa đổi sẽ gửi đầu ra đến màn hình của bạn. Lỗi tiêu chuẩn (hoặc stderr) là lỗi gây ra hầu hết các lỗi và điều kiện lỗi.
Để chuyển thông báo bị từ chối cấp phép trong thiết bị lỗi chuẩn cho cùng một luồng đầu ra là "đầu ra thông thường", bạn phải kết hợp cả hai. Trong ví dụ của bạn, để bạn grep -v
vận hành đúng cách trên nó, bạn kết hợp thiết bị xuất chuẩn (đầu ra tiêu chuẩn) và thiết bị xuất chuẩn với cú pháp phức tạp mà bạn thấy.
Từ GNU Bash thủ công phần 3.2.2 Đường ống :
Nếu ' |&
' được sử dụng, lỗi tiêu chuẩn của Command1 , ngoài đầu ra tiêu chuẩn của nó, được kết nối với đầu vào tiêu chuẩn của Command2 qua ống; nó là tốc ký cho 2>&1 |
. Chuyển hướng ngầm định này của lỗi tiêu chuẩn đến đầu ra tiêu chuẩn được thực hiện sau khi bất kỳ chuyển hướng nào được chỉ định bởi lệnh.
Ngoài ra, như geirha chỉ ra, nếu bạn muốn loại bỏ đầu ra stderr, bạn sẽ muốn làm một cái gì đó như
find -name 'myfile.*' 2> /dev/null
hoặc có lẽ
find -name 'myfile.*' 2> /tmp/errorlog
Và lưu ý rằng nếu bạn có các chuỗi lệnh, chẳng hạn như find
chuyển đầu ra của nó cho xargs
bạn, bạn sẽ cần đặt toàn bộ đường dẫn của lệnh trong ngoặc đơn để nắm bắt đầu ra từ tất cả các thành phần của lệnh. Ví dụ,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
Nếu bạn bỏ dấu ngoặc đơn và thay vào đó, hãy thực hiện -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
bạn vẫn sẽ thấy các quyền bị từ chối lỗi từ find hoặc egrep, nhưng stderr sẽ được chuyển hướng cho xargs.
Như bạn đã thấy, bạn chỉ có thể vứt bỏ thiết bị lỗi chuẩn sau khi xem nội dung của nó trong quá trình chạy thử.
Lưu ý rằng với GNU find
và theo như tôi có thể nói, bất kỳ tuân thủ POSIX nào find
, -print
tùy chọn này đều ẩn. Bạn vẫn có thể cung cấp nó một cách rõ ràng nếu bạn muốn.