Hanya mencari perbedaan di antara keduanya
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
dan portabilitas mereka dengan non-Bourne shells
seperti tcsh
, mksh
, dll
Hanya mencari perbedaan di antara keduanya
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
dan portabilitas mereka dengan non-Bourne shells
seperti tcsh
, mksh
, dll
&>
kompatibilitas bash GNU, sangat disarankan untuk tidak menggunakan ini, karena penguraian dapat mematahkan semantik skrip POSIX yang ada, dan mksh menonaktifkannya dalam mode POSIX.^ /dev/null
apa fungsinya?Jawaban:
Untuk latar belakang:
Pertama mari kita menangani fungsi ini. Untuk referensi, lihat Panduan Script Bash Lanjutan .
Fungsi
2>&-
Bentuk umum dari ini adalah
M>&-
, di mana "M" adalah nomor deskriptor file. Ini akan menutup output untuk deskriptor file mana pun yang direferensikan, yaitu "M" .2>/dev/null
Bentuk umum dari ini adalah
M>/dev/null
, di mana "M" adalah nomor deskriptor file. Ini akan mengarahkan file descriptor, "M" , ke/dev/null
.2>&1
Bentuk umum dari ini adalah
M>&N
, di mana "M" & "N" adalah nomor deskriptor file. Ini menggabungkan output dari deskriptor file "M" dan "N" menjadi satu aliran.|&
Ini hanya singkatan untuk
2>&1 |
. Itu ditambahkan di Bash 4.&>/dev/null
Ini hanya singkatan untuk
>/dev/null 2>&1
. Ini mengarahkan file deskriptor 2 (STDERR) dan deskriptor 1 (STDOUT) ke/dev/null
.>/dev/null
Ini hanya singkatan untuk
1>/dev/null
. Ini mengarahkan file descriptor 1 (STDOUT) ke/dev/null
.Portabilitas ke non-bash, tcsh, mksh, dll.
Saya belum banyak berurusan dengan kerang lain di luar
csh
dantcsh
. Pengalaman saya dengan 2 orang itu dibandingkan dengan operator pengalihan bash, adalah bahwa bash lebih unggul dalam hal itu. Lihat halaman manual tcsh untuk lebih jelasnya.Dari perintah yang Anda tanyakan tidak ada yang secara langsung didukung oleh csh / tcsh. Anda harus menggunakan sintaks yang berbeda untuk membangun fungsi yang sama.
sumber
2>&-
vs2>/dev/null
(selain itu beberapa program yang ditulis dengan "buruk" tidak membatalkan2>&-
dengan benar)?&>
sudahbash
sejak awal (dan istirahat kompatibilitas Bourne dan POSIX karena itu berarti sesuatu yang berbeda di sana, meskipun tidak mungkin untuk dipukul).>&
dan|&
berasal dari(t)csh
(dan itu satu-satunya cara mereka untuk mengarahkan stderr). Mereka masukzsh
dari awal dan hanya ditambahkan baru-baru ini kebash
. Lihat jugarc
untuk operator yang dirancang lebih baik.(+2-2=0)
. Sekarang, ke bagian edisi, saya tidak mengedit banyak, tetapi dalam hal ini saya akan, karena itu menjelaskan bahwa data setelah operasi akan berada diN
. Saya sudah membaca jawaban Anda, dan sangat baik dalam semua aspek. Ketidakjelasan kecil ini membuat saya berpikir, itu sebabnya edisi ini. Tapi ok, jangan ragu untuk menambahkan kembali atau menolaknya, seperti yang Anda mau. Saya harap saya bisa menjelaskan maksudnya. Terus bekerja dengan baik.Ini untuk mengarahkan kembali STDERR & STDOUT:
2>/dev/null
Redirect STDERR ke / dev / null (mencegah agar tidak muncul di konsol)
|&
Redirect STDERR dan STDOUT ke STDIN dari perintah piped (cmd1 | & cmd2)
&>/dev/null
Redirect STDERR & STDOUT ke / dev / null (tidak ada yang muncul di konsol)
>/dev/null
Redirect STDOUT ke / dev / null (hanya STDERR yang ditampilkan di konsol)
2>&-
Apakah untuk menutup deskriptor file yang digunakan dengan pengalihan
Ini semua adalah metode pengalihan standar untuk kulit Bourne.
sumber
|&
dan&>/dev/null
yang tidak portabel.Anggap ini sebagai tambahan untuk jawaban yang dipilih. Anda mungkin ingin tahu formulir mana yang POSIX dan mana yang tidak.
Dua formulir POSIX terlibat:
-
Karena itu:
Baris terakhir tidak ada dalam pertanyaan awal, tetapi bekerja tanpa keluhan di bash. (Juga berfungsi dengan / dev / tty yang diganti dengan / dev / null).
sumber