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 stdout
và 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 stdout
và 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 stdout
inturn đượ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 bash
vàzsh
Nhưng:
Chỉ >&
hoạt động trong csh
hoặ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 ksh
chỉ 2>&1
hoạ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).
sh
gì Nếu đó là vỏ POSIX, &>
và >&
sẽ không hoạt động.
&>
và >&
bán tương đương (clobber)Phần zsh
Chuyể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ư > file
sẽ làm trong trường hợp chỉ STDIN.
Tuy nhiên , bash
phầ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 bash
kịch bản.
>> logfile 2>&1
và &>>
tương đương (nối thêm)Ở đây, logfile
khô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}sh
là:
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
.)
zsh
cho phép cả hai &>>
và >>&
hình thức.