Почему в Bash есть как встроенная команда эха, так и отдельные эхо-программы?

Я использую оболочку Bash в Ubuntu 22.04.

Когда я запускаю type -a echo, я получаю следующий вывод:

Насколько я понимаю, когда я запускаю команду, скажем, echo "Hello Wolrd!", Bash запускает встроенную команду echo. Я прав?

Мой первый вопрос: если Bash запускает встроенную команду echo по умолчанию, почему существуют отдельные echo программы: /usr/bin/echo и /bin/echo? Существуют ли конкретные сценарии, когда вы предпочитаете использовать автономные программы echo?

Мой второй вопрос: почему существуют две отдельные программы echo, как показано на скриншоте выше? И если я решу запустить отдельную программу, какую мне следует использовать и почему?

Буду признателен за подробный ответ. Спасибо.

Редактировать-1 Вот что я получаю, когда запускаю команду readlink, чтобы проверить, является ли /bin символической ссылкой на /usr/bin:

Как бы что-то вроде xargs работало echo, если бы для него не было программы?

Davis Herring 20.07.2023 08:37

А что, если в другой оболочке нет встроенного echo?

Diego Torres Milano 20.07.2023 08:50
Why there are two standalone programs of echo Пожалуйста, опубликуйте результат readlink -f /usr/bin/echo /bin/echo
KamilCuk 20.07.2023 08:57

@KamilCuk Добавил скриншот

HKS 20.07.2023 09:33

Пожалуйста, не публикуйте скриншоты текста. Добавьте текст как текст.

KamilCuk 20.07.2023 09:50

bash не имеет двух команд с таким именем. У него есть одна внутренняя команда с именем echo, и, конечно же, каждый исполняемый файл, который имеет имя echo и находится в PATH, который вы определяете, также доступен под этим именем. Вот как должен работать PATH-поиск. Вы можете спросить, почему Linux предоставляет исполняемый файл с именем echo в /usr/bin. Это позволяет любой программе использовать это echo без необходимости в оболочке.

user1934428 20.07.2023 14:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я прав?

Да.

почему существуют автономные эхо-программы

Потому что вы можете захотеть их использовать.

Существуют ли конкретные сценарии, когда предпочтительнее использовать автономные программы эха?

Да, когда ты fork+exec и хочешь бежать echo, а не bash. Ставьте лайк xargs echo в комментариях. Обратите внимание, что xargs без аргументов по умолчанию запускает echo, поэтому вид xargs зависит от существования исполняемого файла echo.

Почему есть две автономные программы эха, как показано на скриншоте выше?

В большинстве систем /bin является символической ссылкой на /usr/bin или иначе. Это тот же файл.

какой из них я должен использовать и почему?

Используйте первый в PATH. Потому что PATH для выбора того, что бежать.

В Bash есть только встроенный echo. Программа /bin/echo в вашей системе происходит не из пакета/проекта Bash.

Эхо Bash доступно только внутри bash. Мы не можем заставить операционную систему выполнить echo программу, например, с функцией execl библиотеки C:

Например, без /bin/echo это не сработает:

execl("/bin/echo", "echo", "foo", (char *) NULL);

Только это:

execl("/bin/sh", "sh", "-c", "echo foo", (char *) NULL);

Но зачем вам вообще нужно выполнять /bin/echo вместо того, чтобы просто использовать библиотеку ввода-вывода языка программирования для вывода чего-либо на стандартный вывод? Это хороший вопрос: вы бы не стали. Конкретный пример /bin/echo не является полезной программой, кроме встроенной оболочки. И даже это в основном устарело.

Основная причина, по которой существует настоящая команда echo, заключается в том, что POSIX, гм, перекликается с моими замечаниями выше по поводу exec. См. раздел 1.6 здесь, где указано это требование:

Однако все стандартные утилиты, включая обычные встроенные в таблице, но не специальные встроенные утилиты, описанные в разделе «Специальные встроенные утилиты», должны быть реализованы таким образом, чтобы к ним можно было получить доступ через семейство функций exec, как определено в томе «Системные интерфейсы» стандарта POSIX.1-2008, и их можно было вызывать непосредственно теми стандартными утилитами, которым это необходимо (env, find, nice, nohup, time, xargs ).

Это также обеспечивает искомое обоснование: есть определенные утилиты, которые вызывают другие утилиты, такие как xargs и find, без использования оболочки: просто с помощью механизма exec. Они не могут работать только со встроенными утилитами.

В конкретном случае echo использование его с любой из вышеперечисленных команд не очень полезно; но POSIX не делает исключений для утилиты echo; если он предлагается как встроенный, он все равно должен быть предоставлен в exec-способной форме.

Единственные утилиты, которым разрешено существовать только как встроенные, это те, которые обязательно должны быть встроенными, чтобы иметь смысл. И даже не все, а часть. Например, cd не имеет смысла как внешняя команда, поскольку она не меняет каталог процесса, который ее выполняет; в лучшем случае он обеспечивает проверку на ошибку, может ли он изменить каталог. Тем не менее, cd не является одной из специальных встроенных утилит, которые могут быть предоставлены только как встроенные утилиты; система POSIX должна иметь исполняемую cd утилиту.

Я задавался вопросом, почему /bin/[ существует. Я думал, что это просто историческое наследие. «POSIX заставил меня это сделать», — объясняет это.

glenn jackman 20.07.2023 15:01

Другие вопросы по теме