Почему перенаправление к некоторое время циклу не печатает сообщения?

Вот код оболочки, используемый, чтобы отследить изменения в файле и произвести содержание к терминалу:

while read LINE
do
  echo $LINE
done < `tail -f /var/log/messages`

Это не работает, почему?

1
задан 25 August 2015 в 15:57

2 ответа

Нет никакой потребности некоторое время цикла. Вы пытаетесь сделать два раза то же. Также файл /var/log/messages больше не присутствует в человечности.

Просто использование:

tail -f /var/log/syslog

для отслеживания нового содержания, которое добавляется в конце текстового файла. Если что-то новое записано в конец /var/log/syslog, оно печатается к Вашему терминалу.

Редактирование: Почему команда в вопросе не работает:

Первый, конечно, /var/log/messages не существует. Но если это существовало бы, команда между обратными галочками выполняется и заменяется ее выводом (минус запаздывающие символы новой строки). Таким образом, вывод tail -f ... был бы взят в качестве имени файла для перенаправления ввода <. То, что Вы, вероятно, хотите, посмотрело бы следующим образом (<(...) перенаправление):

while read LINE; do
  echo $LINE
done < <(tail -f /var/log/messages)

<(...) перенаправление создает именованный канал, где на одном конце команда tail -f пишет в. На другом конце while цикл читает содержание линию за линией. Именованный канал ведет себя вероятный регулярным файлом. Это - просто переходник между двумя командами. BTW, эти | делает точно то же, но они передают по каналу, не названы, они - каналы по умолчанию: 0-> stdin, 1-> stdout и 2-> stderr.

От bash страница справочника:

 Process substitution is supported on systems that support named pipes (FIFOs) or the 
 /dev/fd method of naming open files. It takes the form of <(list) or >(list).  
5
ответ дан 3 December 2019 в 06:41

Обычный портативный способ сделать это:

tail -f /var/log/messages | while read LINE
do
  echo $LINE
done

ответ @chaos использует синтаксис замены процесса, который только найден в усовершенствованных оболочках такой как zsh и bash. Вы не должны полагаться на их функции, если когда-нибудь необходимо запускать скрипт на другом компьютере.

, Конечно, я предполагаю, что Вы хотите поместить что-то более сложное, чем echo $LINE в цикл.

0
ответ дан 3 December 2019 в 06:41

Другие вопросы по тегам:

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