Вот код оболочки, используемый, чтобы отследить изменения в файле и произвести содержание к терминалу:
while read LINE
do
echo $LINE
done < `tail -f /var/log/messages`
Это не работает, почему?
Нет никакой потребности некоторое время цикла. Вы пытаетесь сделать два раза то же. Также файл /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).
Обычный портативный способ сделать это:
tail -f /var/log/messages | while read LINE
do
echo $LINE
done
ответ @chaos использует синтаксис замены процесса, который только найден в усовершенствованных оболочках такой как zsh
и bash
. Вы не должны полагаться на их функции, если когда-нибудь необходимо запускать скрипт на другом компьютере.
, Конечно, я предполагаю, что Вы хотите поместить что-то более сложное, чем echo $LINE
в цикл.