В чем разница между: и правда?

15

В 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. Есть ли практическая разница между ними, кроме того, что :экономит три байта и делает сценарии менее читаемыми?

l0b0
источник

Ответы:

27

Там нет реальной разницы в поведении. Обе команды ничего не делают и выходят с успешным статусом. :подчеркивает, что ничего не делает; trueподчеркивает успешный статус.

strace trueработает, потому что trueявляется встроенной оболочкой и внешней командой ( /bin/true); :это только встроенная оболочка (нет /bin/:- хотя может быть, и, вероятно, была на очень старых системах Unix). В bash попробуй

type -a :
type -a true

Причины того, что оба существуют, являются историческими. Если я правильно помню, некоторые очень ранние оболочки не имели синтаксиса комментариев, поэтому :вместо этого использовалась команда « ничего не делать» .

Существует некоторая внутренняя разница dash. Просматривая исходный код, доступный по адресу git: //git.kernel.org/pub/scm/utils/dash/dash.git, показывает несколько различных путей кода eval.c, но я не смог произвести какое-либо заметно другое поведение, кроме чем слово specialна выходе type :.

Кит Томпсон
источник
8
Кроме того, ранние версии UNIX не имели /bin/trueили /bin/false. Кроме того , :команда иногда используется для обработки побочных эффектов аргумента: : ${num_times:=10}.
Arcege
5
:был первоначально индикатор этикетки , назад в предке Bourne оболочки , которая имела goto. Видимо :был оскорблен как индикатор комментария и застрял.
Жиль "ТАК - перестань быть злым"
1
Поведение :в качестве индикатора метки для goto было сохранено в клоне псевдо-Unix командной строки Microsoft command.com, и остается его преемником cmd.exe, как и практика злоупотребления ::для комментария в строке.
Сорпигал
8

Они идентичны в Bash. Посмотрите на builtins/colon.defисходный код Bash-4.2.

В вашей команде strace trueвы фактически запускаете двоичный файл /bin/trueвместо встроенного в bash true.

Джоди С
источник