bash
12 commands
12 shown
Строгий режим со безопасным IFS
Прерывать при ошибках, неопределённых переменных и сбоях в пайпах; разбивать только по переводу строки и табу
set -euo pipefail; IFS=$'\n\t'
Очистка временного каталога через trap
Автоудаление каталога mktemp при выходе или сигнале; важно: заключайте $tmp в кавычки от пробелов
tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT INT TERM
Сравнение вывода двух команд
Подстановка процессов сравнивает два потока без временных файлов
diff <(kubectl get cm a -o yaml) <(kubectl get cm b -o yaml)
Безопасное чтение строк файла в массив
mapfile -t убирает переводы строк и сохраняет пробелы в отличие от разбиения в for-цикле
mapfile -t lines < file.txt; printf '%s\n' "${lines[@]}"
Набор расширений параметров
basename, удаление расширения и глобальная замена без вызова sed или basename
f=/var/log/app.log.gz; echo "${f##*/}" "${f%.*}" "${f//log/LOG}"
Захват по регексу через BASH_REMATCH
Встроенное сопоставление по регексу извлекает группы; важно: не заключайте регекс справа в кавычки
[[ $s =~ ^([0-9]+)\.([0-9]+) ]] && echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
Параллельный xargs по null-разделённому вводу
Запуск N параллельных задач с NUL-разделителями, безопасно для имён с пробелами
find . -name '*.log' -print0 | xargs -0 -P"$(nproc)" -n1 gzip
Проверка PIPESTATUS каждого этапа
Проверка кода возврата каждого этапа пайпа; $? отдаёт только последнюю команду
curl -s "$url" | jq .data; echo "${PIPESTATUS[@]}"
Разбор флагов через getopts
POSIX-разбор опций с аргументами; -n принимает значение, -v является флагом
while getopts "n:v" o; do case $o in n) ns=$OPTARG;; v) verbose=1;; esac; done
Ограничение команды через timeout с kill
SIGTERM на 30с, затем SIGKILL через 5с; код 124 означает принудительное завершение
timeout -k 5s 30s ./long_task.sh || echo "timed out: $?"
Отдельный дескриптор для структурированного лога
Открыть дескриптор 3 в файл, писать независимо от stdout и закрыть его
exec 3>>audit.log; echo "$(date -Is) start" >&3; exec 3>&-
zsh рекурсивный glob и пакетное переименование
zsh: рекурсивный список только обычных файлов и безопасное массовое переименование через zmv
setopt extendedglob; print -l **/*(.); autoload zmv; zmv '(*).txt' '$1.bak'
no commands match