А давай потрясём cиськами с помощью Bash!

Я думаю этот пост должен здесь быть, а постарался наш внештатный корреспондент Tagd Tagd. Погнали

Сегодня разберем потрясный скрипт. Не в том смысле, что классный.

Просто он трясет сисками при выполнении длительных операций (копирование, загрузка, синхронизация).

Я когда-то видел что-то подобное, но найти не смог и пришлось писать свой. Вообще-то я против «красотулек», но кому-то нравится…

Сохраняем его в файл 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=' ' - пробелы, для очистки сисек (число то же)

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Поскольку используется темповый файл, пишем правильно.

trap INT TERM HUP QUIT EXIT ERR - Перехват сигналов, (последние два - башизм) echo - перевод строки после сисек tput cnorm - включение курсора test -f "$LOG" && cat "$LOG" && rm "$LOG" - вывод на экран лога и его удаление (при наличии). tput civis - гашение курсора test -z "$CMD" && CMD='sleep 10' - если параметры скрипта не заданы - запускаем паузу 10 сек function TITS() - входной параметр двузначное число, где десятки - форма соска, единицы - положение declare N P T=${1:-21} - описываем локальные переменные. Если входной параметр не задан, используется 21 case "${T:0:1}" ... esac - задаем форму соска case "${T:1:1}" ... esac - задаем положение echo -n "$P" - выводим сиськи, без перевода строки.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Кстати, интересная особенность 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 секунды

Вообще-то можно было бы обойтись буквально одним циклом… Но нужно же и учиться. Даже на сиськах.

Надеюсь тема сисек раскрыта. Всем добра. Tagd