bash: nameref и косвенные переменные

declare -n создаёт ссылку на другую переменную — псевдоним по имени: declare -n ref=target target="hello" echo "$ref" # hello ref="world" echo "$target" # world Главная польза — возврат значений из функций без глобальных переменных и eval: get_ip() { declare -n _out=$1 _out=$(hostname -I | awk '{print $1}') } get_ip MY_IP echo "$MY_IP" Косвенное раскрытие ${!var} — более старый способ, работает без declare -n: varname="PATH" echo "${!varname}" # значение $PATH # динамические переменные в цикле for env in DEV STAGE PROD; do key="DB_HOST_${env}" echo "$env → ${!key}" done declare -n требует bash 4.3+. На macOS встроен bash 3.2 — там только ${!var}. ...

27 июня 2026 г. · llexa

bc, awk и $(( )): математика в bash

Bash умеет целые числа прямо в $(( )): echo $(( 10 * 3 + 5 )) # 35 echo $(( 2 ** 10 )) # 1024 Для дробей — bc. Ключ -l даёт sqrt, sin, log: echo "scale=4; sqrt(2)" | bc -l # 1.4142 echo "scale=2; 355/113" | bc # 3.14 awk считает float в одну строку — удобно когда уже парсишь вывод: awk 'BEGIN { printf "%.4f\n", 355/113 }' df / | awk 'NR==2 { printf "used: %.1f%%\n", $3/$2*100 }' printf форматирует числа без вычислений: printf "%.2f\n" 3.14159 # 3.14 printf "%d\n" $(( 1024 ** 2 )) Правило: $(( )) для целых, bc для точных дробей, awk когда уже в пайпе. ...

27 июня 2026 г. · llexa

GNU screen: терминальный мультиплексор без tmux

screen есть в базовой поставке почти любого дистрибутива — даже там, где нет tmux. Запустить именованную сессию: screen -S deploy # Ctrl+a d — detach, сессия живёт в фоне screen -r deploy # вернуться screen -ls # список сессий Ctrl+a — префикс всех команд screen (как Ctrl+b в tmux). Основные: Комбинация Действие Ctrl+a c новое окно Ctrl+a " список окон Ctrl+a S горизонтальный сплит Ctrl+a d detach screen -x session — подключиться к уже занятой сессии: два человека видят один терминал в реальном времени. Удобно для пар-программирования или передачи управления. ...

25 июня 2026 г. · llexa

md5sum, sha256sum, b3sum: контрольные суммы в Linux

md5sum сломан криптографически с 1996 года — коллизии найдены. Для проверки целостности файлов используй sha256sum или быстрее: # классика — медленно, но везде есть md5sum file.iso sha256sum file.iso # проверить по файлу контрольных сумм sha256sum -c SHA256SUMS # сгенерировать для директории find . -type f | sort | xargs sha256sum > checksums.sha256 # BLAKE3 — быстрее SHA-256, современный стандарт b3sum file.iso # apt install b3sum Скорость на большом файле: md5sum ≈ sha256sum < sha512sum < blake2 < blake3 (в 3–5× быстрее sha256 на многоядерных). ...

25 июня 2026 г. · llexa

mktemp и tmpfs: временные файлы без мусора

mktemp создаёт файл или директорию с гарантированно уникальным именем — без race condition, которую даёт /tmp/myapp.tmp: TMP=$(mktemp -d /tmp/app.XXXXX) trap 'rm -rf "$TMP"' EXIT trap ... EXIT сработает при любом выходе из скрипта — по ошибке, по сигналу, по exit 0. Временные файлы не накапливаются. tmpfs — файловая система целиком в RAM. Содержимое исчезает при отмонтировании или перезагрузке: mount -t tmpfs -o size=512m tmpfs /mnt/ramdisk Связка mktemp + tmpfs полезна для сборочных пайплайнов: распаковать архив в RAM, обработать, выкинуть — без единой записи на диск. ...

25 июня 2026 г. · llexa

diff / patch: правки без git

Unified diff — формат, который понимает patch и любой git: diff -u old.conf new.conf > fix.patch Применить патч к файлу, сохранив структуру путей из заголовка: patch -p1 < fix.patch # применить patch -p1 -R < fix.patch # откатить тот же патч Сравнить два каталога целиком, без вывода самих различий — только список разных файлов: diff -rq dir1 dir2 colordiff — та же утилита diff, но с подсветкой добавленных/удалённых строк, если на сервере не git, а просто конфиги в каталоге: ...

24 июня 2026 г. · llexa

envsubst: переменные окружения в конфиг-шаблонах

envsubst подставляет значения переменных окружения вместо ${VAR} в текстовом файле: export DOMAIN=example.com envsubst < nginx.conf.template > /etc/nginx/conf.d/app.conf Без аргументов envsubst заменит все переменные из окружения — рискуя задеть случайные $PATH или $HOME в шаблоне. Явный список ограничивает подстановку: envsubst '${DOMAIN} ${PORT}' < nginx.conf.template > app.conf Типичное место — Docker-entrypoint, собирающий конфиг из шаблона перед запуском nginx: envsubst '${BACKEND_HOST} ${PORT}' < default.conf.template > default.conf Тот же приём работает в CI/CD — один шаблон под разные окружения. ...

24 июня 2026 г. · llexa

sort / uniq: топ команд без awk

По умолчанию sort сортирует как текст — 10 окажется перед 2. Числовая сортировка по конкретному полю: sort -t: -k3,3n /etc/passwd # сортировка по UID (3-е поле, разделитель :) uniq -c считает повторы соседних строк — но только соседних, поэтому сначала sort: sort access.log | uniq -c | sort -rn | head -10 Топ-10 IP из access.log без единого awk: awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 uniq -u — наоборот, только строки без дублей (дедупликация в обратную сторону): ...

24 июня 2026 г. · llexa

cut / paste / join: обработка табличных данных без awk

cut достаёт нужные поля по разделителю — для /etc/passwd это имя пользователя и шелл: cut -d: -f1,7 /etc/passwd paste склеивает строки из разных файлов в колонки — удобно собрать CSV из нескольких списков: paste -d, names.txt emails.txt > users.csv join делает то же, что JOIN в SQL — слияние двух файлов по общему полю-ключу. Оба файла должны быть отсортированы по этому полю: sort -k1,1 file1.txt -o file1.txt sort -k1,1 file2.txt -o file2.txt join file1.txt file2.txt Эта тройка закрывает большинство задач по табличным данным в shell без необходимости каждый раз писать awk-скрипт. ...

23 июня 2026 г. · llexa

timeout: защита от зависших команд

Если команда может зависнуть навсегда — timeout убивает её по таймауту: timeout 5s curl https://example.com По умолчанию посылается SIGTERM, но не все процессы его слушают. --kill-after добивает SIGKILL, если процесс не завершился сам: timeout --kill-after=3s 10s ./stuck-script.sh Код возврата 124 — сигнал о том, что сработал именно таймаут, а не ошибка самой команды: timeout 5s long-task; echo $? # 124 = превышен лимит В cron-задачах timeout — стандартная страховка от зависшего скрипта, который иначе будет копиться в процессах до следующего перезапуска: ...

23 июня 2026 г. · llexa