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 stdoutvà stderrđế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
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 stdoutvà stderrđế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
Câu trả lời:
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 bashvàzsh
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).
shgì Nếu đó là vỏ POSIX, &>và >&sẽ không hoạt động.
&>và >&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>&1Khi 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>&1và &>>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 &>>và >>&hình thức.