Как правильно использовать команду nohup в пользовательском скрипте

Предположим, что ваш первый большой файл имеет имя target.txt, а второй файл меньшего размера — source.txt.

tail +3 source.txt | while IFS= read -r line; do grep "$line" target.txt > "$line"; done

Пояснение

  • tail +3 source.txt:удалить первые две строкиsource.txt
  • | while IFS= read -r line; do <FOO>; done:передает этот усеченный файл в конструкцию while read. Это будет перебирать каждую строку усеченного source.txt, выполняя <FOO>для каждой строки.
  • grep "$line" target.txt > "$line":для каждой строки source.txt, выполните grep для нее в target.txt, затем запишите в файл с тем же именем, что и исходная строка, которую вы искали.

Небольшой комментарий. :Если source.txtна самом деле содержит фиксированные строки вместо шаблонов, вы можете использовать опцию -Fдля grep.

1
13.10.2020, 20:54
1 ответ

Если вы используете это на машине с GNU nohup (, например. настольный/серверный Linux ), nohup не только установит расположение сигнала SIGHUPна «игнорировать» и перенаправит стандартный вывод/stderr на nohup.out, но , если его стандартный ввод является терминалом , также перенаправить stdin из /dev/null, открытого в режиме только запись -, так что любое чтение приведет к ошибке.

Когда фоновая команда запускается из скрипта, т.е. foo &, его stdin уже перенаправлен из /dev/null, открытого в режиме read -only , такого перенаправления не произойдет, и любое чтение из него приведет к EOF вместо ошибки.

Таким образом, вы можете моделировать поведение nohup скриптом в терминале с помощью:

(trap '' HUP; command 0>/dev/null >logfile 2>&1 &) 
0
18.03.2021, 22:57

Теги

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