Câu trả lời:
Các &
trong 2>&1
chỉ đơn giản nói rằng số lượng 1
là một bộ mô tả tập tin và không phải là một tên tập tin. Trong trường hợp này standard output file descriptor
.
Nếu bạn sử dụng 2>1
, thì điều này sẽ chuyển hướng lỗi đến một tệp được gọi 1
nhưng nếu bạn sử dụng 2>&1
, thì nó sẽ gửi nó đến standard output stream
.
Điều này &>
nói gửi cả hai, standard output
và standard error
, ở đâu đó. Ví dụ , ls <non-existent_file> &> out.file
. Hãy để tôi minh họa điều này với một ví dụ.
Thiết lập:
Tạo một tệp koko
có nội dung sau:
#!bin/bash
ls j1
echo "koko2"
Làm cho nó thực thi: chmod u+x koko
Bây giờ lưu ý rằng j1
không tồn tại
Bây giờ chạy ./koko &> output
chạy cat output
và bạn sẽ thấy
ls: cannot access 'j1': No such file or directory
koko2
Cả hai, standard error
( ls: cannot access 'j1': No such file or directory
) và standard output
( koko2
), đã được gửi đến tệp output
.
Bây giờ chạy lại nhưng lần này là như vậy:
./koko > output
Làm cat output
và bạn sẽ chỉ thấy koko2
như thế. Nhưng không phải là đầu ra lỗi từ ls j1
lệnh. Điều đó sẽ được gửi đến cái standard error
mà bạn sẽ thấy trong thiết bị đầu cuối của mình.
Lưu ý quan trọng nhờ @Byte Commander:
Lưu ý rằng theo command >file 2>&1
thứ tự chuyển hướng là quan trọng. Nếu bạn viết command 2>&1 >file
thay thế (thường không phải là những gì bạn muốn), trước tiên, nó sẽ chuyển hướng lệnh stdout
đến tệp và sau đó chuyển hướng lệnh stderr
đến bây giờ không được sử dụng stdout
, vì vậy nó sẽ hiển thị trong thiết bị đầu cuối và bạn có thể chuyển hướng hoặc chuyển hướng nó một lần nữa, nhưng nó sẽ không được ghi vào tập tin.
command >file 2>&1
thứ tự các chuyển hướng là quan trọng. Nếu bạn viết command 2>&1 >file
thay thế (thường không phải là những gì bạn muốn), trước tiên, nó sẽ chuyển hướng thiết bị xuất chuẩn của lệnh sang tệp và sau đó chuyển hướng thiết bị xuất chuẩn của thiết bị sang thiết bị xuất chuẩn hiện không được sử dụng, vì vậy nó sẽ hiển thị trong thiết bị đầu cuối và bạn có thể chuyển nó hoặc chuyển hướng nó một lần nữa, nhưng nó sẽ không được ghi vào tệp.
standard output
mà bạn sẽ thấy trong thiết bị đầu cuối của mình." không nên "đến standard error
"?
> FILE 2>&1
và &> FILE
là tương đương. Xem 8.2.3.2. Chuyển hướng các lỗi trong Bash Guide cho người mới bắt đầu Chương 8
&> FILE
chỉ dành riêng cho Bash trong khi >FILE 2>&1
được hiểu bởi số lượng đạn pháo lớn hơn.
Cái [n]>&word
này được gọi là Bộ mô tả tệp đầu ra trùng lặp (xem phần 2.7.6 của Tiêu chuẩn ngôn ngữ Shell POSIX). Hành vi này đặc biệt là tính năng của bourne giống như vỏ, bao gồm ksh
, dash
và bash
; trong thực tế, tiêu chuẩn dựa trên vỏ Bourne và ksh
. Nhìn vào hướng dẫn sử dụng tcsh và csh , dường như chúng không cung cấp khả năng sao chép bất kỳ mô tả tệp nào, tuy nhiên từ mô tả >&
, điều này hoạt động như &>
trong bash
(nghĩa là chuyển hướng lỗi và đầu ra bình thường thành tệp).
Trong * nix như các hệ thống, bao gồm Ubuntu, bạn thường nghe rằng mọi thứ đều là tệp, hay đúng hơn là mô tả tệp . Đầu ra tiêu chuẩn là bộ mô tả tệp không đổi 1 và lỗi tiêu chuẩn là bộ mô tả tệp 2. Vì vậy, > FILE 2>&1
về mặt kỹ thuật có nghĩa là bộ mô tả tệp trùng lặp 2 vào bộ mô tả tệp 1. Nói cách khác của câu trả lời này :
2> & 1 yêu cầu shell cung cấp cho lệnh một bộ mô tả tệp 2 là bản sao của bộ mô tả 1. (tức là điểm stderr & stdout cho cùng một fd).
Chìa khóa ở đây là lưu ý rằng phần mô tả 1 phải được đặt trước. Vì shell xử lý các chuyển hướng theo thứ tự từ trái sang phải, nên command >FILE 2>&1
shell sẽ điều chỉnh lại thiết bị xuất chuẩn command
để đi vào FILE
trước, và chỉ sau đó mô tả 2 mới có thể trở thành bản sao của 1, tức là 1 và 2 điểm cho cùng một vị trí - FILE
.
Điều này tất nhiên vượt xa các lỗi tiêu chuẩn và đầu ra tiêu chuẩn. Như trong câu trả lời này , bằng cách thực hiện3&>2
... bạn sao chép (dup2) filedescritor 2 vào filedescriptor 3, có thể đóng filedescriptor 3 nếu nó đã mở
Ví dụ về thao tác mô tả tệp, trong số nhiều người, sẽ bắt đầu ra của dialog
lệnh thành biến
Nó cũng đáng lưu ý đó &>
là cụ thể bash
. Trong trường hợp zsh
này hoạt động giống nhau, nhưng theo tài liệu, "... không có tác dụng tương tự như '> từ 2> & 1' với sự hiện diện của nhiều". Trong tuân thủ POSIX /bin/sh
, điều này sẽ được coi là chuyển hướng thông thường với việc đưa lệnh vào nền. Xem thêm, Có mã sh nào không hợp lệ về mã bash không? .
Xem thêm:
&>
nghĩa là gì?