Chcę zobaczyć wynik polecenia w terminalu, jak gdyby nie było przekierowania. Ponadto stderr musi zostać przekierowany do err.log, a stdout musi zostać przekierowany do stdout.log.
Byłoby miło mieć również dokładną kopię tego, co jest wyświetlane w terminalu, tj. Błędy drukowane jako i kiedy występują, w osobnym pliku: stdouterr.log.
bash
logs
io-redirection
balki
źródło
źródło
Odpowiedzi:
Użyj
tee
polecenia w następujący sposób:3>&1 1>&2 2>&3
jest jak zamieniasz stderr i stdout, ponieważ tee może zaakceptować tylko stdout.Spójrz na uniksowe polecenie tee, aby uzyskać bardziej zaawansowane przekierowania
tee
.źródło
cmd
z(cmd ; echo >exit_code.txt $?)
.((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
Myślę, że zalogowanie stdout i stderr do dwóch różnych plików to świetny pomysł. Czy to nie czyni dzienników asynchronicznymi? Więc wypróbowałem następujące:
((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log
w innym terminalu
źródło
&| tee all.log
na końcu polecenia zamiast&> all.log
&|
. Rozumiem&>
,|&
też, ale co to&|
znaczy w tym kontekście? Nie mogłem znaleźć odpowiedniego odwołania do składni, nie w sieci, nawet nie przeglądając strony podręcznika bash „bash (1)” ... Tx|&
@dogbane, Thanks.
Znalazłem też inny sposób, który zapisuje oba strumienie w przybliżeniu w kolejności, w jakiej byłyby drukowane bez przekierowania.
command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog
Ale działa to tylko z powłokami, które obsługują podstawianie procesów.
źródło
Spróbuj tego :
źródło