Какова цель команды, которая ничего не делает, будучи немного больше, чем лидер комментария, но является на самом деле оболочкой, встроенной в и себя?
Это медленнее, чем вставка комментария в Ваши сценарии приблизительно на 40% за вызов, который, вероятно, варьируется значительно в зависимости от размера комментария. Единственные возможные причины I видят для него, они:
# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done
# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command
# an alias for `true' (lazy programming)
while : ; do command ; done
Я предполагаю то, что я действительно ищу, то, какое историческое приложение это, возможно, имело.
Исторически оболочки Борна не было истина
и ложь
в качестве встроенных команд. true
вместо этого был просто псевдонимом :
, а false
- чем-то вроде let 0
.
:
немного лучше, чем true
для переносимости на древние оболочки, полученные из Борна. В качестве простого примера рассмотрим отсутствие ! Оператор конвейера
и оператор списка ||
(как это было в некоторых древних оболочках Борна). Это оставляет предложение else
оператора if
в качестве единственного средства для перехода на основе статуса выхода:
if command; then :; else ...; fi
Поскольку if
требует непустого ], затем предложение
и комментарии не считаются непустыми, :
не используется.
В настоящее время (то есть: в современном контексте) обычно можно использовать либо :
, либо true
. Оба они определены POSIX, и некоторые считают, что true
легче читать. Однако есть одно интересное отличие: :
- это так называемый специальный встроенный POSIX , тогда как true
- это обычный встроенный ].
В оболочку должны быть встроены специальные встроенные модули; Обычные встроенные модули встраиваются только «обычно», но это не строго гарантируется. Обычно не должно быть обычной программы с именем :
с функцией true
в PATH большинства систем.
Вероятно, наиболее важным отличием является то, что со специальными встроенными модулями любая переменная, установленная встроенными средствами - даже в среде во время простой оценки команды - сохраняется после завершения команды, как показано здесь с использованием ksh93:
$ сбросить x; (x = hi:; echo "$ x")
Привет
$ (x = привет правда; эхо "$ x")
$
Обратите внимание, что Zsh игнорирует это требование, как и GNU Bash, за исключением случаев, когда он работает в режиме совместимости с POSIX, но все другие основные оболочки, производные от POSIX sh, соблюдают это требование, включая dash, ksh93 и mksh.
Еще одно отличие состоит в том, что обычные встроенные модули должны быть совместимы с exec
- продемонстрировано здесь с использованием Bash:
$ (exec:)
-bash: exec: :: not found
$ (exec истина)
$
POSIX также явно отмечает, что :
может быть быстрее, чем true
, хотя это, конечно, специфическая деталь реализации.
Я использую его, чтобы легко включать/выключать команды переменных:
#!/bin/bash
if [[ "$VERBOSE" == "" || "$VERBOSE" == "0" ]]; then
vecho=":" # no "verbose echo"
else
vecho=echo # enable "verbose echo"
fi
$vecho "Verbose echo is ON"
Таким образом
$ ./vecho
$ VERBOSE=1 ./vecho
Verbose echo is ON
Это делает скрипт чистым. Это невозможно сделать с помощью '#'.
Кроме того,
: >afile
это один из самых простых способов гарантировать, что 'afile' существует, но имеет длину 0.
Это похоже на pass
в Python.
Одним из применений было бы заглушить функцию до тех пор, пока она не будет записана:
future_function () { :; }
Вы можете использовать его в сочетании с обратными знаками (``
) для выполнения команды без отображения ее вывода, например так:
: `some_command`
Конечно, вы можете просто сделать some_command > /dev/null
, но :
-версия несколько короче.
Учитывая это, я бы не рекомендовал делать это на самом деле, так как это только запутает людей. Это просто пришло в голову как возможный вариант использования.