Điều gì có nghĩa là & chính xác trong chuyển hướng đầu ra?


19

Tôi thấy những thứ như command 1> outhoặc với 2>&1để chuyển hướng stderr, nhưng đôi khi tôi cũng tự nhìn thấy &>, v.v.

Cách tốt nhất để hiểu &và ý nghĩa chính xác của nó là gì?

Câu trả lời:


26

Các &trong 2>&1chỉ đơn giản nói rằng số lượng 1là 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 1như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 outputstandard 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:

  1. Tạo một tệp kokocó nội dung sau:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Làm cho nó thực thi: chmod u+x koko

  3. Bây giờ lưu ý rằng j1không tồn tại

  4. Bây giờ chạy ./koko &> output

  5. chạy cat outputvà 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 outputvà bạn sẽ chỉ thấy koko2như thế. Nhưng không phải là đầu ra lỗi từ ls j1lệnh. Điều đó sẽ được gửi đến cái standard errormà 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>&1thứ tự chuyển hướng là quan trọng. Nếu bạn viết command 2>&1 >filethay 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.


2
&>nghĩa là gì?
AJJ

1
Lưu ý rằng theo command >file 2>&1thứ tự các chuyển hướng là quan trọng. Nếu bạn viết command 2>&1 >filethay 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.
Chỉ huy Byte

2
"Điều đó sẽ được gửi đến cái standard outputmà bạn sẽ thấy trong thiết bị đầu cuối của mình." không nên "đến standard error"?
frarugi87

1
Có @ frarugi87 quyền của bạn đã được sửa
George Udosen

1
@George wow, bạn đã nhanh;) Làm việc tốt
frarugi87


1

Cái [n]>&wordnà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, dashbash; 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 tcshcsh , 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>&1về 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>&1shell sẽ điều chỉnh lại thiết bị xuất chuẩn commandđể đi vào FILEtrướ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 dialoglệnh thành biến

Nó cũng đáng lưu ý đó &>là cụ thể bash. Trong trường hợp zshnà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:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.