Podzielmy >> /dev/null 2>&1
zdanie na części:
Część 1: >>
przekierowanie wyjścia
Służy do przekierowania wyjścia programu i dołączenia wyjścia na końcu pliku. Więcej...
Część 2: /dev/null
plik specjalny
To jest specjalny plik Pseudo-urządzeń .
Polecenie ls -l /dev/null
poda szczegóły tego pliku:
crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null
Czy zaobserwowałeś crw
? Co oznacza, że jest to plik pseudo-urządzenia , który ma typ znaków specjalnych, który zapewnia dostęp szeregowy.
/dev/null
akceptuje i odrzuca wszystkie dane wejściowe; nie generuje danych wyjściowych (zawsze zwraca wskazanie końca pliku podczas odczytu). Odniesienie: Wikipedia
Część 3: 2>&1
deskryptor pliku
Ilekroć uruchamiasz program, system operacyjny zawsze otwiera trzy pliki, standardowe wejście, standardowe wyjście i standardowy błąd, jak wiemy, gdy plik jest otwierany, system operacyjny (z jądra ) zwraca nieujemną liczbę całkowitą zwaną deskryptorem pliku . Deskryptorem plików dla tych plików są odpowiednio 0, 1 i 2.
Po 2>&1
prostu mówi przekierowanie standardowego błędu na standardowe wyjście.
&
oznacza, że wszystko, co następuje, to deskryptor pliku, a nie nazwa pliku.
Krótko mówiąc, używając tego polecenia, mówisz swojemu programowi, aby nie krzyczał podczas wykonywania.
Jakie znaczenie ma używanie 2>&1
?
Jeśli nie chcesz generować żadnych danych wyjściowych, nawet w przypadku wystąpienia błędu w terminalu. Aby wyjaśnić jaśniej, rozważmy następujący przykład:
$ ls -l > /dev/null
W przypadku powyższego polecenia w terminalu nie wydrukowano żadnych danych wyjściowych, ale co się stanie, jeśli polecenie to spowoduje błąd:
$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory
Mimo że przekierowuję dane wyjściowe /dev/null
, są one drukowane w terminalu. Jest tak, ponieważ nie przekierowujemy danych wyjściowych błędów /dev/null
, więc aby przekierować również dane wyjściowe błędów, należy dodać 2>&1
:
$ ls -l file_doesnot_exists > /dev/null 2>&1
>&- 2>&-
.