Null-команда : в shell: зачем использовать двоеточие
Автор разбирает встроенную shell-команду :, null-команду, которая не выполняет полезного действия, но вычисляет переданные ей аргументы и отбрасывает результат. Основной пример, проверка обязательного параметра через : "${1:?missing argument, aborting.}": если первый аргумент пуст или не задан, подстановка параметра выводит диагностическое сообщение в stderr и shell завершает работу с ненулевым статусом. При использовании именованной переменной, например GREET_NAME, диагностика содержит и ее имя.
В заметке показано, что : удобно сочетать с подстановками параметров для установки значений по умолчанию: : "${DATA_DIR:=/var/data}" присваивает /var/data, если переменная не задана или пуста, но не пытается исполнить получившуюся строку как команду. Без null-команды конструкция вида ${HELLO:=123} после раскрытия подстановки могла бы привести к попытке запустить команду 123. Автор также приводит примеры: : > error.log очищает файл; : > error.log > access.log очищает два файла; : < dataset.json и : >> result.json можно использовать в проверках читаемости и возможности записи; trap : INT задает для сигнала обработчик, который ничего не делает; : подходит как пустая ветка там, где синтаксис ожидает команду.
Отдельно отмечено, что команда очень старая: она существовала уже в Thompson shell 1971 года, где служила меткой и ранним маркером комментария. В дополнении к статье автор уточняет, что выбор между : с подстановкой и обычным присваиванием, во многом вопрос предпочтений: у варианта с : имя переменной упоминается один раз, что может уменьшить риск опечатки. При этом примеры с пустой веткой if не предлагаются как стиль для каждого условия, а иллюстрируют общий случай: null-команда нужна, когда команда обязательна по синтаксису, но действие не требуется. В качестве практического примера из обсуждения приведено использование : как sequence.editor Git при интерактивном rebase с автоматическим autosquash, когда не нужно редактировать список действий.
Ключевые факты
:, встроенная null-команда shell: она вычисляет аргументы и отбрасывает результат.- Конструкция
: "${VAR:?сообщение}"завершает shell с ошибкой, еслиVARне задана или пуста, и выводит диагностику. - Через
: "${VAR:=значение}"можно задать значение по умолчанию, не пытаясь выполнить результат подстановки как команду. - С
:можно очищать файлы перенаправлением, проверять доступ к файлу, задавать пустой обработчик сигнала и заполнять обязательную пустую ветку синтаксиса. - В Git
:можно назначить редактором последовательности интерактивного rebase, чтобы не открывать список действий при автоматическом autosquash.
Почему это важно
Двоеточие выглядит как бесполезная команда, но дает shell явное место для вычисления подстановок параметров, когда результат не нужно исполнять. Это делает компактными проверки обязательных переменных и инициализацию значений по умолчанию.
Кому это важно
Прием полезен тем, кто пишет и поддерживает скрипты shell. Особенно он применим в скриптах с обязательными аргументами, переменными окружения и обработкой сигналов, а также пользователям Git, настраивающим интерактивный rebase.
Как это применить
Для обязательной переменной используйте : "${GREET_NAME:?missing argument, aborting.}"; для значения по умолчанию, : "${DATA_DIR:=/var/data}". Перенаправление к null-команде позволяет очистить файл (: > error.log) или включить проверку доступа в условие. В Git пример из статьи задает sequence.editor=: для интерактивного rebase без редактирования списка действий.
Можно ли доверять
Это пояснительная техническая статья с проверяемыми примерами команд shell. Автор прямо объясняет механизм: : является встроенной null-командой, а поведение проверок и присваиваний обеспечивают подстановки параметров.
Риски и подводные камни
Короткие конструкции могут ухудшить читаемость для команды, не знакомой с подстановками параметров. : не заменяет осмысленную структуру условий: пример с пустой веткой нужен лишь для ситуаций, где команда обязательна, а делать ничего не требуется. Также важно помнить, что подстановка без null-команды может превратить ее результат в имя исполняемой команды.
«
:, это null-команда: встроенная команда, которая ничего не делает, но вычисляет свои аргументы и отбрасывает результат.»— Автор статьи