nohup: ignoring input - что это значит?

Это идеальный вариант использования для ex .

Если вы не слышали о нем, ex является предшественником vi и, как vi , он определен POSIX и доступен практически * везде.

ex на самом деле предназначен для редактирования файла , но вы также можете использовать его без сохранения изменений.


Распечатать изменения, не сохранять в файл:

printf '%s\n' 'g/^,/-j!' %p | ex file.txt

Внести изменения и сохранить в файл:

printf '%s\n' 'g/^,/-j!' x | ex file.txt

Объяснение:

Я использую команду printf в качестве оболочки для ex для редактирования файлов по сценарию. Эта форма имеет то преимущество, что при любом сбое (например, вы передаете команду, которая не является настоящей командой, или вы пытаетесь обратиться к номеру строки, который не существует), команда просто завершается (без сохранения каких-либо изменений), а не ждем другого ввода.

Вы можете просмотреть точные команды, переданные printf в ex , выполнив отдельную команду printf :

$ printf '%s\n' 'g/^,/-j!' %p
g/^,/-j!
%p

Хорошо, что делают эти команды ?

Итак, g - это «глобальная» команда, и она запускает следующую команду во всех строках в «буфере» (файле), которые соответствуют регулярному выражению ^, ( начало строки с запятой).

В данном случае используется команда -j! . - - это адрес, и это означает выполнение следующей команды на предыдущей строке до текущей строки. (Другими словами, в строках до строки начинаются с запятой.)

j используется для «соединения» и соединяет строку со следующей строкой. Восклицательный знак (! ) подавляет использование символа пробела для отделения исходной строки от присоединенной к ней строки.

% - это адрес, означающий «весь буфер», а p означает «печать».

x означает сохранение изменений и выход.

Как я уже сказал, это идеальный пример использования для например .


* За исключением Windows. : P

13
28.07.2017, 16:53
3 ответа

Это просто nohupговорит вам, что он настроен; он выводит это в свою стандартную ошибку, которую вы перенаправили на nohup.err. Вы можете избежать сообщения, перенаправив его стандартный ввод:

nohup bash life.bash > nohup.out 2> nohup.err < /dev/null &

nohupпроверяет свой стандартный ввод, стандартный вывод и стандартную ошибку, чтобы увидеть, какие из них подключены к терминалу; если он находит подключенные, он обрабатывает их соответствующим образом (, игнорируя ввод, перенаправляя вывод на nohup.out, перенаправляя ошибку на стандартный вывод )и сообщая вам, что он сделал. Если он не находит ничего, что нужно отключить, он ничего не выводит сам.

19
27.01.2020, 19:53

nohup сообщает вам, что именно он делает, что он игнорирует ввод.

Если вы хотите избежать этого сообщения, перенаправьте stdin с /dev/nullследующим образом

nohup bash life.bash </dev/null >nohup.out 2>nohup.err &
8
27.01.2020, 19:53
man nohup

«Если стандартный ввод — это терминал, перенаправить его из нечитаемого файла».

Следовательно,

nohup: ignoring input and appending output to 'nohup.out'

Он делает то, что должен, несмотря на записи OPTION , поэтому ввод отбрасывается.

ТАКЖЕ Похоже, вы излишне используете перенаправление. nohup уже создает для вас nohup.out и, если все работает нормально, stderr также должен быть перенаправлен туда.

Ура!

3
27.01.2020, 19:53

Теги

Похожие вопросы