У чому різниця між: і справжнім?


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. Чи є взагалі якась практична різниця між ними, за винятком того, що :зберігається три байти та робить сценарії менш читабельними?


Відповіді:


27

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

strace trueпрацює тому, що trueє вбудованою оболонкою і зовнішньою командою ( /bin/true); :є лише вбудованою оболонкою (немає /bin/:- хоча це могло бути, і, ймовірно, було на дуже старих системах Unix). В баш, спробуйте

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}.
Арседж

5
:був спочатку індикатор етикетки , тому в предка Bourne оболонки , яка мала goto. Мабуть, :його зловживали як показник коментаря та застрягли.
Жил "ТАК - перестань бути злим"

1
Поведінка :як індикатора мітки для goto збереглася в клоні командного рядка pseudo-Unix Microsoft command.com, і залишається його наступником cmd.exe, як і практика зловживань ::для коментаря до рядка.
Сорпігал

8

Вони однакові у Bash. Подивіться у builtins/colon.defвихідний код Bash-4.2.

У вашій команді strace trueви фактично виконуєте бінарний, /bin/trueа не bash вбудований true.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.