Tampaknya versi bash yang lebih baru memiliki &>
operator, yang (jika saya mengerti dengan benar), mengarahkan ulang stdout dan stderr ke sebuah file ( &>>
sebagai gantinya ditambahkan ke file, seperti yang diklarifikasi Adrian).
Apa cara paling sederhana untuk mencapai hal yang sama, tetapi sebaliknya mengirim ke perintah lain?
Misalnya, di baris ini:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Saya ingin grep dicocokkan dengan konten, baik di stdout dan stderr (secara efektif, digabungkan menjadi satu aliran).
Catatan : pertanyaan ini menanyakan tentang pemipaan, bukan pengalihan - jadi itu bukan duplikat dari pertanyaan yang saat ini ditandai sebagai duplikat dari.
|&
pintasan, yang menurut saya sejauh ini merupakan solusi paling mudah untuk "mengarahkan ulang stdout dan stderr ke sebuah pipa".Jawaban:
(Perhatikan bahwa
&>>file
menambahkan file sementara&>
akan mengarahkan ulang dan menimpa file yang sudah ada sebelumnya.)Untuk menggabungkan
stdout
danstderr
Anda akan mengarahkan yang terakhir ke yang sebelumnya menggunakan2>&1
. Ini mengarahkan ulang stderr (deskriptor file 2) ke stdout (deskriptor file 1), misalnya:stdout
pergi ke stdout,stderr
pergi ke stderr.grep
hanya melihatstdout
, karenanyastderr
mencetak ke terminal.Di samping itu:
Setelah menulis ke stdout dan stderr,
2>&1
pengalihan stderr kembali ke stdout dangrep
melihat kedua string pada stdin, sehingga menyaring keduanya.Anda dapat membaca lebih lanjut tentang pengalihan di sini .
Mengenai contoh Anda (POSIX):
atau, menggunakan
>=bash-4
:sumber
&>>
. Saya telah memperbaiki pertanyaan saya.|&
sebagai ganti2>&1 |
.|&
diusulkan oleh @ AdrianFrühwirth untuk pembaca di masa mendatang: fitur ini hanya didukung denganbash
versi 4+. Jika Anda menggunakan 3 atau lebih rendah, Anda harus menggunakannya2>&1 |
.Bash memiliki singkatan untuk
2>&1 |
, yaitu|&
, yang pipa stdout dan stderr (lihat manual ):Ini diperkenalkan di Bash 4.0, lihat catatan rilis .
sumber