Przyjrzyjrzyjmy się innemu przykładowi. Biorąc pod uwagę następujące dwa polecenia: pierwsze (ls
) jest prawidłowym poleceniem, podczas gdy drugie (ls -0
) jest nieprawidłowym poleceniem, ponieważ zawiera nielegalną opcję -0
.
To jest prawidłowe polecenie:
$ ls
Applications Documents Library Music Public$ echo $?
0
Teraz spójrzmy na nieprawidłowe polecenie:
$ ls -0
ls: illegal option -- 0
usage: ls $ echo $?
1
Problem z drugim skryptem polega na tym, że wyświetla on wszelkie komunikaty o błędach w STDERR
. Jednak w przypadku naszych skryptów, chcemy wyłączyć komunikaty o błędach. Na szczęście istnieje hack, który robi dokładnie to, co chcemy.
Spróbujmy tego ponownie z > /dev/null 2>&1
:
$ ls -0 > /dev/null 2>&1
$ echo $?
1
Zauważmy tym razem, że nie zobaczyliśmy żadnych komunikatów o błędach. Aby to rozłożyć na czynniki pierwsze, tłumimy wyjście błędu (stderr
) polecenia ls -0
, przekierowujemy je na standardowe wyjście (stdout
), zapisujemy je do /dev/null
, a tym samym natychmiast je wyrzucamy. Symbol >&
jest operatorem, który kopiuje wyjście pierwszego deskryptora pliku (2) i przekierowuje na wyjście drugiego deskryptora pliku (1).
Teraz zobaczmy, co reprezentują liczby w 2>&1
, patrząc na ten wykres deskryptorów plików.
Możemy to zweryfikować, zapisując dane wyjściowe do zwykłego pliku zamiast /dev/null
.
$ ls -0 > /tmp/devnull 2>&1
$ echo $?
1$ cat /tmp/devnull
ls: illegal option -- 0
usage: ls
.