Saya tahu apa
program > /dev/null 2>&1
tidak. Ini mengarahkan ulang output ke /dev/null
dan 2>&1
berarti untuk mengarahkan output kesalahan di tempat yang sama di mana output dikirim.
Masalah saya adalah saya selalu harus google karena saya tidak pernah mengingatnya.
Jadi, saya mencoba &2>1
, 1>2&
, 1>&2
... Aku mencoba setiap kombinasi sampai aku google itu ...
Apa trik untuk mengingatnya dengan mudah?
program 1> /dev/null 2>/dev/null
. Namun kadang-kadang Anda perlu mencampurstdout
danstderr
bersama - sama untuk melihat apa yang sebenarnya terjadi - seperti output dari proses kompilasi yang rumit diarahkan ke file. Dalam hal ini, saya akhirnya googlingJawaban:
Output lebih baik daripada kesalahan sehingga lebih dulu (1 vs 2).
>
adalah singkatan untuk 'pergi ke'. Di sebelah kiri adalah apa yang ingin saya kirim dan di sebelah kanan adalah tempat saya ingin mengirimnya. Karena 'di mana' adalah (hampir) selalu menjadi file, sesuatu sepertiakan mengalihkan ke file bernama 1. Dengan demikian, ampersand
(&)
memodifikasi file ke file descriptor.Sayangnya, saya belum menemukan atau mengembangkan mnemonik saya sendiri, tetapi ketika saya pertama kali belajar * nix, saya menemukan cara logis untuk bekerja dengan baik. Setelah beberapa kali run-through, itu menjadi kebiasaan.
sumber
stdout
adalah file descriptor 1,stderr
is 2. Jadi, "error" hadir sebelum "output".stdout
danstderr
merujuk.Satu trik hanya untuk mengingat bahwa 1 = output standar, 2 = kesalahan standar. Begitu:
2>&1
= aliran kesalahan standar masuk ke aliran keluaran standar.1>&2
= sebaliknya.Jika Anda pernah memprogram dalam bahasa mirip-C, mudah untuk mengingat ampersand (
&
). Saya memilih untuk menganggapnya sebagai merujuk ke "alamat" deskriptor file yang ada, sehingga Anda tidak mengubah file itu sendiri atau membuat yang baru.sumber
Melihatnya
&
sebagai simpul mungkin membantu: pikirkan tentang apa yang ingin Anda lakukan sebagai mengambil hasil 2, jadi2>
, dan mengikatnya bersama 1, jadi2>&1
sumber
Sebenarnya, itu tergantung pada shell apa yang Anda gunakan. Bash biasanya sangat pemaaf dan Anda bisa melakukannya:
sumber
Mari kita pertimbangkan tiga opsi ini:
Yang pertama mengirim stderr ke nama file "1": setelah semua, bash berharap untuk mengarahkan ulang ke file.
Yang kedua juga mengarahkan ke file yang sama tetapi berjalan
program
di latar: itulah yang&
seharusnya berarti trailing .Itu meninggalkan kemungkinan ketiga sebagai satu-satunya yang masuk akal di bash universe untuk mengarahkan ke file menangani.
Bagaimana cara mengingat yang mana di antara 0, 1, 2? Pikirkan tentang menjalankan komputer dari konsol. Pertama, Anda harus mengetikkan sesuatu (0 = stdin). Kemudian, Anda melihat output (1 = stdout). Terakhir dan hanya jika ada kesalahan, Anda melihat stderr (2).
sumber
Gambarlah di wallpaper Anda.
Sekarang, serius, ini dan hal-hal dasar lainnya yang saya selalu lupa, jadi saya menambahkan menu tips cepat ke aplikasi yang saya kembangkan dan yang saya gunakan setiap hari. Anda mungkin ingin mencobanya atau menggunakan sesuatu seperti gnote untuk membuat catatan.
sumber
Sehubungan dengan bash shell saya menemukan cara terbaik untuk diingat adalah dengan memahami apa yang terjadi.
Jika semua yang ingin Anda lakukan adalah mengingat bagaimana cara mendapatkan perintah yang benar, Anda dapat mencoba
Itu bagus dan jelas apa yang terjadi dan mudah diingat. yaitu
1
STDOUT akan melakukannya/results
2
STDERR juga akan langsung ke/results
masalahnya adalah ini tidak berfungsi seperti yang Anda harapkan. pertimbangkan hal berikut:
mengajukan:
/tmp/poem.txt
dan jalankan perintah
kemudian
Apa yang terjadi disini?
Pemahaman saya adalah bash setup pengalihan mengarahkan STDERR langsung ke file
/tmp/results
dan karena sifat>
yang melakukan 2 hal>>
halnya.Jadi dalam hal ini STDERR, menyisipkan langsung ke awal
/tmp/results
mengesampingkan output dari STDOUT.Catatan: jika Anda terbiasa
>>
menambahkan Anda mungkin bisa lolos dengan sintaks ini.Namun untuk memperbaiki masalah yang Anda butuhkan - bukan untuk mengarahkan ulang STDERR - ke file secara langsung, tetapi untuk menggabungkan output STDERR ke dalam aliran STDOUT, sehingga Anda tidak mendapatkan tabrakan.
Menggunakan operator,
2>&1
operator mencapai iniThe
&
memungkinkan bash untuk membedakan dari sebuah file bernama1
dan1
file descriptor.Bagi saya pernyataan
2>&1
itu sendiri menjelaskan dengan tepat apa yang terjadi - STDERR sedang dialihkan ke STDOUT itu sendiri - dan hanya berakhir/tmp/results
karena di situlah STDOUT diarahkan (hampir sebagai efek samping).Berbeda dengan apa yang diklaim oleh banyak pemandu, yaitu yang
2>&1
mengirim STDERR ke mana pun STDOUT diarahkan. Jika itu benar - Anda masih akan memiliki masalah penulisan ulang.Untuk informasi lebih lanjut, lihat - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
sumber