Кажется, что мы не можем использовать команду read
для такого рода задач, потому что read
останавливает while
выполнение цикла.
Посмотрите на этот пример:(printf "1\n2\n3\n" ; sleep 5; printf "4\n") | while read -r line; do echo hello; done
.
while
цикл с read
внутри будет выполнен так:
1
; 2
; 3
; 4
. Мы не можем сделать запланированную работу внутри этого цикла, например, «делать это каждую 1 секунду» -, потому что она будет периодически останавливаться в ожидании ввода. Например, он может ждать 1 минуту или больше, и наша запланированная работа тоже будет остановлена.
function interval () {
amount_of_seconds=$1
print_time=0
buffer=''
while read -r line; do
current_time=$(date +%s)
if (( current_time > print_time )); then
echo -e "${buffer}${line}"
buffer=''
print_time=$((current_time + amount_of_seconds))
else
buffer="$line\n"
fi
done
echo -en "$buffer"
}
Тестирование:
$ alias firehose='(printf "1\n2\n3\n" ; sleep 2 ; printf "4\n"; sleep 2 ; printf "5\n6\n7\n" ; sleep 2; printf "8\n")'
$ firehose | interval 1 | cat
1
3
4
5
7
8
$
Перенаправить вывод firehose
в файл :firehose >> buffer_file.txt
(Объяснение, почему >>
, а не >
, см. ниже)
expensive-command
будет считывать последнюю строку из этого файла каждую секунду и очищать файл:
while true; do
tail -n 1 buffer_file.txt | expensive-command
# clear file
echo -n '' > buffer_file.txt
# and sleep 1 second
sleep 1
done
В результате получим следующее:
firehose
в фоновом режиме):firehose >> buffer_file.txt &./script_with_expensive_command_inside.sh
>>
нужен после firehose
, а не WRITE >
. В противном случае файл не будет очищен и будет постоянно расти.Вот объяснение такого поведения.expensive command
expensive command
не прочитает ее и не очистит файл. I want to start contributing to the Linux Kernel, plus I would like to, one day, fork the repository on github and add some modifications to it.
Ядро Linux не разрабатывается на Github.https://lwn.net/Articles/702177/. Чтобы внести свой вклад, вам необходимо отправить электронная почта -по спискам рассылки и лицам, указанным scripts/get _maintener.pl
How do I get started with contributing to the kernel? Is there something I should read/watch (I prefer watching videos). Is there some documentation that will hold my hand all the way through? Everything I've found hitherto hasn't been updated in a decade.
Начните с чтения файлов в каталоге Documentation/process в Linux. дерево и посмотрите это Разработка ядра Linux, Грег Кроа -Хартман -Видео Git Merge 2016 . Кстати,
I prefer watching videos
Почему? Чтобы внести существенные изменения в Linux, вы должны должны прочитать ряд документов, ветки списков рассылки и тысячи строк кода.
I mainly use Windows and Mac, but have an Ubuntu Virtual Machine installed on my PC.
Чтобы внести изменения в огромный и сложный проект, который ядра Linux, вы должны иметь полное представление о том, что ты поживаешь. Используйте Linux в течение нескольких лет, узнайте, как он работает, и найдите легко исправить ошибки с помощью scripts/checkpatch.pl -f <file>
.