> & Có nghĩa là gì?


80

Tôi hơi bối rối trước biểu hiện này:

gcc -c -g program.c >& compiler.txt

Tôi biết &>filenamesẽ chuyển hướng cả stdout và stderr đến tệp filename. Nhưng trong trường hợp này, dấu và ở sau dấu lớn hơn. Nó trông giống như biểu mẫu M>&N, ở đâu MNlà các bộ mô tả tệp.

Trong đoạn mã trên, hiện M=1N='compiler.txt'? Chính xác thì điều này khác với:

gcc -c -g program.c > compiler.txt     (ampersand removed)

Sự hiểu biết của tôi là mỗi tệp đang mở được liên kết với một bộ mô tả tệp lớn hơn 2. Điều này có đúng không?

Nếu vậy, tên tệp có thể hoán đổi cho nhau với bộ mô tả tệp của nó như là mục tiêu chuyển hướng không?

Câu trả lời:


93

Điều này cũng giống như &>. Từ manpage bash:

Chuyển hướng đầu ra chuẩn và lỗi chuẩn Cấu trúc này cho phép cả đầu ra chuẩn (bộ mô tả tệp 1) và đầu ra lỗi chuẩn (bộ mô tả tệp 2) được chuyển hướng đến tệp có tên là phần mở rộng của từ.

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1

7
Tôi thấy mình thật ngu ngốc. Tôi đã dành nhiều thời gian để đọc các nguồn khác và nó ở ngay đó trong trang chủ.
contrapositive

3
>&là cú pháp được csh và tcsh sử dụng để chuyển hướng cả stdout và stderr. Đó có lẽ là lý do tại sao bash chấp nhận nó.
Keith Thompson

4
Điều này có nghĩa là như vậy &>word>word 2>&1có tương đương về mặt ngữ nghĩa không? Tiền trước của "This" không rõ ràng đối với tôi.
geneorama

8
@geneorama &>word, >word 2>&1, >&word là giống hệt nhau.
jordanm

1
Bây giờ tôi nhận ra rằng tôi đã phạm sai lầm trước đây dựa trên những gì tôi đọc được ở nơi khác. >chỉ chuyển hướng tiêu chuẩn ra ngoài. >không chuyển hướng lỗi. (Tôi có lẽ nên chuyển hướng nhận xét trong tương lai của mình đến /dev/null)
geneorama

7

&>vs >&: phiên bản ưa thích là &>(clobber)

Về:

  • &>
  • >&

cả hai sẽ cắt tệp - cắt ngắn tệp thành 0 byte trước khi ghi vào tệp, giống như cách > filelàm trong trường hợp chỉ STDIN.

Tuy nhiên , bashphần Chuyển hướng thủ công bổ sung rằng:

Trong hai hình thức, hình thức đầu tiên được ưu tiên hơn. Điều này tương đương về mặt ngữ nghĩa với

>word 2>&1

Khi sử dụng dạng thứ hai, từ có thể không mở rộng thành số hoặc -. Nếu đúng như vậy, các toán tử chuyển hướng khác sẽ áp dụng (xem Bộ mô tả tệp trùng lặp bên dưới) vì lý do tương thích.

(Lưu ý: trong zshcả hai đều tương đương .)

Thực hành rất tốt để có được bộ nhớ ngón tay ở dạng đầu tiên ( &>), bởi vì:

Sử dụng &>>như >>&không được hỗ trợ bởi bash(nối thêm)

Chỉ có một biểu mẫu phụ:

Định dạng thêm đầu ra tiêu chuẩn và lỗi tiêu chuẩn là:

&>>word

Điều này tương đương về mặt ngữ nghĩa với

>>word 2>&1

(xem Bộ mô tả Tệp Nhân bản bên dưới).

Ghi chú:

  • Việc sử dụng clobber &>over >&trong phần trên một lần nữa được khuyến nghị vì chỉ có một cách để bổ sung bash.
  • zshcho phép cả hai &>>>>&các hình thức.

Câu trả lời này hữu ích hơn nhiều so với câu trả lời được ủng hộ.
slayer

vậy &một ký tự đặc biệt được chuyển đổi thành 1 và 2 bởi trình thông dịch shell?
Fakher Mokadem

@FakherMokadem Không, xem sách hướng dẫn .
Tom Hale
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.