Sự khác biệt giữa 2> & -, 2> / dev / null, | &, &> / dev / null và> / dev / null 2> & 1


192

Chỉ cần tìm sự khác biệt giữa

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

và tính di động của họ với non-Bourne shellsnhư tcsh, mkshvv


2
Lưu ý rằng, mặc dù mksh hỗ trợ &>khả năng tương thích bash GNU, nhưng chúng tôi khuyến khích không sử dụng điều này, vì phân tích cú pháp có thể phá vỡ ngữ nghĩa của các tập lệnh POSIX hiện tại và mksh đã vô hiệu hóa chế độ POSIX.
mirabilos

Tôi cũng đã thấy ^ /dev/nullnhững gì nó làm gì?
balupton

Câu trả lời:


241

Đối với nền:

  • một số 1 = tiêu chuẩn ra (tức là STDOUT)
  • một số 2 = lỗi tiêu chuẩn (tức là STDERR)
  • nếu một số không được đưa ra rõ ràng, thì số 1 được giả định bởi shell (bash)

Trước tiên hãy giải quyết chức năng của những điều này. Để tham khảo xem Hướng dẫn Bash-Scripting nâng cao .

Chức năng

2>&-

Hình thức chung của cái này là M>&-, trong đó "M" là số mô tả tệp. Điều này sẽ đóng đầu ra cho bất kỳ mô tả tập tin nào được tham chiếu, tức là "M" .

2>/dev/null

Hình thức chung của cái này là M>/dev/null, trong đó "M" là số mô tả tệp. Điều này sẽ chuyển hướng mô tả tập tin, "M" , đến /dev/null.

2>&1

Hình thức chung của cái này là M>&N, trong đó "M" & "N" là các số mô tả tệp. Nó kết hợp đầu ra của bộ mô tả tập tin "M""N" thành một luồng duy nhất.

|&

Đây chỉ là viết tắt cho 2>&1 |. Nó đã được thêm vào trong Bash 4.

&>/dev/null

Đây chỉ là viết tắt cho >/dev/null 2>&1. Nó chuyển hướng mô tả tập tin 2 (STDERR) và mô tả 1 (STDOUT) đến /dev/null.

>/dev/null

Đây chỉ là viết tắt cho 1>/dev/null. Nó chuyển hướng mô tả tập tin 1 (STDOUT) đến /dev/null.

Tính di động để không bash, tcsh, mksh, v.v.

Tôi đã không xử lý nhiều với các vỏ khác bên ngoài cshtcsh. Kinh nghiệm của tôi với 2 người này so với các toán tử chuyển hướng của bash, đó là bash vượt trội hơn về mặt đó. Xem trang người đàn ông tcsh để biết thêm chi tiết.

Trong số các lệnh bạn đã hỏi về không có lệnh nào được hỗ trợ trực tiếp bởi csh / tcsh. Bạn sẽ phải sử dụng các cú pháp khác nhau để xây dựng các chức năng tương tự.


Chúng ta có một người chiến thắng. Nhưng vì vậy, không có sự khác biệt về hiệu suất hoặc một số như vậy với 2>&-vs 2>/dev/null(khác với một số chương trình được viết "kém" không hoàn tác 2>&-chính xác)?
Det

3
Không nên có sự khác biệt về hiệu suất.
slm

5
&>đã bashbắt đầu ngay từ đầu (và phá vỡ khả năng tương thích của Bourne và POSIX vì nó có nghĩa là một cái gì đó khác biệt ở đó, mặc dù không có khả năng bị tấn công). >&|&đến từ (t)csh(và đó là cách duy nhất của họ để chuyển hướng stderr). Họ đã ở zshtừ đầu và chỉ được thêm vào gần đây bash. Xem thêm rccho các nhà khai thác được thiết kế tốt hơn.
Stéphane Chazelas

1
Cập nhật: về vấn đề hiệu suất, điều đó cũng được xác nhận tại đây: unix.stackexchange.com/questions/163955/ săn
Det

1
Xin chào @slm, cảm ơn bạn đã liên hệ. Tôi rất vui vì repo của tôi đã không thay đổi (+2-2=0). Bây giờ, đến phần phiên bản, tôi không chỉnh sửa nhiều, nhưng trong trường hợp này tôi sẽ làm thế, vì nó làm rõ rằng dữ liệu sau khi hoạt động sẽ ở N. Tôi đã đọc bạn trả lời thông qua, và nó rất tốt về mọi mặt. Chỉ sự mơ hồ nhỏ này đã khiến tôi suy nghĩ, đó là lý do tại sao phiên bản. Nhưng ok, hãy thoải mái để thêm hoặc từ chối nó, như bạn muốn. Tôi hy vọng tôi có thể giải thích điểm. Hãy tiếp tục phát huy.
Bác sĩ Beco

11

Điều này là để chuyển hướng STDERR & STDOUT:

  • 2>/dev/null

    Chuyển hướng STDERR sang / dev / null (ngăn không hiển thị trên bảng điều khiển)

  • |&

    Chuyển hướng STDERR và STDOUT sang STDIN của lệnh đường ống (cmd1 | & cmd2)

  • &>/dev/null

    Chuyển hướng cả STDERR & STDOUT sang / dev / null (không có gì hiển thị trên bảng điều khiển)

  • >/dev/null

    Chuyển hướng STDOUT sang / dev / null (chỉ STDERR hiển thị trên bảng điều khiển)

  • 2>&-

    Là để đóng một mô tả tập tin được sử dụng với chuyển hướng

Đây là tất cả các phương pháp chuyển hướng tiêu chuẩn cho đạn Bourne.


4
|&&>/dev/nullkhông cầm tay.
Chris Down

4

Hãy coi đây là một phụ lục cho câu trả lời đã chọn. Bạn có thể muốn biết hình thức nào là POSIX và hình thức nào không.

Hai hình thức POSIX có liên quan:

2.7.2 Chuyển hướng đầu ra

Hai định dạng chung để chuyển hướng đầu ra là:

[n]> từ

[n]> | từ

Trong đó n tùy chọn đại diện cho số mô tả tập tin. Nếu số bị bỏ qua, chuyển hướng sẽ tham chiếu đến đầu ra tiêu chuẩn (mô tả tệp 1).

Chuyển hướng đầu ra sử dụng định dạng '>' sẽ thất bại nếu tùy chọn noclobber được đặt (xem mô tả của tập -C) và tệp được đặt tên bởi sự mở rộng của từ tồn tại và là một tệp thông thường. Mặt khác, chuyển hướng bằng cách sử dụng '>' hoặc "> |" các định dạng sẽ làm cho tệp có kết quả tên từ việc mở rộng từ được tạo và mở cho đầu ra trên bộ mô tả tệp được chỉ định hoặc đầu ra tiêu chuẩn nếu không được chỉ định. Nếu tập tin không tồn tại, nó sẽ được tạo ra; nếu không, nó sẽ bị cắt ngắn thành một tập tin trống sau khi được mở.

-

2.7.6 Sao chép bộ mô tả tệp đầu ra

Toán tử chuyển hướng:

[n]> & từ

sẽ sao chép một bộ mô tả tệp đầu ra từ một cái khác, hoặc sẽ đóng một cái. Nếu từ ước tính thành một hoặc nhiều chữ số, bộ mô tả tệp được ký hiệu là n hoặc đầu ra tiêu chuẩn nếu n không được chỉ định, sẽ được tạo thành một bản sao của bộ mô tả tệp được ký hiệu bằng từ; nếu các chữ số trong word không đại diện cho một bộ mô tả tệp đã mở cho đầu ra, sẽ xảy ra lỗi chuyển hướng; xem Hậu quả của lỗi Shell. Nếu từ ước tính thành '-', mô tả tệp n hoặc đầu ra tiêu chuẩn nếu n không được chỉ định, sẽ bị đóng. Nỗ lực đóng một bộ mô tả tệp không mở sẽ không cấu thành lỗi. Nếu từ đánh giá đến một cái gì đó khác, hành vi là không xác định.

Vì thế:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

Dòng cuối cùng không có trong câu hỏi ban đầu, nhưng nó hoạt động mà không có khiếu nại trong bash. (Cũng hoạt động với / dev / tty thay thế cho / dev / null).


1
Tôi luôn muốn biết thêm.
Det
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.