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


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).


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.