Przechwytywanie danych wyjściowych / przekierowań poleceń powiązanych przez &&

11

I mają szereg poleceń, A, B, C, co mam łańcuchowy wraz z &&: a && b && c.

Chcę przechwycić dane wyjściowe wszystkich poleceń zarówno na stdout, jak i stderr. a && b && c 2>&1 > capture_file przechwytuje tylko dane wyjściowe polecenia c.

TLOlczyk
źródło

Odpowiedzi:

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

Zwróć uwagę na kolejność przekierowań: najpierw musisz przekierować standardowe wyjście.

yaegashi
źródło
Dlaczego pierwszy?
TLOlczyk,
@TLOlczyk 2>&1oznacza duplikowanie miejsca docelowego stdout (1) na stderr (2), więc byłoby bezużyteczne, chyba że wcześniej skonfigurowałeś przekierowanie stdout.
yaegashi,
2
@TLOlczyk Nie musi to być najpierw stdout - możesz najpierw zrobić stderr: 2>capture_file >&2(ale nie, bo to nie jest idiomatyczne). Ważne jest, abyś przekierował jeden z nich do pliku przed skopiowaniem tego strumienia do drugiego.
Toby Speight,
1

Oprócz korzystania z grupowania poleceń {}możesz także uruchamiać polecenia w podpowłoce i jednocześnie przechwytywać dane wyjściowe (i / lub błędy):

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

Przykład:

$ ( 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
źródło