2014-12-08 3 views
2

Я искал и не мог найти четкие подсказки, чтобы проверить, что я выводил из сценария, данного мне.Дескриптор файла Bash 3 и во время чтения строки

поэтому file.txt - это открытый файл (файловым дескриптором 3) и постоянно добавляет новую строку скриптом, который записывает временную метку. Делает ли следующий фрагмент в цикле while каждый раз, когда в файл добавляется новая строка?

exec 3 < /path/file.txt 
while read <&3 
    command 
    command.. 
done 

Так что, пока я не закрыть дескриптор файла, новая строка добавляется к моему file.txt всегда будет активировать время цикла, верно?

Пожалуйста, помогите мне прояснить это. Спасибо

+0

вас может заинтересовать более подробное объяснение 'exec' http://stackoverflow.com/questions/18351198/what-are-the-uses-of-the-exec-command-in-shell-scripts – xiaowl

ответ

4

Чтобы прочитать из дескриптора файла 3, используйте read -u 3 (см. Bash builtins). Не забудьте указать имя переменной, в которое должно считываться значение.

Как только read обнаруживает EOF, он остается в EOF; после этого он не обнаружит добавлений к файлу. Итак, если код, добавляющий строки к файлу, медленнее, чем код в этом скрипте, вы достигнете конечной точки и цикл завершится. Если вы не хотите этого, рассмотреть вопрос об использовании tail -f /path/file.txt, и, возможно, process substitution тоже:

while read -u 3 line 
do 
    command1 
    command2 
done 3< <(tail -f /path/file.txt) 

Или, если вы хотите сделать exec:

exec 3< <(tail -f /path/file.txt) 

while read -u 3 line 
do 
    command1 
    command2 
done 

Обратите внимание, что tail -f петли никогда не закончится до тех пор, вы каким-то образом прерываете сценарий.

+0

' read -u 3' позволяет перенаправить из файлового дескриптора на 'на основе кода-блока', не требуя ручного открытия дескриптора с помощью' exec'. 'while read <& 3' в порядке, где дескриптор открывается с помощью' exec' и требует закрытия с 'exec 3> & -'. –

2

Так что, пока я не закрыть дескриптор файла, новая строка добавляется к моему file.txt всегда будет активировать время цикла, верно?

Ответ: Неправильно.

Перенаправление exec 3 < /path/file.txt дает возможность читать из /path/file.txt с использованием дескриптора файла, но не делает ничего разрешить любой тип запуска от /path/file.txt к коду. Подумайте об этом таким образом. Если есть новая линия в /path/file.txt, вы можете прочитать , но перенаправление не дает никакого способа знать ли или не новая строка была добавлена ​​в файл для вашего кода, чтобы ответить на. Он по-прежнему зависит от вашего кода.

Смежные вопросы