Данные в канале можно прочитать только один раз; часть «что нового» проста. Просто создайте именованный канал с помощью mkfifo
, перенаправьте на него свой вывод inotifywait с помощью >
и периодически читайте канал.
Более сложная часть — это чтение канала, который где-то открыт для записи без блокировки. дд может это сделать.
Вот установка, которую я использовал для создания и непрерывной записи в канал:
mkfifo foo
( while true ; do date; sleep 1 ; done ) > foo
И прочитать все непрочитанные данные:
dd iflag=nonblock if=foo bs=1M count=1 of=buffer.txt
Вы можете изменить of=...
на выходной файл по вашему выбору.
Рано или поздно вы получите неполную строку из конвейера, поэтому убедитесь, что ваш скрипт может с этим справиться. Для того вида деятельности, который вы описываете, хорошим подходом является повторение dd в режиме добавления до тех пор, пока буфер не будет завершен новой строкой -:
buf=buffer.txt
pipe=foo
> $buf # empty the buffer
until [[ $( tail -c1 $buf | od -a ) == *nl* ]] # nl means newline
do
dd iflag=nonblock oflag=append conv=notrunc if=$pipe bs=1M count=1 of=$buf
ls -l $buf # see how it grows
sleep 1 # if the writer dies, this loop will be infinite and we don't want to kill the CPU
done
do_stuff.sh < $buf
# rm $buf
РЕДАКТИРОВАТЬ :Похоже, вы хотите сообщить inotifywait, когда находитесь у терминала, и сбросить все новое. Это проще. Создайте файл типа whatsnew.sh:
#!/bin/bash
echo "waiting for first output... "
while true
do
n=0
while read -t0.1 line
do
echo "[$line]"
(( n++ ))
done
read -p "$n new lines. Press any key to try again... " -n1 -s </dev/tty
echo
done
Затем запустите его:
inotifywait | whatsnew.sh