Saya berasumsi Anda ingin tetap melihat STDERR dan STDOUT di terminal. Anda bisa mencari jawaban Josh Kelley, tetapi saya menemukan tail
latar belakang yang menghasilkan file log Anda sangat rapuh dan kasar. Perhatikan bagaimana Anda perlu menyimpan FD exra dan melakukan pembersihan setelah itu dengan membunuhnya dan secara teknis harus melakukan itu dalam trap '...' EXIT
.
Ada cara yang lebih baik untuk melakukan hal ini, dan Anda sudah menemukannya: tee
.
Hanya, alih-alih hanya menggunakannya untuk stdout Anda, miliki tee untuk stdout dan satu untuk stderr. Bagaimana Anda akan mencapai ini? Substitusi proses dan pengalihan file:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
Mari kita bagi dan jelaskan:
> >(..)
>(...)
(substitusi proses) membuat FIFO dan mari kita tee
dengarkan. Kemudian, ia menggunakan >
(pengalihan file) untuk mengarahkan kembali STDOUT command
ke FIFO yang pertama kali Anda tee
dengarkan.
Hal yang sama untuk yang kedua:
2> >(tee -a stderr.log >&2)
Kami menggunakan subtitusi proses lagi untuk membuat tee
proses yang membaca dari STDIN dan memasukkannya ke dalam stderr.log
. tee
mengembalikan inputnya kembali ke STDOUT, tetapi karena inputnya adalah STDERR kami, kami ingin mengarahkan kembali tee
STDOUT ke STDERR kami. Kemudian kami menggunakan pengalihan file untuk mengarahkan kembali command
STDERR ke input FIFO ( tee
STDIN).
Lihat http://mywiki.wooledge.org/BashGuide/InputAndOutput
Substitusi proses adalah salah satu dari hal-hal yang sangat menyenangkan yang Anda dapatkan sebagai bonus dengan memilih bash
sebagai pengganti shell Anda sh
(POSIX atau Bourne).
Di sh
, Anda harus melakukan hal-hal secara manual:
out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"