Menurut " Linux: The Complete Reference 6th Edition " (hal 44), Anda hanya dapat mem- pipe STDERR menggunakan |&
simbol pengalihan.
Saya telah menulis skrip yang cukup sederhana untuk menguji ini:
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
Saya menjalankan skrip ini seperti ini:
./script.sh |& sed 's:^:\t:'
Agaknya, hanya garis yang dicetak ke STDERR yang akan diindentasi. Namun, sebenarnya tidak berfungsi seperti ini, seperti yang saya lihat:
Normal Text.
Error Text.
Apa yang saya lakukan salah di sini?
sumber
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
tidak bekerja sebagaimana dimaksud, yaitu: redirectscript.sh
'sstdout
(yang menurut potongan pengguna harus terjadi dahulu), kemudian memungkinkangrep
untuk memproses scriptstderr
. Sebaliknya,stderr
dan tdout` keduanya berakhir distdout_goes_here
|&
adalah singkatan untuk2>&1 |
. Jadi>/tmp/stdout_goes_here |&
pengalihan stdout ke/tmp/stdout_goes_here
, lalu2>&1
pengalihan stderr ke mana pun stdout pergi, yaitu/tmp/stdout_goes_here
, dan akhirnya|
tidak menerima input apa pun karena output dari perintah telah diarahkan. Ingatlah bahwa>&1
pengalihan ke mana pun file deskriptor 1 sedang berjalan , bukan ke mana pun deskriptor file 1 akan berakhir . Untuk mem-pipe stderr saja dan mengarahkan stdout ke file, salah satu caranya adalah2>&1 >/tmp/stdout_goes_here |
.|&
pipa stderr ke stdin, suka2>&1 |
, jadi program selanjutnya akan mendapatkan keduanya di stdin.sumber
runcommand 2>&1 | tee
? yaituruncommand |& tee
?|&
di bash hanyalah jalan pintas (tidak terlalu portabel) untuk2>&1 |
, jadi Anda akan melihat setiap baris diindentasi.sumber