Я взломал множество сценариев оболочки, и иногда самые простые вещи сбивают меня с толку. Сегодня я наткнулся на скрипт, который широко использовал :
встроенную (двоеточие) команду bash.
Documenation кажется достаточно простым:
: (a colon) : [arguments]
Ничего не делайте, кроме расширения аргументов и выполнения перенаправлений. Статус возврата равен нулю.
Однако ранее я видел это только при демонстрации расширения оболочки. Вариант использования в сценарии, с которым я столкнулся, широко использовал эту структуру:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
На самом деле были сотни greps, но они просто больше одинаковы. Нет никаких перенаправлений ввода / вывода, кроме простой структуры выше. Возвращаемые значения не проверяются позже в скрипте.
Я читаю это как бесполезную конструкцию, которая говорит «или ничего не делай». Какую цель может закончить эти greps с "или ничего не делать"? В каком случае эта конструкция вызовет иной результат, чем просто исключение || :
из всех случаев?
:
в качестве альтернативыtrue
. Возможноerrexit
, установлено, и автору нет дела до статуса завершения некоторых команд.Ответы:
Похоже, что
:
s в вашем сценарии используются вместоtrue
. Еслиgrep
совпадение не найдено в файле, он вернет ненулевой код завершения; как упомянуто в комментарии jw013, еслиerrexit
установлено, вероятно,-e
в строке Шебанга, сценарий завершится, если какой-либо из нихgrep
не сможет найти совпадение. Понятно, что это не то, чего хотел автор, поэтому он (ы) добавил,|| :
чтобы сделать состояние выхода этой конкретной составной команды всегда нулевым, как более распространенный (по моему опыту)|| true
/|| /bin/true
.источник
true
вместо этого, но семантическое намерение намного яснееtrue
.:
больше подходит, когда желателен явный NOP.:
вместоtrue
потому, что:
этоbash
встроенный, где, какtrue
правило, скомпилированный двоичный файл с большими издержками. обычно я использую,true
потому что код более читабелен (аналогично я предпочитаю использоватьsource
вместо.
).:
Встроенной также полезен с расширением Баш «Заданные значения по умолчанию» оболочки, где разложение часто используется исключительно для побочного эффекта и значение расширяется отбрасывается:источник
Я могу вспомнить два места, которые я использовал
:
в прошлом.Это вечная петля.
Вставьте функцию-заглушку, чтобы получить правильный контроль потока на верхнем уровне.
Одно из применений, которое я видел в старые времена: вместо
#!/bin/sh
(или любой другой) строки вы увидите:
линию. В некоторых старых ядрах Real Unix или оболочках Real Unix это использовалось бы для обозначения «Я сценарий оболочки, дай мне запустить». Насколько я помню, это было как раз тогда, когда csh создавал обычную интерактивную оболочку.источник
:
очень странно. я обнаружил, что это действительно вызывает запуск сценарияsh
. где, когда вы запускаете скрипт без шебанга ... он пытается запустить скрипт с любой запущенной оболочкой (поэтому, если вы работаете,bash
он пытается запустить его так, какbash
если бы у вас был,csh
то он пытается запустить его какcsh
).:
Встроенный уже в Thompson оболочки - это документировано для Unix V6 в 1975. В Thompson оболочке:
указывается метка дляgoto
команды. Если вы никогда не пытались вызватьgoto
строку, начинающуюся с:
, эта строка фактически была комментарием.Bourne оболочки , предок Борна / POSIX оболочек , как мы их знаем, никогда не было ,
goto
что я не знаю, но сохранил:
как не-оп команды (он уже присутствует в Unix V7 ).источник
Я вытащил старую ссылку: «Среда программирования UNIX» (c) 1984 года Кернигана и Пайка.
Страница 147 (Shell Programming) говорит следующее:
источник
true
теперь это встроенная оболочка, также во многих системах.Кажется, я помню, что ранние версии оболочки не имели синтаксиса комментариев. Строка, начинающаяся с
:
(которая, вероятно, была бы реальным исполняемым файлом, похожим на/bin/true
), была бы лучшей альтернативой.Вот справочная страница для древней оболочки Томпсона (никакого отношения); нет никакого упоминания о синтаксисе комментариев.
источник
:
фактически было индикатором метки дляgoto
команды в какой-то древней оболочке (я не знаю какой). Ярлык: something
действительно мог бы использоваться в качестве комментария, если не было совпаденийgoto
. Практика застряла даже после того, какgoto
исчезла.":" удобен для отладки.
При нормальной работе отладочная функция никогда не выполняется, поэтому просто перешагиваем noop (переменные и подстановочные знаки раскрываются). Если требуется более глубокая отладка, удалите noop из переменной, и отладочная функция вызывается с любыми необходимыми аргументами.
Еще одно удобное использование - это блочный комментарий, который отсутствует в синтаксисе оболочки.
источник