Ada dua bentuk redirection yaitu output standar dan standard error menjadi output standar . Tapi mana yang lebih baik? dan mengapa &>
dianggap sempurna?
Saya tidak dapat menemukan perbedaannya sehingga banyak tutorial dan bahkan bash manual yang &>
lebih baik!
Jadi, mengapa saya harus menggunakan &>
dan tidak2>&1
Terutama menggunakan bash
shell
EDIT: Terima kasih atas komentatornya
Hanya> & bekerja di csh atau tcsh
Dalam ksh hanya 2> & 1 yang berfungsi.
gunakan dash> file 2> & 1 pengalihan saja
Lalu yang mana yang digunakan untuk memastikan skrip saya kompatibel dengan sistem lain apa pun kerang yang digunakan!
command-line
bash
redirect
Maythux
sumber
sumber
&> somewhere
hanyalah singkatan bash untuk> somewhere 2>&1
: dalam kata-kata manual bash, mereka "setara secara symantically"Jawaban:
Halaman manual Bash menyebutkan ada dua cara untuk mengarahkan stderr dan stdout :
&> file
dan>& file
. Sekarang, perhatikan bahwa ia mengatakan stderr dan stdout.Dalam hal ini
>file 2>&1
kita melakukan pengalihan stdout (1) ke file, tetapi kemudian juga memberitahu stderr (2) untuk diarahkan ke tempat yang sama dengan stdout! Jadi tujuannya mungkin sama, tetapi idenya sedikit berbeda. Dengan kata lain "John, pergi ke sekolah; Suzzie pergi ke mana John pergi".Bagaimana dengan preferensi?
&>
adalah suatubash
hal. Jadi, jika Anda mengirim skrip, itu tidak akan berhasil. Tetapi jika Anda 100% yakin skrip Anda hanya akan bekerja pada sistem dengan bash - maka tidak ada preferensiBerikut adalah contoh dengan
dash
, Debian Amquist Shell yang merupakan default Ubuntu.Seperti yang Anda lihat, stderr tidak sedang diarahkan
Untuk mengatasi suntingan Anda dalam pertanyaan, Anda dapat menggunakan pernyataan if untuk memeriksa variabel $ SHELL dan mengubah arahan yang sesuai
Tetapi untuk sebagian besar kasus
> file 2>&1
harus bekerjaDalam istilah yang lebih teknis, formulir
[integer]>&word
ini disebut Duplicating Output File Descriptor , dan merupakan fitur yang ditentukan oleh standar Bahasa Perintah POSIX Shell, yang didukung oleh sebagian besar kerang yang sesuai dengan POSIX dan mirip-Brourne.Lihat juga Apa maksud & tepatnya dalam redirection output?
sumber
&>
.... @ Maythux Dalam kerang yang tidak mendukung&>
misalnyadash
Anda perlu menggunakan>file 2>&1
pengalihan sepele ..>file 2>&1
. Ini bekerja pada semua kerang/etc/passwd
untuk setiap pengguna adalah kerang interaktif. Skrip sistem biasanya untukdash
kecuali ditentukan lain. Adapun apa yang default, itu ditentukan oleh apa yang disinkronkan ke/bin/sh
Dalam kasus Ubuntu itudash
. Di RHEL itu adalahbash
, di FreeBSD itu adalahtcsh
sumber dan sumber lainSaya biasanya akan merekomendasikan mengikuti cara Bourne-again SHell dalam melakukan sesuatu, karena bash bisa dibilang shell Unix paling populer di luar sana. Bash biasanya menggunakan salah satu
&>
atau2>&1
. IMHO, tidak ada yang "sempurna", jadi saya sarankan melupakan omong kosong itu. Secara realistis, yang mana yang harus Anda gunakan tergantung pada apa yang Anda coba lakukan.2>&1
menggabungkan stderr dengan stdout, yang dapat berguna jika, misalnya, Anda ingin mem-pipe teks stderr. Jadi, misalnya, jika Anda ingin melihat apakah suatu program mencetak pesan stderr tertentu, tetapi tidak ingin layar Anda diisi dengan (mungkin) sampah yang tidak penting, Anda dapat melakukan sesuatu sepertiprogram 2>&1 | grep crashed
, yang akan mencari stdout dan stderr dari suatu program disebut "program" untuk kata "crash".Di sisi lain, jika Anda tidak ingin program untuk mencetak apa pun, Anda bisa menjalankannya
program &> /dev/null
, yang akan mengarahkan ulang stderr dan stdout ke / dev / null, file khusus yang secara ajaib membuat semuanya hilang. Atau, jika Anda ingin menyimpan output dari suatu program (mungkin untuk melaporkan bug atau sesuatu), Anda bisa mengarahkan ulang stderr dan stdout ke file:program &> log.txt
akan mengarahkan semua data ke file yang disebut "log.txt". Jika Anda mau, Anda bisa mengarahkan stdout dan stderr melaluiprogram 2> log.txt > log.txt
atauprogram 2>&1 | cat > log.txt
, keduanya akan memiliki efek yang sama seperti menggunakan&>
. Jika Anda melakukan sesuatu sepertiprogram 2>&1 > file
, hanya stdout yang akan diarahkan, tetapi stderr masih dapat disalurkan ke program lain, seperti cat, yang dapat diarahkan seperti yang ditunjukkan di atas. Namun, mengetik&>
lebih mudah daripada contoh-contoh di atas, karena itu melibatkan mengetik lebih sedikit karakter (dan itu agak lebih mudah bagi manusia untuk membaca). Perhatikan bahwaprogram 2> log.txt > log.txt
mungkin lebih baik bekerja pada cangkang non-bash.PS: jika Anda khawatir tentang orang yang menggunakan kerang lain, ada sesuatu yang dapat Anda tambahkan untuk menjadi baris pertama dari skrip Anda yang disebut "angka ajaib", atau "shebang". Ini pada dasarnya adalah cara untuk memastikan komputer lain (terutama yang menjalankan sistem operasi mirip Unix) tahu program mana yang digunakan untuk menjalankan skrip. Script yang berbeda menggunakan shebang yang berbeda. Shebang untuk skrip bash terlihat seperti ini:
Jika Anda menggunakan di atas sebagai baris pertama skrip yang diberikan, bash umumnya akan digunakan untuk mengeksekusi skrip tersebut. Ini akan membuat jauh lebih sulit bagi seseorang untuk secara tidak sengaja mengeksekusi skrip dengan shell yang salah.
PS: Saya tidak akan berbohong: sampai sekarang, saya tidak tahu ada yang bisa menggunakan
>&
, tetapi sejauh menyangkut bash, sepertinya melakukan hal yang sama&>
. Anda belajar sesuatu yang baru setiap hari.sumber
#!
jalur untuk meminta secara eksplisitbash
, itu tidak selalu tersedia di sistem lain. Sangat sering pengembang / sysadmin harus menulis skrip portabel untuk sistem yangbash
mungkin tidak tersedia dan mungkin tidak berada di bawah kendali mereka untuk menginstalbash
. Ini>file 2>&1
hanya banyak portabel.>file 2>&1
lebih portabel bagus untuk diketahui. Saya akan mengedit agar mencerminkan hal itu.Dari Bash Reference Manual -> 3.6.4 Mengarahkan Output Standar dan Kesalahan Standar :
Juga bagus untuk merujuk ke wiki Greg pada Input dan Output -> 4.2. Manipulasi Penjelasan File :
sumber
2>&1
adalah shell Bourne / POSIX standar.&>
adalah ekstensi bash dan bukan standar de jure .Jika Anda menulis skrip menggunakan ekstensi bash, cepat atau lambat Anda akan menemui kegagalan goresan kepala dengan pesan kesalahan sintaksis kriptik karena sedang dijalankan dalam shell standar.
sumber