Co oznacza „</ dev / null”?


16

Rozumiem, że > /dev/nullprzekierowuje rzeczy, na /dev/nullktóre działa jak czarna dziura. Nie rozumiem jednak, co < /dev/nullto znaczy. Widziałem skrypt napisany w ten sposób:

nohup myprogram > foo.out 2> foo.err < /dev/null &

Co więc < /dev/nulloznacza powyższy kod?

oto przykład, w którym jest to sugerowane


Odpowiedzi:


19

Zapewnia, że ​​wszystkie strumienie we / wy są rozliczane / zajęte.

W ten sposób proces działający w tle nie ma nic „powiązanego” z terminalem, więc możesz zająć się swoją firmą bez próby odczytania z TTY przez program, co spowodowałoby zawieszenie się terminalu.

W tym przypadku, ponieważ uruchamiasz proces za pomocą ssh ze skryptu powłoki, upewnia się, że skrypt może poruszać się bez ograniczeń.


Czy zakłada, że ​​mój program pobiera dane wejściowe, ale w tym przypadku nic nie podaje mojemu programowi jako dane wejściowe?
Qian Chen,

Dzięki. Rozumiem całą resztę oprócz < /dev/null.
Qian Chen,

Jaka jest różnica między kodem a tym samym kodem bez < /dev/null?
Qian Chen,

Właściwie czytam kod stąd: stackoverflow.com/questions/29142/...
Qian Chen

2
cieszę się, że pomogło! przepraszam za obejście; kontekst pomógł jednak, dzięki! - uwaga dodatkowa: usunę kilka moich komentarzy za minutę lub dwie, teraz, gdy wszystko jest przybite, wygląda to
myląco

12

program </dev/nulloznacza, że programpobiera argument wejściowy (może być parametrem wejściowym do opcji lub może być plikiem wejściowym do obsługi) za pomocą deskryptora pliku 0, tj. STDIN, z pliku /dev/null.

Jak już wiesz, /dev/nullnie zawiera nic, powiadomi EOF (koniec pliku) po odczytaniu, więc każdy program, który pobiera dane wejściowe /dev/null, zasadniczo przekierowuje nic jako swój argument wejściowy.


Czy jest jakaś różnica po prostu pominąć < /dev/null? Po prostu napisz to jakonohup myprogram > foo.out 2> foo.err &
Qian Chen,

1
@ ElgsQianChen To zależy od twojego ... programczego chce jako STDIN? Niektóre programy mogą wymagać tego, więc musisz wstawić coś jako STDIN, może tak być w tym przypadku, gdy użyłeś po prostu /dev/nulljako STDIN i pozwolisz programowi wykonać przetwarzanie i umieścił STDOUT i STDERR we wspomnianych plikach.
heemayl

Czy to skutecznie zapobiega blokowaniu procesu przez jakiekolwiek dane wejściowe i po prostu nie przekazuje niczego do żadnego żądania danych wejściowych?
Qian Chen,

1
@ElgsQianChen Spowoduje to zablokowanie deskryptora pliku 0, tj. STDIN, aby nie można było przez to przekazywać żadnych dalszych danych wejściowych .. jeśli nie ma innego FD skonfigurowanego do pobierania danych wejściowych, nie będzie można przekazać żadnych dalszych danych wejściowych do programu.
heemayl
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.