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
program > /results 2> /results
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
the quick brown fox jumped over the lazy dog
dan jalankan perintah
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
kemudian
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
Apa yang terjadi disini?
Pemahaman saya adalah bash setup pengalihan mengarahkan STDERR langsung ke file /tmp/results
dan karena sifat >
yang melakukan 2 hal
- biasanya membuat file baru - dalam hal ini peluang telah berlalu karena bash telah melewati rutin ini pada saat output dihasilkan.
- masukkan langsung ke awal file. dan tidak menambahkan seperti
>>
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 ini
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
The &
memungkinkan bash untuk membedakan dari sebuah file bernama 1
dan 1
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
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 googling