Menangkap output / redirection dari perintah yang dirantai oleh &&

11

Saya memiliki serangkaian perintah a, b, c yang saya chaining bersama-sama dengan &&: a && b && c.

Saya ingin menangkap output dari semua perintah untuk stdout dan stderr. a && b && c 2>&1 > capture_file hanya menangkap output dari perintah c.

TLOlczyk
sumber

Jawaban:

11
{ a && b && c; } >capture_file 2>&1

Perhatikan urutan pengalihan: Anda harus mengarahkan ulang stdout terlebih dahulu.

yaegashi
sumber
Kenapa stdout dulu?
TLOlczyk
@TLOlczyk 2>&1berarti menduplikasi tujuan stdout (1) ke stderr (2), jadi itu akan sia-sia kecuali Anda sudah mengatur pengalihan stdout sebelumnya.
yaegashi
2
@TLOlczyk Tidak harus menjadi stdout pertama - Anda bisa melakukan stderr pertama: 2>capture_file >&2(tapi tidak, karena itu tidak idiomatik). Yang penting adalah Anda mengarahkan salah satu dari mereka ke file sebelum menduplikasi aliran itu ke yang lain.
Toby Speight
1

Selain menggunakan pengelompokan perintah, {}Anda juga dapat menjalankan perintah dalam subkulit dan menangkap output (dan / atau kesalahan) sekaligus:

( a && b && c ) >file.txt 2>&1

Contoh:

$ ( echo foo && echo bar && echo baz && echos foo ) >check 2>&1

$ cat check
foo
bar
baz
No command 'echos' found, did you mean:
 Command 'echo' from package 'coreutils' (main)
echos: command not found
heemayl
sumber