Pada utas SO ini dan beberapa utas lainnya, saya telah melihat perintah berikut untuk mengarahkan ulang stdout
dan stderr
ke file.
Apakah semuanya setara? Apakah ada perbedaan di antara mereka?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
shell
zsh
io-redirection
Amelio Vazquez-Reina
sumber
sumber
Jawaban:
Karena Anda telah menandai
zsh
, izinkan saya memberi tahu Anda bahwa semua pengalihan 3 bekerja persis dengan cara yang sama. Seperti yang mungkin telah Anda baca di kedua duplikat posting (yang di komentar dan yang di posting Anda), mereka semua mengarahkanstderr
kestdout
inturn yang diarahkan ke file 'logfile' (yaitu, file log akan berisi output dan kesalahan ).Tetapi perilaku mereka berubah BANYAK tergantung pada shell Anda masuk
Semua tiga gaya pengalihan berfungsi dengan baik dengan cara yang sama di
bash
danzsh
Tapi:
Hanya
>&
berfungsi dicsh
atautcsh
Dalam
ksh
hanya2>&1
karya.Saya benci
ksh
. Sementara>&
hanya memberikan kesalahan,&>
latar belakang bagian dari perintah dan mengosongkan logfile (jika tidak kosong).sumber
sh
? Jika itu shell POSIX,&>
dan>&
tidak akan berfungsi.&>
dan>&
semi-ekivalensi (clobber)Bagian
zsh
Pengalihan manual mengatakan bahwa:&>
>&
adalah setara.
Keduanya akan merusak file - memotong file ke 0 byte sebelum menulis ke sana, seperti yang
> file
akan dilakukan dalam kasus hanya STDIN.Namun , bagian
bash
Pengalihan manual menambahkan bahwa:Jadi, saat Anda memberi tag
zsh
, mungkin latihan yang baik untuk mendapatkan memori jari dalam bentuk pertama seandainya seseorang menulisbash
skrip.>> logfile 2>&1
dan&>>
kesetaraan (tambahkan)Di sini,
logfile
tidak ditimpa, tetapi dibuka untuk menulis di akhir file, yaitu mode tambahkan (O_APPEND
).Setara dalam keduanya
{ba,z}sh
adalah:Dalam
bash
:(Catatan: penggunaan clobber
&>
lebih dari>&
pada bagian di atas direkomendasikan lagi mengingat hanya ada satu cara untuk menambahkanbash
.)zsh
memungkinkan keduanya&>>
dan>>&
formulir.sumber