bash-функции продвинутые: local, return и nameref

В bash-функциях легко наступить на грабли. Переменная без local утекает в глобальную область и портит состояние вызывающего кода. return возвращает только код завершения — 0–255, не строку и не число. Три инструмента снимают большую часть боли. count_lines() { local file="$1" n n=$(wc -l < "$file") echo "$n" # значение — через stdout, не return } check_disk() { [ "$(df -h / | awk 'NR==2{print $5}' | tr -d '%')" -lt 90 ] } fill_array() { local -n ref=$1 ref=(one two three) } my_arr=() fill_array my_arr Частая ошибка — вернуть число через return, когда оно больше 255 (обрежется по модулю 256). Для реальных данных — echo+$(...) или nameref, return только под true/false. ...

28 июля 2026 г. · llexa

Makefile с нуля: targets, .PHONY и автоматические переменные

make — не только для C. По сути это раннер задач с зависимостями: target пересобирается, только если изменился хоть один файл, от которого он зависит. Для команд без файла-результата (test, deploy, clean) нужен .PHONY — иначе make однажды решит, что цель уже “собрана”, просто увидев файл с таким же именем в директории. .PHONY: build test deploy clean build: main.o utils.o gcc -o app $^ # $^ — все зависимости main.o: main.c gcc -c $< -o $@ # $< зависимость, $@ цель test: build ./run_tests.sh deploy: test scp app prod:/opt/app/ $@/$</$^ убирают дублирование имён файлов. deploy: test гарантирует: сначала тесты, потом бинарник на прод. ...

28 июля 2026 г. · llexa

printf: форматирование вывода вместо echo

echo в разных шеллах и с флагами -e/-n ведёт себя непредсказуемо. printf — POSIX-стандарт с одинаковым поведением везде, плюс контроль, которого у echo просто нет: выравнивание, нули, точность после запятой. printf "%-10s %5d\n" "disk1" 87 # ширина и выравнивание — таблицы в логах printf "%.2f%%\n" 87.3456 # точность после запятой printf "backup_%03d.tar\n" 7 # backup_007.tar # запись в переменную без $(...) и лишнего subshell printf -v msg "Ошибка на хосте %s, код %d" "$host" "$code" %q экранирует строку так, что результат безопасно вставить обратно в shell — printf "%q\n" "$var" пригождается при генерации команд из переменных с пробелами. ...

28 июля 2026 г. · llexa

gdb: отладка бинарников без пересборки с логами

Когда сервис падает, а логов недостаточно, следующий шаг — gdb. Не обязательно быть C-разработчиком: базовых команд хватает, чтобы вытащить стек вызовов и переменные на момент краха. gdb -p $(pgrep myapp) # подключиться к живому процессу gdb --args ./myapp --config prod.conf (gdb) bt # backtrace — стек вызовов (gdb) info locals # переменные текущего фрейма (gdb) frame 2 # переключиться на фрейм (gdb) print my_var (gdb) continue Для уже случившегося краха без живого процесса — gdb ./myapp core.12345: bt покажет строку и стек на момент сигнала. Без -g при сборке символов нет, bt покажет только адреса — но иногда и этого хватает понять, в какой библиотеке крах. ...

27 июля 2026 г. · llexa

ldd, ldconfig и LD_PRELOAD: динамическая линковка в Linux

Динамически слинкованный бинарник не содержит код библиотек внутри — при запуске загрузчик находит .so-файлы по путям из кэша. ldd, ldconfig и LD_PRELOAD управляют этим процессом, пригождаются при error while loading shared libraries. # какие .so нужны бинарнику и откуда они реально берутся ldd /usr/bin/nginx # обновить кэш путей после установки новой библиотеки в нестандартный путь ldconfig ldconfig -p | grep libssl # проверить, что библиотека в кэше # подменить библиотеку на лету, без пересборки бинарника LD_PRELOAD=/opt/libs/libfake.so ./app LD_PRELOAD удобен для отладки и быстрых хаков без правки исходников, но тем же механизмом пользуются руткиты — лишняя строка в выводе ldd повод проверить /etc/ld.so.preload. ...

27 июля 2026 г. · llexa

Proxmox #7: vzdump из командной строки

Веб-интерфейс Proxmox прячет vzdump за формой с чекбоксами, но это обычная CLI-утилита — дёргается из cron без похода в GUI. Режимы snapshot/suspend/stop по-разному балансируют простой VM и консистентность данных. # snapshot — VM не останавливается, бэкап через ZFS/LVM snapshot vzdump 101 --mode snapshot --storage local --compress zstd # suspend — короткая пауза VM на момент снятия снапшота vzdump 102 --mode suspend --mailto admin@example.com # несколько VM разом, с ограничением по bandwidth vzdump 101 102 103 --bwlimit 50000 --storage nfs-backup Восстановление — разные команды по типу гостя: qmrestore backup.vma.zst 101 --storage local для VM, pct restore 101 backup.tar.zst --storage local для контейнеров. ...

27 июля 2026 г. · llexa

Ubuntu 20 лет врал через /etc/debian_version

Заходишь на Ubuntu-сервер, cat /etc/debian_version — а там версия Debian Sid, из которой когда-то собрали пакеты. К реальной версии Ubuntu это не имеет отношения вообще, но файл честно живёт в системе и вводит в заблуждение любой скрипт, который наивно на него полагается. Баг завели в 2005 году. Двадцать с лишним лет community-мудрость одна: “не читай этот файл, читай /etc/os-release” — а сам файл никто не трогал, потому что а вдруг что-то сломается. Самый живучий баг — не тот, который не могут воспроизвести, а тот, который воспроизводит каждый, все знают, что он есть, и никто не убирает десятилетиями. ...

26 июля 2026 г. · llexa

Будь добрее #9 - Миллиардер, который умер, раздав всё

Чак Фини заработал состояние на сети магазинов беспошлинной торговли Duty Free Shoppers. В 1982 году он тайно передал почти всё своё состояние в благотворительный фонд Atlantic Philanthropies — и на 15 лет это оставалось секретом даже для деловых партнёров. Фонд требовал от получателей грантов не называть имя донора. Фини летал эконом-классом, носил дешёвые часы, не имел ни дома, ни машины — при том что через фонд раздал больше 8 миллиардов долларов на больницы, университеты и программы по борьбе с бедностью. ...

26 июля 2026 г. · llexa

certbot: автоматизация TLS-сертификатов Let's Encrypt

Платный wildcard-сертификат или возня с CSR — избыточны для большинства сайтов. certbot сам получает сертификат Let’s Encrypt, вписывает его в конфиг nginx и настраивает автопродление: сертификаты живут 90 дней, продление обязано быть автоматическим. # выпуск + автонастройка nginx для домена sudo certbot certonly --nginx -d example.com -d www.example.com # автопродление настроено? (обычно systemd timer) systemctl list-timers | grep certbot # сухой прогон продления, без реального обновления sudo certbot renew --dry-run --nginx сам находит нужный server-блок. --standalone — если nginx ещё не поднят. renew --dry-run раз в квартал стоит гонять руками — чтобы не узнать о сломанном автопродлении в момент истечения сертификата. ...

25 июля 2026 г. · llexa

restic: бэкапы с дедупликацией и шифрованием из коробки

borg дедуплицирует бэкапы, но требует SSH-доступа к хранилищу или локального пути. restic — та же дедупликация и шифрование, но из коробки говорит с S3, Backblaze B2, SFTP и локальным диском, без отдельного backup-сервера. # инициализация репозитория (тот же синтаксис для S3/SFTP) restic init --repo /mnt/backup/restic-repo # бэкап директории restic -r /mnt/backup/restic-repo backup /etc /var/lib/postgresql/data # снапшоты и восстановление restic -r /mnt/backup/restic-repo snapshots restic -r /mnt/backup/restic-repo restore latest --target /tmp/restore Пароль репозитория задаётся при init — без него бэкапы не восстановить, хранить его нужно отдельно. Дедупликация на уровне блоков: повторный бэкап после мелких правок в большом файле занимает не весь объём, а только изменённые куски. ...

25 июля 2026 г. · llexa