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 3jamzed@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 3jamzed@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) ;-)