Saya baru mengenal bash dan saya tidak bisa seumur hidup mencari tahu cara menjalankan perintah tertentu, misalkan ./fff
dan cetak stdouts reguler sebelum stderr (saya bingung tentang artinya sendiri)
sebagai contoh
$ printf "I am a\ndrill\n" > fff;
$ cat fff nofile fff nofile fff
I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill
perlu dicetak seperti:
I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory
Saya mengerti bahwa saya harus mengarahkan output saya terlebih dahulu ke file dan kemudian menambahkan kesalahan ke file yang sama namun ini adalah output yang saya dapatkan untuk
$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see
I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory
cat
benar-benar mengganti "a" dengan "some"?Jawaban:
Anda harus menahan output stderr di suatu tempat agar dapat menampilkannya di akhir.
Sebuah file muncul di benak:
Atau memori (di sini menggunakan
sponge
darimoreutils
):{...} 3>&1
: dalam{...}
deskriptor file (fd) 3 menunjuk ke sumber yang sama dengan stdout asli (sehingga kita dapat menggunakannya untuk mengembalikan stdout untukfff
).fff <redirs> | sponge <redirs>
,fff
dansponge
mulai bersamaan (dengan<redirs>
diterapkan secara independen) denganfff
stdout pergi ke pipa, dansponge
stdin menjadi ujung pipa yang lain.2>&1
: fd 2 offff
(stderr) menunjuk ke hal yang sama seperti pada 1: pipa pada titik ini, jadifff
kesalahannya adalahsponge
melalui pipa itu.>&3
: sekarang stdout menunjuk ke stdout asli (mengarahkan kembali ke apa itu sebelumnya)3>&-
: kita menutup fd 2 yangfff
tidak perlusponge
mengakumulasikan inputnya dan hanya menampilkannya (pada stdout-nya yang telah dialihkan>&2
ke sumber daya yang sama dengan stderr) setelah ia mendeteksi bukti pada stdin-nya (diasumsikan ketikafff
mengakhiri dan telah menulis semua outputnya pada stdout-nya).Jika
sponge
tidak diinstal, Anda dapat menggantinya denganperl -0777 -pe ''
. Dengan-pe ''
,perl
membaca satu catatan sekaligus dari inputnya dan menulisnya di stdout.-0777
adalah mode slurp di mana (hanya satu dalam kasus itu) catatan adalah seluruh input.sumber
tee
alih-alihsponge
...?tee
tidak menyimpan data, ia menulisnya segera setelah membacanya.cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt
. (Dan Anda mungkin tidak ingin menggunakan>>
.) Juga, Stéphane membuat poin yang sangat baik yang mungkin harus Anda lakukancat ferr.txt >&2
untuk menulis informasi stderr ke stderr.