Menangkap STDERR dan STDOUT ke file menggunakan tee

15

Saya tidak jelas apa urutan terbaik untuk mengambil keduanya STDERRdan STDOUTmenggunakan file yang sama tee. Saya tahu bahwa jika saya ingin melakukan pipe ke file saya harus memetakan filehandle setelah redirect, yaitu

find . >/tmp/output.txt 2>&1

Ini menginstruksikan shell untuk mengirim STDOUTke /tmp/output.txtdan kemudian mengirim STDERRke STDOUT(yang sekarang mengirim ke /tmp/output.txt).

Mencoba melakukan 2>&1sebelum mengarahkan file tidak akan memiliki efek yang diinginkan.

Namun ketika saya ingin menggunakan pipa teeseharusnya:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?
PP
sumber

Jawaban:

18

Yang terakhir; itu memastikan STDOUT dan STDERR dari perintah asli pergi ke fd yang sama, kemudian memberi mereka bersama-sama ke tee. Dalam kasus sebelumnya, itu adalah STDERR dari perintah tee yang Anda akan bergabung dengan STDOUT-nya.

MadHatter
sumber
5
Menariknya halaman manual bash mengatakan, "Jika |&digunakan, kesalahan standar command1 terhubung ke input standar command2 melalui pipa; itu adalah singkatan 2>&1 |. Pengalihan implisit dari kesalahan standar ini dilakukan setelah setiap pengalihan ditentukan oleh perintah."
PP.
Saya harus membuat program C kecil yang menulis baik untuk stderrdan stdoutuntuk memahami masalah ini. Pengalihan >dan |operator tee berbeda ketika mencoba untuk menangkap kedua aliran output. Untuk pengalihan saya harus ./testapp > /tmp/out.log 2>&1. Sedangkan untuk tee saya harus ./testapp 2>&1 | tee /tmp/out.log.
typelogic
@dxxtr untuk apa nilainya, |biasanya disebut sebagai operator pipa. teemerujuk hanya ke program tertentu yang sedang dipanggil di ujung pipa.
MadHatter