Perbedaan pengalihan antara &>> & dan 2> & 1

12

Pada utas SO ini dan beberapa utas lainnya, saya telah melihat perintah berikut untuk mengarahkan ulang stdoutdan stderrke file.

Apakah semuanya setara? Apakah ada perbedaan di antara mereka?

command1 >> logfile 2>&1
command &> logfile
command >& logfile
Amelio Vazquez-Reina
sumber
1
Dua yang terakhir adalah equivilent: stackoverflow.com/q/11255447/1032785
jordanm

Jawaban:

7

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 mengarahkan stderrke stdoutinturn 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 bashdanzsh

Tapi:

Hanya >&berfungsi di cshatautcsh

[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 ~]$

Dalam kshhanya 2>&1karya.

$ ./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

Saya benci ksh. Sementara >&hanya memberikan kesalahan, &>latar belakang bagian dari perintah dan mengosongkan logfile (jika tidak kosong).

Sree
sumber
1
Apa yang Anda maksud sh? Jika itu shell POSIX, &>dan >&tidak akan berfungsi.
cuonglm
Sayangnya pernyataan pertama secara faktual salah. Lihat jawaban saya untuk clobber vs append.
Tom Hale
1

&>dan >&semi-ekivalensi (clobber)

Bagian zshPengalihan manual mengatakan bahwa:

  • &>
  • >&

adalah setara.

Keduanya akan merusak file - memotong file ke 0 byte sebelum menulis ke sana, seperti yang > fileakan dilakukan dalam kasus hanya STDIN.

Namun , bagian bashPengalihan manual menambahkan bahwa:

Dari dua bentuk, yang pertama lebih disukai. Ini setara dengan semantik

>word 2>&1

Saat menggunakan formulir kedua, kata mungkin tidak diperluas ke angka atau -. Jika ya, operator redirection lain berlaku (lihat Duplicating File Descriptors di bawah) untuk alasan kompatibilitas.

Jadi, saat Anda memberi tag zsh, mungkin latihan yang baik untuk mendapatkan memori jari dalam bentuk pertama seandainya seseorang menulis bashskrip.

>> logfile 2>&1dan &>>kesetaraan (tambahkan)

Di sini, logfiletidak ditimpa, tetapi dibuka untuk menulis di akhir file, yaitu mode tambahkan ( O_APPEND).

Setara dalam keduanya {ba,z}shadalah:

command1 &>> logfile

Dalam bash:

Format untuk menambahkan output standar dan kesalahan standar adalah:

&>>word

Ini setara dengan semantik

>>word 2>&1

(lihat Penggandaan File Pengganda di bawah).

(Catatan: penggunaan clobber &>lebih dari >&pada bagian di atas direkomendasikan lagi mengingat hanya ada satu cara untuk menambahkan bash.)

zshmemungkinkan keduanya &>>dan >>&formulir.

Tom Hale
sumber