В bash
:
$ type :
: is a shell builtin
$ type true
true is a shell builtin
Похоже, они одинаковы, но они не дают ту же системную трассировку:
$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0) = ?
Я попытался различить strace bash -c : 2>:.txt
и strace bash -c true 2>true.txt
, но не смог найти никаких различий между ними, кроме мест памяти.
В dash
:
$ type :
: is a special shell builtin
$ type true
true is a shell builtin
ОК, поэтому они не одинаковы. help :
и help true
не очень полезны, и они возвращают то же самое в bash
и dash
. Есть ли практическая разница между ними, кроме того, что :
экономит три байта и делает сценарии менее читаемыми?
Ответы:
Там нет реальной разницы в поведении. Обе команды ничего не делают и выходят с успешным статусом.
:
подчеркивает, что ничего не делает;true
подчеркивает успешный статус.strace true
работает, потому чтоtrue
является встроенной оболочкой и внешней командой (/bin/true
);:
это только встроенная оболочка (нет/bin/:
- хотя может быть, и, вероятно, была на очень старых системах Unix). В bash попробуйПричины того, что оба существуют, являются историческими. Если я правильно помню, некоторые очень ранние оболочки не имели синтаксиса комментариев, поэтому
:
вместо этого использовалась команда « ничего не делать» .Существует некоторая внутренняя разница
dash
. Просматривая исходный код, доступный по адресу git: //git.kernel.org/pub/scm/utils/dash/dash.git, показывает несколько различных путей кодаeval.c
, но я не смог произвести какое-либо заметно другое поведение, кроме чем словоspecial
на выходеtype :
.источник
/bin/true
или/bin/false
. Кроме того ,:
команда иногда используется для обработки побочных эффектов аргумента:: ${num_times:=10}
.:
был первоначально индикатор этикетки , назад в предке Bourne оболочки , которая имелаgoto
. Видимо:
был оскорблен как индикатор комментария и застрял.:
в качестве индикатора метки для goto было сохранено в клоне псевдо-Unix командной строки Microsoftcommand.com
, и остается его преемникомcmd.exe
, как и практика злоупотребления::
для комментария в строке.Они идентичны в Bash. Посмотрите на
builtins/colon.def
исходный код Bash-4.2.В вашей команде
strace true
вы фактически запускаете двоичный файл/bin/true
вместо встроенного в bash true.источник