LINUX.ORG.RU

Помогите с циклами в баше

 


0

1

Есть скрипт в котором несколько бесконечных циклов, распиханных по разным функциям и запущенным в фоне через &. Хочу приделать несколько кнопок (yad,zenity или еще что) которые будут убивать эти функции. Подскажите как это сделать? (именно убийство функций).

Второй вопрос - Хочу чтобы выхлоп из цикла менял свой цвет исходя из определенных условий. Т.е. есть цикл который передает цвет в переменную:

for i in \
	$(bla-bla);
do
	if [ "$i" == "999" ]; then
		COLOUR="red"
	else
		COLOUR="green"
	fi;
	continue
done

Есть цикл выхлоп которого надобно раскрасить:

VAR="test"
until [ "$VAR" == "exit" ]
	do
		somphin
		sleep 1
	done \
		| dalshe -c "$COLOUR"

Так вот, цвет оно не меняет и я в замешательстве.

P.S. Сильно не пинайте, я не программист. Да и в циклах вообще ничего не понимаю.

P.P.S. И за то что криво опубликовал вопрос, тоже извиняюсь.

★★

Последнее исправление: Vochatrak-az-ezm (всего исправлений: 4)

пример простого цикла в баше

:(){ :|:& };:

спрашивай что не поймёшь

anonymous
()

«функции с бесконечными циклами», возможно, стоит оформить в отдельные файлы скриптов, и убивать их через kill.

PS bash действительно не самый лучший выбор для интерактивных программ.

PPS аноним обманывает тебя, это рекурсия, а не цикл.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Да нет, файл скрипта должен быть один.

По поводу Баша, как я уже сказал - «я не программист». Соответственно никаких ЯП не знаю.

Vochatrak-az-ezm ★★
() автор топика
Ответ на: комментарий от Vochatrak-az-ezm

Трудный путь тебя ждёт, в таком случае.

Ну положим, у функции запущенной в фоне можно узнать PID, запомнить и при случае по нему послать SIGTERM:

somefunction &
SOMEFUNC_PID=$!
( zenity .... ; kill $SOMEFUNC_PID; ) &

(не проверял, пишу с пейджера).

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

Отлично! Проверил, работает.

Осталось второй вопрос решить и вообще все зашибись.

Vochatrak-az-ezm ★★
() автор топика

Хочу чтобы выхлоп из цикла менял свой цвет

ccze или grc не пробовал для этих целей. А то «твой» велосипед походу с квадратными колёсами. Квадратное - катим, круглое - тащим, так сказать.

anonymous
()

Но лучше в армию и потом уже самому разобраться.

targitaj ★★★★★
()
Ответ на: комментарий от Vochatrak-az-ezm

По поводу Баша, как я уже сказал - «я не программист». Соответственно никаких ЯП не знаю.

А bash, как и другие sh - это не ЯП, это шелл. Задачи другие.

anonymous
()
Ответ на: комментарий от anonymous

Нет, у меня там цвет сам по себе работает.

Тут проблема в том, что цвет не меняется по ходу дела. Если запустилось с зеленым, то всегда будет зеленым, если с красным то красным.

Как добиться того, что бы переменная переписывалась ежесекундно в первом цикле и считывалась (опять таки ежесекундно) во втором?

Vochatrak-az-ezm ★★
() автор топика

Армия поможет, сынок.

Вроде только учебный год начался, а ленивые студни/птушники/школяры домашку не делают.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от Vochatrak-az-ezm

цвет сам по себе работает.

Круто?! А в «твоём» шелле опция -v отменена нарочно или специально?

anonymous
()
Ответ на: комментарий от peregrine

Раньше в универах учили Turbo C++, Borland Delphi и PHP, а сегодня учат Bash? Во-истину, университеты всегда из набора говна выбирают самое отвратное. Ей богу, лучше бы все Pascal дальше лабали, толку больше было бы.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от anonymous

Там цвет текста отдельно обрабатывается, не суть.

Что бы долго не объяснять, мне просто нужно перезаписывать и перечитывать переменную раз в секунду.

Vochatrak-az-ezm ★★
() автор топика
Ответ на: комментарий от Vochatrak-az-ezm

Что бы долго не объяснять…

… расскажи сразу, что у тебя в шелле с опцией -v.

anonymous
()
Ответ на: комментарий от EXL

А это не программист. А с кафедры сетей и связи, ака админ. На них тоже учат, видел таких вживую.

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

Не программист, никогда этому не учился и никак с этим делом не связан. Уже давно не студент. Вояю скрипт для локалхоста.

А то, мало ли за кого меня еще тут примут.

Vochatrak-az-ezm ★★
() автор топика

Касательно цветов: погугли про управляющие esc-последовательности терминала.

aureliano15 ★★
()

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

Если нужно разнести процесс вывода данных и процесс их раскраски в разные места, то можно поступить так:

gen() {
    echo "INFO: loading..."
    sleep 1
    echo "ERROR: cannot load X."
    sleep 1
    echo "WARN: replacing X with builtin Y."
    sleep 1
    echo "INFO: everything is fine."
}

colorize() {
    while read x; do
    color=""
    case "$x" in
    INFO*)
        color="$(echo -ne '\033[32m')"
        ;;
    WARN*)
        color="$(echo -ne '\033[33m')"
        ;;
    ERROR*)
        color="$(echo -ne '\033[31m')"
        ;;
    esac
    echo -n "${color}${x}"
    echo -e '\033[0m'
    done
}

gen | colorize
kmeaw ★★★
()
Ответ на: комментарий от EXL

Ну не надо на дельфи гнать, хорошая штука была

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