Sự khác biệt chuyển hướng giữa & >> & và 2> & 1


12

Trên luồng SO này và một vài luồng khác tôi đã thấy các lệnh sau để chuyển hướng stdoutstderrđến một tệp.

Có phải tất cả đều tương đương? Có sự khác biệt nào giữa chúng không?

command1 >> logfile 2>&1
command &> logfile
command >& logfile

1
Hai cái cuối cùng là tương đương: stackoverflow.com/q/11255447/1032785
jordanm

Câu trả lời:


7

Vì bạn đã gắn thẻ zsh, hãy để tôi nói với bạn rằng tất cả 3 chuyển hướng hoạt động chính xác theo cùng một cách. Như bạn có thể đã đọc trong cả hai bài viết trùng lặp (một trong các bình luận và một trong các bài đăng của bạn), tất cả chúng đều chuyển hướng stderrđến stdoutinturn được chuyển hướng đến tệp 'logfile' (nghĩa là logfile sẽ chứa cả đầu ra và lỗi ).

Nhưng hành vi của họ thay đổi RẤT NHIỀU tùy thuộc vào vỏ bạn đang ở.

Tất cả ba kiểu chuyển hướng đều hoạt động tốt theo cùng một cách bashzsh

Nhưng:

Chỉ >&hoạt động trong cshhoặctcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

Trong kshchỉ 2>&1hoạt động.

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

Tôi ghét ksh. Trong khi >&chỉ đưa ra một lỗi, phần &>nền của lệnh và làm trống logfile (nếu không trống).


1
Ý bạn là shgì Nếu đó là vỏ POSIX, &>>&sẽ không hoạt động.
cuonglm

Đáng buồn là tuyên bố đầu tiên là thực tế không chính xác. Xem câu trả lời của tôi cho clobber vs append.
Tom Hale

1

&>>&bán tương đương (clobber)

Phần zshChuyển hướng thủ công nói rằng:

  • &>
  • >&

là tương đương.

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

Tuy nhiên , bashphần Chuyển hướng thủ công cho biết thêm:

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

>word 2>&1

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

Vì vậy, trong khi bạn đã gắn thẻ zsh, có lẽ bạn nên lấy bộ nhớ ngón tay ở dạng đầu tiên để viết bashkịch bản.

>> logfile 2>&1&>>tương đương (nối thêm)

Ở đây, logfilekhông được ghi đè, nhưng được mở để ghi ở cuối tệp, tức là chế độ chắp thêm ( O_APPEND).

Tương đương trong cả hai {ba,z}shlà:

command1 &>> logfile

Trong bash:

Định dạng để nối 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 Sao chép tệp mô tả bên dưới).

(Lưu ý: việc sử dụng clobber của &>hơn >&ở phần trên một lần nữa đề nghị cho chỉ có một cách để phụ thêm vào bash.)

zshcho phép cả hai &>>>>&hình thức.

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.