Оболочка Watanabe имеет три вида встроенных модулей, подробно описанных в руководстве пользователя. Здесь также перечислены все встроенные команды, но нужно сделать вывод, что что-то является «обычной» встроенной командой из-за отсутствия каких-либо примечаний, говорящих о том, что команда «особая» или «полу особая» встроенный. Обычные встроенные модули не отмечены.
printf
является одним из таких «обычных» встроенных. В основном режиме он вызывается всегда , независимо от того, найдена ли внешняя команда с этим именем.
$ PATH = / usr / bin
$ printf
printf: эта команда требует операнд
$ type printf
printf: обычный встроенный в / usr / bin / printf
$
$ PATH = /
$ printf
printf: эта команда требует операнд
$ type printf
printf: обычный встроенный (не найден в $ PATH)
$
Но когда posixly-correct
опция оболочки установлена, она является только встроенной, если внешняя команда может быть найдена в PATH
.
$ set --posixly-correct
$
$ PATH = / usr / bin
$ printf
printf: эта команда требует операнд
$
$ PATH = /
$ printf
yash: нет такой команды `printf '
$
Это на самом деле соответствует тому, что говорится в Спецификации Single Unix, и как минимум с 1997 года.
Он отличается от оболочки Z, оболочки 93 Korn, оболочки Bourne Again и оболочки Debian Almquist, которые не реализуют и не документируют такое поведение для обычных встроенных программ. Оболочка Z, например, документы, которые всегда находятся в обычных встроенных модулях , до шага поиска PATH
. Также как и оболочка Debian Almquist. И это то, что делают все эти оболочки, даже если они запускаются как sh
с их опциями включения POSIX.
% / bin / exec -a sh zsh -c "PATH = /; тип printf; printf"
printf - это встроенная оболочка
zsh: printf: 1: недостаточно аргументов
% / bin / exec -a sh ksh93 -c "PATH = /; тип printf; printf"
printf - это встроенная оболочка
Использование: printf [параметры] формат [строка ...]
% / bin / exec -a sh bash --posix -c "PATH = / type printf; printf"
printf - это встроенная оболочка
printf: использование: printf [-v var] формат [аргументы]
% / bin / exec -a sh dash -c "PATH = /; тип printf; printf"
printf - это встроенная оболочка
sh: 1: printf: использование: формат printf [arg ...]
%
Однако не работает, printf
когда он не PATH
включен, поведение оболочки PD Korn, оболочки Heirloom Bourne и оболочки MirBSD Korn; потому что они не имеют printf
встроенного в первую очередь. ☺
% / bin / exec -a sh `команда -v ksh` -c" PATH = /; тип printf; printf "
printf не найден
sh: printf: не найдено
% / bin / exec -a sh `команда -v oksh` -c" PATH = /; тип printf; printf "
printf не найден
sh: printf: не найдено
% / bin / exec -a sh `команда -v jsh` -c" PATH = /; тип printf; printf "
printf не найден
sh: printf: не найдено
% / bin / exec -a sh mksh -c "PATH = /; тип printf; printf"
printf не найден
sh: printf: не найдено
% ksh -c "type printf; printf"
printf - отслеживаемый псевдоним для / usr / bin / printf
использование: формат printf [аргументы ...]
% oksh -c "type printf; printf"
printf - отслеживаемый псевдоним для / usr / bin / printf
использование: формат printf [аргументы ...]
% jsh -c "type printf; printf"
printf хэшируется (/ usr / bin / printf)
использование: формат printf [аргументы ...]
% mksh -c "type printf; printf"
printf - отслеживаемый псевдоним для / usr / bin / printf
использование: формат printf [аргументы ...]
$
PATH
для обычной встроенной чтобы быть казненным - тогда, пожалуйста, сделайте свой вопрос об этом.