Я заметил, что в /bin/echo
моей системе Ubuntu MATE 17.04 есть двоичный исполняемый файл .
Я думал, это странно, потому что
$ type echo
echo is a shell builtin
Беглое тестирование предполагает, что это /bin/echo
делает то же самое, что и встроенная Bash echo
:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Итак, почему есть другая версия, echo
отдельная от программы Bash, и почему или когда я хочу ее использовать?
command-line
bash
echo
Занна
источник
источник
echo
он предоставляется как встроенная оболочка, тогда как этот вопрос спрашивает, почему он предоставляется как внешняя команда.Ответы:
Если вы откроете
bash
приглашение и введетеecho
команду, она использует встроенную оболочку, а не работает/bin/echo
. Причины, по которым все еще важно/bin/echo
существовать:echo
встроенных. Это на самом деле не требуется.Для того, чтобы расширить свое присутствие на # 1, предположу , что вы хотите , чтобы переместить все обычные файлы , чьи имена стали с
abc
любой точкойsrc
кdest
. Есть несколько способов сделать это, но один из них:Но предположим, что вместо того, чтобы просто выполнить это, вы хотите видеть каждую команду, которая будет выполняться первой. Что ж, тогда вы можете
echo
выполнить команду, как в других контекстах:Но
find
не использует оболочку. Это работает/bin/echo
.Кроме того ,
find
с-exec
или-execdir
, то/bin/echo
исполняемый файл будет называться другими программами , которые сами управляют программы , но не через оболочку. Это происходит сxargs
командой (которая связана сfind
), а также в ряде других контекстах, например, вExec=
строке в виде.desktop
файла . Другой пример - когда вы запускаетеsudo echo
, что может пригодиться для тестирования, еслиsudo
работает.Аналогично, некоторые оболочки имеют
printf
встроенные функции, но/usr/bin/printf
также существуют.Менее распространенная возможная причина, которую вы могли бы сознательно использовать,
/bin/echo
заключается в том, что вы полагались на различия между ним иecho
командой, предоставляемой вашей оболочкой.man echo
документы/bin/echo
;help echo
вbash
документахbash
встроенный.echo
не очень переносим, потому что разные реализации - как в операционных системах, так и в оболочках в одной и той же операционной системе - поддерживают разные варианты (например,-e
) и различаются в обработке обратной косой черты . Конечно, лучше избегать полагаться на такие детали и использоватьprintf
вместо этого, что гораздо более переносимо .В
bash
, вы можете также сделатьtype
встроенное шоу/bin/echo
- при условии, что/bin
оно у вас,$PATH
как всегда должно быть - передав ему-a
флаг :источник
cd
исполняемый файл существует (который при запуске изменяет каталог и завершает работу, оставляя вызывающую программу там, где они были раньше), и некоторые ОС имеют ее. Может быть полезно сослаться на 4.1 в стандартах GNU .cd
просто как тест на возможность доступа к данному каталогу: в случае/usr/bin/cd some/dir
успеха за один раз вы проверили: а) которыйsome/dir
существует, б) что это каталог или ссылка на него, и в) необходимые разрешения для доступа к этому каталогу существуют; все без изменения собственного состояния./bin/echo
, нет\bin\echo
, если вы не используете Windows. ;)Элия отлично поработал, ответив на это, но я хочу прокомментировать часть «почему существует другая версия,
echo
отдельная от программы Bash». Это неправильный вопрос.Правильный вопрос: почему это встроенное в первую очередь , когда оно могло быть (и является) совершенно хорошей внешней командой?
Для простоты взгляните на встроенные в dash, жалкие 38 (bash имеет 61, для сравнения, исходя из вывода
compgen -b
):Сколько из них должно быть встроено?
[
,echo
,false
,printf
,pwd
,test
, Иtrue
не нужно быть встроенными функциями : Они все , что только может сделать встроенный (аффект или получить оболочки состояния, не доступна для внешних команд) не делать. Bashprintf
по крайней мере использует преимущества встроенности:printf -v var
сохраняет выходные данные в переменнуюvar
.time
в bash также особенное: будучи ключевым словом, вы можете синхронизировать произвольные списки команд в bash (у dash нетtime
эквивалента).pwd
Не обязательно быть встроенным - любая внешняя команда наследует текущий рабочий каталог (и это тоже внешняя команда ).:
это исключение - вам нужен NOP, и:
это так. Остальные выполняют действия, которые легко может выполнить внешняя команда.Таким образом, пятая часть этих встроенных функций не должна быть встроенной. Тогда почему? Страница
dash
man * на самом деле объясняет, почему это встроенные (выделено мое):Вот и все: эти встроенные функции существуют потому, что они используются так часто, в интерактивном режиме и в сценариях, а их функциональные возможности достаточно просты, чтобы оболочка могла выполнять свою работу. И так бывает: некоторые (?) Большинство снарядов взяли на работу ** Вернуться к. Из 2.9 BSD , и вы не найдете встроенную команду.
sh
echo
Таким образом, вполне возможно, что минимальная оболочка может пропустить реализацию таких команд, как встроенные (хотя я не думаю, что какая-либо текущая оболочка это делает). Проект GNU coreutils не предполагает, что вы собираетесь запускать их в определенной оболочке, а POSIX требует этих команд. Итак, coreutils предоставляет их в любом случае и пропускает те, которые не имеют никакого значения вне оболочки.
* Это почти идентично соответствующему тексту man-страницы для оболочки Almquist , на которой основана черта, оболочка Debian Almquist.
**
zsh
доводит эту идею до крайности: команды, которые вы получаете, загружая различные модули, напримерzmv
, являются вещами , в которые вы даже не думаете, что оболочка даже не нуждается . В этот момент реальный вопрос: зачем вам использовать bash вместо zsh, в котором есть все эти встроенные функции?источник
:
поскольку внешний не был бы действительно NOP, у вас все еще был быPATH
поиск, попытка выполнить команду и т. Д., Когда все, что вам действительно нужно, это явно ничего не делать.:
как встроенный делает это.pwd
быть встроенным, чтобы он работал так, как он работает, с поведением по умолчанию, показывающим «логический» путь (pwd -L
)./bin/pwd
может реализовывать толькоpwd -P
поведение, показывающее вам фактические родительские каталоги, а не символическую ссылку, которую выcd
просматривали.pwd
немного скомпрометирован присутствиемPWD
, но да, это также случай bash, использующего встроенный статус для улучшения функциональности