Я использую оболочку 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:
А что, если в другой оболочке нет встроенного echo?
Why there are two standalone programs of echo Пожалуйста, опубликуйте результат readlink -f /usr/bin/echo /bin/echo@KamilCuk Добавил скриншот
Пожалуйста, не публикуйте скриншоты текста. Добавьте текст как текст.
bash не имеет двух команд с таким именем. У него есть одна внутренняя команда с именем echo, и, конечно же, каждый исполняемый файл, который имеет имя echo и находится в PATH, который вы определяете, также доступен под этим именем. Вот как должен работать PATH-поиск. Вы можете спросить, почему Linux предоставляет исполняемый файл с именем echo в /usr/bin. Это позволяет любой программе использовать это echo без необходимости в оболочке.





Я прав?
Да.
почему существуют автономные эхо-программы
Потому что вы можете захотеть их использовать.
Существуют ли конкретные сценарии, когда предпочтительнее использовать автономные программы эха?
Да, когда ты 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 заставил меня это сделать», — объясняет это.
Как бы что-то вроде
xargsработалоecho, если бы для него не было программы?