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

Qian Chen
źródło
Możliwe duplikaty Co to są operatory kontroli i przekierowania powłoki?   Również podejrzanie podobny do Co robi <&-?
G-Man mówi „Przywróć Monikę”

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ń.

użytkownik3276552
źródło
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.

heemayl
źródło
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