Что означает «</ dev / null»?

16

Я понимаю, > /dev/nullперенаправляет вещи, на /dev/nullкоторые действует как черная дыра. Однако я не понимаю, что < /dev/nullзначит. Я видел сценарий, написанный следующим образом:

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

Итак, что < /dev/nullв приведенном выше коде означает?

вот пример, где предлагается

Цянь Чен
источник
Возможные дубликаты Каковы операторы управления и перенаправления оболочки?   Также подозрительно похоже на то, что делает <&-?
G-Man говорит: «Восстановите Монику»

Ответы:

19

Это гарантирует, что все потоки ввода / вывода учтены / заняты.

Таким образом, фоновый процесс ничем не «привязан» к терминалу, поэтому вы можете заниматься своими делами без попытки чтения программы из TTY, что может привести к зависанию терминала.

В этом случае, так как вы запускаете процесс через ssh из сценария оболочки, он гарантирует, что этот сценарий может перемещаться без ограничений.

user3276552
источник
Предполагается ли, что myprogram требует некоторый ввод, но в этом случае он ничего не передает myprogram в качестве ввода?
Цянь Чен
Благодарю. Я понимаю все остальное, кроме < /dev/null.
Цянь Чен,
Так в чем же разница между кодом и без него < /dev/null?
Цянь Чен,
Я на самом деле прочитал код здесь: stackoverflow.com/questions/29142/…
Цянь Чен
2
рад, что это помогло! извините за побег; контекст помог, хотя, спасибо! - примечание: я собираюсь удалить кучу своих комментариев через минуту или две, теперь, когда все прибито, это просто сбивает с толку тех, кто его видит
user3276552
12

program </dev/nullозначает, что programон принимает свой входной аргумент (может быть входным параметром для опции или может быть входным файлом для работы) через дескриптор файла 0, то есть STDIN, из файла /dev/null.

Как вы уже знаете, /dev/nullничего не содержит, он будет уведомлять EOF (конец файла) о прочтении, поэтому любая программа, получающая входные данные, /dev/nullбудет в основном ничего не перенаправлять в качестве входного аргумента.

heemayl
источник
Так есть ли какая-то разница, чтобы просто уйти < /dev/null? Просто напишите это какnohup myprogram > foo.out 2> foo.err &
Цянь Чен
1
@ElgsQianChen Это зависит от вашего program.. что он хочет как STDIN? Некоторые программы могут сделать это обязательным, поэтому вам нужно указать что-то как STDIN, в данном случае это может быть случай, когда вы просто использовали его /dev/nullкак STDIN, и пусть программа выполняет обработку и помещает STDOUT и STDERR в упомянутые файлы ...
heemayl
Так эффективно ли он предотвращает блокировку процесса любым вводом и просто ничего не передает на любой запрос ввода?
Цянь Чен
1
@ElgsQianChen Он заблокирует дескриптор файла 0, т. Е. STDIN, так что вы не сможете передавать через него больше ввода ... если нет другого FD, настроенного на получение ввода, вы не сможете дать какой-либо дополнительный ввод в программу.
Heemayl