Saya tahu cara mengarahkan ke file, dan menggunakan tee; pada tingkat dasar. Begitu
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
Pertanyaannya adalah: apa yang harus ditulis sebagai ganti tanda tanya untuk mendapatkan hasil di bawah ini:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
Kendala:
- Dengan asumsi bash.
- Pesanan harus disimpan dalam file.
- konten stderr ditampilkan dalam garis waktu nyata per baris, yaitu tanpa buffering.
- File skrip terpisah dapat digunakan.
- Sihir mungkin diperlukan.
bash
files
io-redirection
TWiStErRob
sumber
sumber
outanderr
program yang Anda miliki?outanderr
hanya sebuah alias yang mencetak baris ke stdout dan yang lain ke stderr. Idenya (jika memungkinkan) adalah untuk membangun solusi generik yang dapat bekerja dengan program apa pun, tanpa memodifikasi mereka.Jawaban:
Untuk pengujian mudah:
Edit 1:
Ini berfungsi dengan menulis stdout (hanya) ke file, membuat sterr stdout sehingga melewati pipa, dan meminta tee menulis hasilnya ke file yang sama.
Kedua penulisan harus dilakukan dalam mode append (
>>
bukan>
) jika tidak keduanya akan saling menimpa output.Karena pipa adalah buffer, tidak ada jaminan bahwa output muncul dalam file dalam urutan yang benar. Ini bahkan tidak akan berubah jika aplikasi terhubung ke kedua file deskriptor (dua pipa). Untuk pesanan yang dijamin, kedua output harus melalui saluran yang sama dan ditandai masing-masing. Atau Anda akan membutuhkan beberapa barang yang benar-benar mewah:
/dev/null
. Output dari aplikasi akan dipisahkan dengan menjalankannyastrace -f -s 32000 -e trace=write
. Anda harus membalik pelarian dalam kasus itu. Tidak perlu dikatakan bahwa aplikasi tidak berjalan lebih cepat dengan dilacak.sumber
stdout
danstderr
untuktee
, atau aku kehilangan sesuatu? Saya pikir persyaratan OP adalahtee
stderr
hanya.