Saya berasumsi Anda ingin tetap melihat STDERR dan STDOUT di terminal. Anda bisa mencari jawaban Josh Kelley, tetapi saya menemukan taillatar 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 teedengarkan. Kemudian, ia menggunakan >(pengalihan file) untuk mengarahkan kembali STDOUT commandke FIFO yang pertama kali Anda teedengarkan.
Hal yang sama untuk yang kedua:
2> >(tee -a stderr.log >&2)
Kami menggunakan subtitusi proses lagi untuk membuat teeproses yang membaca dari STDIN dan memasukkannya ke dalam stderr.log. teemengembalikan inputnya kembali ke STDOUT, tetapi karena inputnya adalah STDERR kami, kami ingin mengarahkan kembali teeSTDOUT ke STDERR kami. Kemudian kami menggunakan pengalihan file untuk mengarahkan kembali commandSTDERR ke input FIFO ( teeSTDIN).
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 bashsebagai 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"