TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #548 12.8K
А давай потрясём cиськами с помощью Bash!

Я думаю этот пост должен здесь быть, а постарался наш внештатный корреспондент 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} - описываем локальные переменные. Если входной параметр не задан, используется 21
case "${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
More from @bashdays
  1. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  2. Sep 24, 2026Post #1565
  3. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  4. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  5. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
  6. Sep 11, 2026🤖 DevOps в эпоху AI трансформации: что работает уже сейчас! 17 сентября Сбер собирает Dev…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →