Решил углубиться в познаниях баша, но в нём по видимому очень много подводных камней о которые спотыкаюсь.
Есть вот такой скрипт:
Shell
#!/bin/bash
klav()
{
exec 2>&-
local ppid KEY key code timeout i
while true
do
KEY=
timeout=
i=0
while [[ "$i" -lt 10 ]]
do
code=
read -r -s -n 1 $timeout key && printf -v code '%d' "'$key"
[ -n "$code" ] && KEY=$KEY$code
timeout="-t 0.01"
(( i++ ))
done
case "$KEY"
in
27)
echo -e "\e[32mЗАВЕРШЕНИЕ РАБОТЫ\e[0m"
sleep 1
reset
clear
echo -en "\e[0m\e[?25h"
stty echo
ppid=$$
kill -TERM "$ppid"
exit 0
;;
*)
echo "111111111"
;;
esac
done
}
stty -echo
klav <&0 &
clear
#reset
echo -en "\e[?25l"
while true
do
:
done
Но стоит раскомментировать команду reset и скрипт начинает работать по другому.
Появляется это, ну это понятно ведь мы сбросили настройки. Далее идут вещи мне не понятные. Команда:
Shell
echo -en "\e[?25l"
По нажатию клавиши "Esc" скрипт не завершается, а на экран выводится ^[, при нажатии на клавиши букв строка "111111111" не выводится, выводятся символы латинских букв и только после нажатия клавиши "Enter" всё начинает работать нормально - как и было задумано. Если "Enter" нажать самым первым то работет всё то же нормально как и задумано. Получается reset меняет работу скрипта, теперь надо нажать "Enter" что бы всё работало нормально.
Почему так?
И ещё один вопрос.
Основной скрипт порождает потомок - этот же скрипт в котором выполняется функция
"klav" при завершении основного скрипта потомок ведь должен завершиться сам, но этого не происходит, его приходится завершать командой exit 0 Почему так то же не пойму.
И ещё хотел бы узнать можно как то передать в функцию klav переменные или значения переменных из основного скрипта, а так же передать переменные из этой функции klav в основной скрипт. Знаю, что это можно сделать через глобальные переменные, но говорят, что это не правильно, надо делать через eval. Но как это делать через eval не знаю, знаю только как при помощи этого eval раскрыть переменную два и более раз - это когда значение переменной есть название ещё одной переменной.
Всё проверял в текстовой консоли работающей поверх ядерного фреймбуфера, а так же в графическом эмуляторе терминала kde -> konsole
Может быть вопросы просты и наивны, но ответов на них я не знаю и не нашёл.
Если кто знает объясните пожалуйста.