Bagaimana cara mengarahkan stderr dan stdout ke file yang berbeda di baris yang sama dalam skrip?

180

Saya tahu banyak tentang ini:

$ command 2>> error

$ command 1>> output

Apakah ada cara saya bisa output stderr ke file kesalahan dan output stdout ke file output di baris yang sama bash?

pengguna784637
sumber

Jawaban:

292

Cukup tambahkan mereka dalam satu baris command 2>> error 1>> output

Namun, perhatikan itu >>untuk menambahkan jika file sudah memiliki data. Padahal, >akan menimpa data yang ada dalam file.

Jadi, command 2> error 1> outputjika Anda tidak ingin menambahkan.

Hanya demi selesai, Anda dapat menulis 1>sebagai hanya >karena file default descriptor adalah output. begitu 1>dan >merupakan hal yang sama.

Jadi, command 2> error 1> outputmenjadi,command 2> error > output

Sujoy
sumber
3
Jawaban bagus! Saya sangat suka penjelasan Anda tentang bagaimana 1>dapat ditulis sebagai>
user784637
Bagaimana ini berbeda dari suka command &2>err.log, saya pikir saya benar-benar membingungkan sintaksis. (Tautan ke jawaban yang tepat dari semua bash pipe-isme mungkin sudah beres)
ThorSummoner
4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html adalah apa yang saya pikir Anda cari. Namun, sepertinya command &2>err.logtidak cukup sah - ampersand dalam sintaks yang digunakan untuk deskriptor file sebagai target, misalnya command 1>&2akan mengubah rute stdout ke stderr.
DreadPirateShawn
@DreadPirateShawn, tolong jangan tautkan ABS sebagai referensi - kadang-kadang berisi ketidaktepatan langsung, dan sangat sering berisi contoh praktik buruk. wiki.bash-hackers.org/howto/redirection_tutorial adalah sumber referensi yang jauh lebih baik tentang pengalihan.
Charles Duffy
27

Coba ini:

your_command 2>stderr.log 1>stdout.log

Informasi lebih lanjut

Angka 0melalui 9adalah deskriptor file dalam bash. 0singkatan dari input standar, 1singkatan dari output standar, 2singkatan dari standard error. 3melalui 9adalah cadangan untuk penggunaan sementara lainnya.

Deskriptor file apa pun dapat dialihkan ke file atau deskriptor file lain menggunakan operator >. Anda bisa menggunakan operator >>untuk menambahkan file daripada membuat yang kosong.

Pemakaian:

file_descriptor > filename

file_descriptor > &file_descriptor

Silakan merujuk ke Panduan Bash-Scripting Lanjutan: Bab 20. I / O Redirection .

Quintus.Zhou
sumber
Terima kasih. Saya mencari ini selama satu jam
dılo sürücü
12

Seperti itu:

$ command >>output 2>>error
Didier Trosset
sumber
9

Atau jika Anda ingin mencampur output (stdout & stderr) dalam satu file tunggal, Anda mungkin ingin menggunakan:

command > merged-output.txt 2>&1
ztank1013
sumber
32
Ini bukan jawaban untuk pertanyaan itu.
Matthias
Mengapa orang menggabungkan output atau menyarankan menggabungkan output?
nurettin
@nurettin: mungkin Anda memiliki baris skrip yang baru saja mengeksekusi perintah dan langsung menyimpan output ke file log. Perintah yang dipermasalahkan mungkin terkadang gagal sehingga Anda ingin menyimpan kesalahan tentang hal itu juga tetapi ke file log yang sama.
streamofstars
@streamofstars ya tentu saja Anda benar mungkin kadang-kadang itulah yang diinginkan orang, saya berkomentar dalam konteks pertanyaan ini sebagai seseorang yang mencari jawaban dan menemukan banyak yang tidak relevan di seluruh stackoverflow.
nurettin
0

Output beberapa perintah 'dapat diarahkan. Ini berfungsi baik untuk baris perintah atau paling berguna dalam skrip bash. The -smengarahkan password prompt untuk layar.

Stdout / stderr cmds Hereblock dikirim ke file terpisah dan tidak ada yang ditampilkan.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Stdout / stderr cmds Hereblock dikirim ke satu file dan tampilan.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Stdout / stderr cmds Hereblock dikirim ke file terpisah dan stdout untuk ditampilkan.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

Tergantung pada siapa Anda (whoami) dan nama pengguna, kata sandi mungkin diperlukan atau tidak diperlukan.

rahogaboom
sumber