O yash
shell possui um printf
built-in, de acordo com seu manual .
No entanto, é isso que vejo em um yash
shell com configuração padrão:
$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf
É printf
um built-in neste shell ou não? O resultado é semelhante para vários outros utilitários supostamente integrados que também estão disponíveis como comandos externos.
Como comparação, em pdksh
( ksh
no OpenBSD, onde nãoprintf
é um built-in):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
E em bash
(onde printf
está um built-in):
$ command -v printf
printf
$ type printf
printf is a shell builtin
O
yash
shell tem e usa uma versão embutida doprintf
(e outros utilitários). Acontece de ser muito pedantemente compatível com POSIX na maneira como formula o resultado dos comandoscommand -v
e .type
Como comentários mosvy , o padrão POSIX exige que um comando interno regular esteja disponível como um comando externo
$PATH
para a versão interna do comando a ser executado.Este é o texto relevante da norma :
Isso significa que a saída de
command -v printf
significa que oprintf
comando foi encontrado no caminho de pesquisa, enquanto a saída detype printf
adiciona a isso que o comando é um built-in regular.Como o
printf
comando foi encontrado no caminho de pesquisa e como é um comando embutido regular no shell,yash
chamará sua versão integrada do comando . Se o nãoprintf
foi encontrado no caminho, e se o shell estava rodando no modo POSIX-ly correto, um erro teria sido gerado.yash
yash
se orgulha de ser um shell muito compatível com POSIX, e isso também é verdade se observarmos o que o POSIX diz sobrecommand -v
:O shell Watanabe possui três tipos de built-ins, descritos em detalhes em seu manual. Todos os comandos internos também estão listados lá, mas é preciso inferir que algo é um comando interno "regular" pela ausência de qualquer nota dizendo que o comando é "especial" ou "semi-especial" construídas em. Os built-ins regulares não são marcados.
printf
é um desses "regulares" embutidos. No modo nativo, é sempre invocado, independentemente de haver um comando externo encontrado com esse nome.Mas quando a
posixly-correct
opção shell é definida, ela é apenas incorporada se o comando externo puder ser encontrado no arquivoPATH
.Na verdade, isso está de acordo com o que diz a Especificação Unix Única, e tem dito desde pelo menos 1997.
Ele difere do shell Z, do shell 93 Korn, do shell Bourne Again e do shell Debian Almquist, nenhum dos quais implementa ou documenta tal comportamento para built-ins regulares. O shell Z, por exemplo, documenta que os built-ins regulares sempre são encontrados, antes da etapa que pesquisa
PATH
. O mesmo acontece com o shell Debian Almquist. E é isso que todos esses shells fazem, mesmo se invocados comosh
com suas opções de ativação do POSIX.No entanto, não executar
printf
quando não estáPATH
ativado é o comportamento do shell PD Korn, do shell Heirloom Bourne e do shell MirBSD Korn; porque eles não têm umprintf
built-in em primeiro lugar. ☺