Я думаю этот пост должен здесь быть, а постарался наш внештатный корреспондент Tadg Tadg. Погнали 👇
ㅤ
Сегодня разберем потрясный скрипт. Не в том смысле, что классный.
Просто он трясет сисками при выполнении длительных операций (копирование, загрузка, синхронизация).
Я когда-то видел что-то подобное, но найти не смог и пришлось писать свой. Вообще-то я против «красотулек», но кому-то нравится...
Сохраняем его в файл
tits.sh и проверяем:chmod +x tits.sh
# демо:
./tits.sh
# тест:
./tits.sh 7z b
Собственно скрипт:
#!/bin/bash
declare -r LOG=$(mktemp)
declare -r BS='\b\b\b\b\b\b\b'
declare -r SPC=' '
trap 'echo
tput cnorm
test -f "$LOG" && cat "$LOG" && rm "$LOG"
exit ' INT TERM HUP QUIT EXIT ERR
tput civis
CMD="$@"
test -z "$CMD" && CMD='sleep 10'
function TITS(){
declare N P T=${1:-21}
case "${T:0:1}" in
1) N='(.)';;
2) N='(o)';;
*) N='(*)';;
esac
case "${T:1:1}" in
1) P=${N}${N}' ';;
2) P=${N}' '${N};;
*) P=' '${N}${N};;
esac
echo -n "$P"
}
$CMD > "$LOG" 2>&1 &
PID=$!
echo -n "$SPC"
while :;do
for i in 21 12 23 33 23 12 21 31;do
echo -en $BS
TITS $i
ps -q "$PID" > /dev/null 2>&1 || exit
sleep .3
done
done
#--
Разбор скрипта:
LOG=$(mktemp) - создать лог в темповом каталогеBS='\b\b\b\b\b\b\b' - забои для перемещения в начало строки (число равно размеру сисек в символах)SPC=' ' - пробелы, для очиски сисек (число то же)Поскольку используется темповый файл, пишем правильно.
trap INT TERM HUP QUIT EXIT ERR - Перехват сигналов, (последние два - башизм)echo - перевод строки после сисекtput cnorm - включение курсораtest -t "$LOG && "cat "$LOG" && rm "$LOG" - вывод на экран лога и его удаление (при наличии).tput civis - гашение курсораtest -z "$CMD" && CMD='sleep 10' - если параметры скрипта не заданы - запускаем паузу 10 секfunction TITS() - входной параметр двузначное число, где десятки - форма соска, единицы - положениеdeclare N P T=${1:-21} - описываем локальные переменные. Если входной параметр не задан, используется 21case "${T:0:1}" ... esac - задаем форму соскаcase "${T:1:1}" ... esac - задаем положениеecho -n "$P" - выводим сиськи, без перевода строки.Кстати, интересная особенность echo
$P. Если переменная P содержит пробелы в начале и конце - они отбрасываются!Если пробелы важны - нужно использовать
"$P"$CMD > "$LOG" 2>&1 & - запуск команды фоном, с выводом stdout и err в логPID=$! - запомнили PID запущенного процессаecho -n "$SPC" - перед печатью сисек старые очищаются, чтобы было что очищать - печатаем пробелы.while :;do - бесконечный циклfor i in 21 12 23 33 23 12 21 31 - анимацияecho -en $BS - очищаем старый вывод (используем ESC-символы, без перевода строки)TITS $i - печатаем сиськиps -q "$PID" > /dev/null 2>&1 || exit - проверяем не закончился ли фоновый процессsleep .3 - пауза 0.3 секундыВообще-то можно было бы обойтись буквально одним циклом... Но нужно же и учится. Даже на сиськах.
man tput mktemp signal ps
help trap declare
https://cheatsheets.zip/bash
Надеюсь тема сисек раскрыта. Всем добра. Tagd
tags: #bash
—
🔔 @bashdays