yash
Оболочка имеет printf
встроенный, согласно его инструкции .
Тем не менее, это то, что я вижу в yash
оболочке с конфигурацией по умолчанию:
kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf
Является printf
встроенная в эту оболочку или нет? Результат аналогичен для ряда других предположительно встроенных утилит, которые также доступны в качестве внешних команд.
Для сравнения, в pdksh
( ksh
на OpenBSD, где printf
это не встроенный):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
А bash
(где printf
есть встроенный):
$ command -v printf
printf
$ type printf
printf is a shell builtin
posix
printf
shell-builtin
yash
Кусалананда
источник
источник
PATH
для обычной встроенной чтобы быть казненным - тогда, пожалуйста, сделайте свой вопрос об этом.Ответы:
yash
Оболочка делает есть, и делает использование, встроенный в версиюprintf
(и других утилит). Просто оказывается, что он очень педантично соответствует POSIX, так как формулирует результатcommand -v
иtype
команд.Как комментирует mosvy , стандарт POSIX требует, чтобы обычная встроенная команда была доступна как внешняя команда
$PATH
для выполнения встроенной версии команды.Это соответствующий текст из стандарта :
Это означает, что вывод
command -v printf
означает, чтоprintf
команда была найдена в пути поиска, а выводtype printf
добавляет к этому, что команда является встроенной.Поскольку
printf
команда была найдена в пути поиска, и поскольку она является обычной встроенной в оболочку,yash
будет вызываться ее встроенная версия команды . Если бы путь неprintf
был найден, и если оболочка работала в корректном режиме POSIX, вместо этого возникла бы ошибка.yash
yash
гордится тем, что является очень POSIX-совместимой оболочкой, и это также верно, если мы посмотрим, что говорит POSIXcommand -v
:источник
Оболочка Watanabe имеет три вида встроенных модулей, подробно описанных в руководстве пользователя. Здесь также перечислены все встроенные команды, но нужно сделать вывод, что что-то является «обычной» встроенной командой из-за отсутствия каких-либо примечаний, говорящих о том, что команда «особая» или «полу особая» встроенный. Обычные встроенные модули не отмечены.
printf
является одним из таких «обычных» встроенных. В основном режиме он вызывается всегда , независимо от того, найдена ли внешняя команда с этим именем.Но когда
posixly-correct
опция оболочки установлена, она является только встроенной, если внешняя команда может быть найдена вPATH
.Это на самом деле соответствует тому, что говорится в Спецификации Single Unix, и как минимум с 1997 года.
Он отличается от оболочки Z, оболочки 93 Korn, оболочки Bourne Again и оболочки Debian Almquist, которые не реализуют и не документируют такое поведение для обычных встроенных программ. Оболочка Z, например, документы, которые всегда находятся в обычных встроенных модулях , до шага поиска
PATH
. Также как и оболочка Debian Almquist. И это то, что делают все эти оболочки, даже если они запускаются какsh
с их опциями включения POSIX.Однако не работает,
printf
когда он неPATH
включен, поведение оболочки PD Korn, оболочки Heirloom Bourne и оболочки MirBSD Korn; потому что они не имеютprintf
встроенного в первую очередь. ☺источник
Формулировка может быть улучшена.
Если оболочка находится в режиме posix
set --posixly-correct
:Для обычных встроенных модулей, которые не существуют в PATH, это печатается:
Это четкое описание: это встроенный файл, но в PATH нет исполняемого файла с таким именем.
Однако для обычных встроенных модулей, имена которых также существуют в PATH, это печатается:
Который, кажется, подразумевает, что исполняемый файл в / bin / echo будет выполнен (чего не будет). Я полагаю , что переход от
at
кalso found in PATH at
:сделал бы лучшее описание. Возможно, заключив это в круглые скобки (как это сделал другой ответ), можно было бы сделать это лучше.
В режиме POSIX, не регулярные встроенное не будет работать , если он не будет также найден в PATH.
Тем не менее, оба (POSIX) специальные:
И yash полу-особенный (не особенный для POSIX):
встроенные функции все еще работают.
источник