LINUX.ORG.RU

Собственная замена i3status и бесконечный цикл в фоне на bash

 , , ,


1

3

Решил, что хочу свой собственный аналог i3status. Как я понимаю, i3bar взаимодействует с программой, которая указана в status_command, следующим образом: каждая новая строка вывода программы заменяет предыдущую в статусном пространстве i3bar, и каждая строка там висит, пока не будет заменена. Ну и всё это происходит, пока программа не завершится, поэтому нужен бесконечный цикл.

Попробовал банальщину:

while true
do 
date
sleep 3
done
Нормально работает, обновляется.

Я хочу такую структуру: есть одна строка, в которой фигурируют переменные, и эта строка выводится в бесконечном цикле каждые n секунд (это просто), и дополнительно ещё в нескольких бесконечных фоновых циклах должно происходить обновление переменных.

Как я это вижу:

while true
do
VAR1=...
sleep 600
done &

while true
do
VAR2=...
sleep 60
done &

while true
do
VAR3=...
sleep 5
done &

while true
do
echo $VAR1 $VAR2 $VAR3
sleep 5
done
Таким образом, каждую переменную можно будет обновлять с такой частотой, с которой нужно, независимо от остальных. Айпи, например, раз в 15 минут, кол-во апдейтов — раз в час и так далее, ну а выводить всё, что есть, с какой-нибудь достаточно большой частотой, не обновляя при этом все значения сразу.

Но почему-то такая идея не сработала - переменная пустой получается. Вот буквально так и попробовал в командной строке:

while true
do
myvar="$(date)"
sleep 5
done &
echo $myvar #несколько раз через некоторое время
Если пробую export myvar=«$(date)», то результат такой же. Пожалуйста, подскажите, что я делаю не так, и как надо на самом деле.

И ещё: Мб кто-нибудь в курсе, как именно в этом юзкейсе (статусная строка i3bar) получать всегда актуальное время, т.е. чтобы у меня минута на часах менялась не с задержкой в несколько секунд, а в соответствии с реальным ходом часов? Заранее спасибо.

★★

done &

Это форк, а переменные, изменяющиеся в потомках, очевидно, не передаются родителю.

Я что-то подобное делал на zsh, можешь посмотреть https://github.com/shdown/zsh-i3-status

И ещё: Мб кто-нибудь в курсе, как именно в этом юзкейсе (статусная строка i3bar) получать всегда актуальное время, т.е. чтобы у меня минута на часах менялась не с задержкой в несколько секунд, а в соответствии с реальным ходом часов? Заранее спасибо.

Обычно первым sleep'ом выравнивают интервалы, см. https://github.com/i3/i3status/blob/e073cf496847173913b309a02c3d5578ddf48243/...

shdown ()

Пожалуйста, подскажите, что я делаю не так, и как надо на самом деле.

чтобы у меня минута на часах менялась не с задержкой в несколько секунд, а в соответствии с реальным ходом часов?

Для начала возьми нормальный язык программирования.

loz ★★★★★ ()

Для начала возьми нормальный язык программирования.

Да, bash --- это жесть, такую задачу замучаешься решать на нем.

hotpil ★★★★ ()
Ответ на: комментарий от shdown

Про sleep понял, спасибо.

У меня тоже zsh, так что, может быть, воспользуюсь твоими наработками, за них тоже спасибо.

Norong ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.