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

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

  • Почему bash 4.3 сохраняет выделение памяти в скрипте
  • Почему никто не использует истинную оболочку Bourne как / bin / sh?
  • dash reports «Синтаксическая ошибка:» («неожиданно» при использовании замещения процесса
  • Вызов bash из sh (тире) с командами, считанными из args, и «Unterminated quoteed string» / «неожиданный EOF»
  • Почему kill не работает из сценария, но работает с терминалом?
  • есть ли какие-либо другие оболочки, кроме bash / dash, которые используются по умолчанию в дистрибутивах GNU / Linux?
  • Очистка ошибок для сценариев оболочки
  • Дэш-эквивалент саморасправки выхода скрипта
  • 2 Solutions collect form web for “В чем разница: и правда?”

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

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

     type -a : type -a true 

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

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

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

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

    Interesting Posts

    Запретить пустую электронную почту rsync на cron

    Вариации в статистике Ubuntu 12.04 / usr / bin / time

    Я не могу скомпилировать пакет Slingswarm из GitHub на Debian 8

    Как создать связь между интерфейсами, маршрутом и процессом

    Как добавить строку к предыдущей строке?

    Как установить пакет объявлений в Kubuntu для LaTeX?

    find и sed (найти и заменить) вызывает незаконную последовательность байтов в Mac OS X

    Отключить заголовок Chrome в X11 без оконного менеджера

    Как настроить двухканальные мониторы с драйверами Nvidia и одним монитором?

    Как я могу сказать Mutt, чтобы попросить кодовую фразу gpg?

    Правильное указание субдомена

    Как заставить бесконечно исполняющуюся команду убивать себя, когда выполняются определенные условия?

    Низкий заряд батареи задерживает ноутбук

    Внешние устройства хранения, не указанные в сценарии init, запущены

    Shell, bash, linux: после объявления переменной, почему используется точка с запятой и что она делает?

    Linux и Unix - лучшая ОС в мире.