Помогите решить задачу, пожалуйста
Я буквально вчера начал изучать язык Bash, т.к. преподаватель требует решать на нем задания, так что совсем зеленый в этой теме. Прошу помочь решить задачу:
Следующую часть кода предполагается использовать в сценарии, который отслеживает изменения в системном журнале /var/log/messages. К сожалению, этот код "зависает" и не делает ничего полезного. Почему? Найдите ошибку и исправьте ее (подсказка: вместо операции перенаправления stdin в цикл, попробуйте использовать конвейерную обработку).
while read LINE do echo $LINE done < `tail -f /var/log/messages`
Ответы (2 шт):
tail -f
"Мониторит" файл на обновление и не закрывает его
while read LINE
Ждет бесконечно, закрытия файла, что бы прочесть построчно
echo $LINE
Никогда не вызывется
Исправленная версия
while read -r LINE
do
echo "$LINE"
done < /var/log/messages
Если речь о bash работает и такая форма
< /var/log/messages | while read -r LINE
do
echo "$LINE"
done
Если отслеживание необходимо в режиме реального времени и нужно использовать конвейер, тогда
tail -f /var/log/messages | while read LINE; do
#Ну просто накрутим каких нибудь действий, так как просто echo ничего логического не несет,
#потому что вывод просто команды и цикла будут идентичны
#Попробуем выделить строки содержащие err красным цветом '\033[31m'
[[ "$LINE" =~ [Ee][Rr][Rr] ]] && color='\033[31m' || color='\033[1m'
#Выводим строку, \033[0m отключает цветовое выделение, что бы не перекрасить консоль
echo -e "${color}${LINE}\033[0m"
done
В примере выше переменные не будут переданы за пределы цикла, т.е. если мы вызовем echo "$color" после done, то у нас вернется пустота.
Теперь попробуем иначе
while read LINE; do
#оставим аналогичные действия из примера выше.
[[ "$LINE" =~ [Ee][Rr][Rr] ]] && color='\033[31m' || color='\033[1m'
#Выводим строку, \033[0m отключает цветовое выделение, что бы не перекрасить консоль
echo -e "${color}${LINE}\033[0m"
done < <(tail -f /var/log/messages)
В данном случае переменные объявленные в цикле будут доступны за его пределами, так как передача данных в цикл идет не через пайп/конвейер.