Q&A - jak przekierować STDOUT oraz STDERR do plików?

STDOUT jest standardowym wyjściem, czyli jest to miejsce do którego zwracają wyniki nasze polecenia, STDERR jest standardowym wyjściem błędów, czyli miejscem gdzie nasze polecenia zwracają błędy. Jeśli uruchamiamy coś z konsoli to automatycznie widzimy STDOUT (deskryptor 1) oraz STDERR (deskryptor 2) i jesteśmy w stanie zareagować, ale co w przypadku kiedy nasz skrypt jest uruchamiany z automatu? Pozostaje nam przekierować STDOUT oraz STDERR do plików.

Mam 3 pliki, plik1, plik2 oraz plik3, plik4 nie istnieje.

jamzed@katharsis:~$ cat plik1 plik2 plik3
zawartosc pliku 1
zawartosc pliku 2
zawartosc pliku 3

jamzed@katharsis:~$ cat plik4
cat: plik4: No such file or directory

wydając pierwsze polecenie wynik trafił na STDOUT (nie było błędów), natomiast w drugim przypadku, wynik trafił na STDERR (plik nie istnieje), spróbujmy teraz zapisać wynik do pliku:

jamzed@katharsis:~$ cat plik1 plik2 plik3 plik4 > wynik_stdout
cat: plik4: No such file or directory

do pliku wynik_stdout nie trafi komunikat: "cat: plik4: No such file or directory", ponieważ przekierowaliśmy jedynie STDOUT, a STDERR poszedł na konsolę. Spróbujmy więc przekierować STDOUT oraz STDERR do dwóch różnych plików:

jamzed@katharsis:~$ cat plik1 plik2 plik3 plik4 1> wynik_stdout 2> wynik_stderr

jamzed@katharsis:~$ cat wynik_stdout
zawartosc pliku 1
zawartosc pliku 2
zawartosc pliku 3

jamzed@katharsis:~$ cat wynik_stderr
cat: plik4: No such file or directory

Teraz, znacznie lepiej, mamy dwa pliku (poprawne wykonanie oraz błędy), gdybyśmy chcieli zapisać i STDOUT i STDERR w jednym pliku, użyjemy takiego zapisu:

jamzed@katharsis:~$ cat plik1 plik2 plik3 plik4 > wynik_stdout_stderr 2>&1

jamzed@katharsis:~$ cat wynik_stdout_stderr
zawartosc pliku 1
zawartosc pliku 2
zawartosc pliku 3
cat: plik4: No such file or directory

Więcej przykładów oraz możliwości zarządzania wejściem/wyjściem znajdziecie w manualu dla bash'a (man bash) ;-)