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:
kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf
É printf
um embutido neste shell ou não? O resultado é semelhante para vários outros utilitários supostamente internos 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
é um built-in):
$ command -v printf
printf
$ type printf
printf is a shell builtin
posix
printf
shell-builtin
yash
Kusalananda
fonte
fonte
PATH
para que um built-in regular para ser executado - então faça sua pergunta sobre isso.Respostas:
O
yash
shell não tem, e faz uso, uma versão built-in deprintf
(e outros utilitários). Por acaso, é muito compatível com o POSIX, de maneira pedanástica, na maneira como formula o resultado dos comandoscommand -v
etype
.Como comentários do mosvy , o padrão POSIX exige que um comando interno regular esteja disponível como um comando externo
$PATH
para que a versão interna do comando seja executada.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
acrescenta a isso que o comando é um built-in regular.Como o
printf
comando foi encontrado no caminho de pesquisa e como é um built-in regular no shell,yash
ele chamará sua versão interna do comando . Se nãoprintf
foi encontrado no caminho e se o shell estivesse sendo executado no modo correto POSIX-ly, um erro teria sido gerado.yash
yash
orgulha-se de ser um shell muito compatível com POSIX, e isso também é verdade se observarmos o que o POSIX diz sobrecommand -v
:fonte
O shell Watanabe possui três tipos de embutidos, 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" devido à ausência de qualquer nota dizendo que o comando é "especial" ou "semi-especial" construídas em. Os embutidos regulares não são marcados.
printf
é um desses "regulares" embutidos. No modo nativo, é sempre invocado, independentemente de haver um comando externo encontrado por esse nome.Mas quando a
posixly-correct
opção de shell é definida, é apenas um recurso interno se o comando externo puder ser encontrado noPATH
.Na verdade, isso está em conformidade com o que a Especificação Unix Unificada diz e diz desde pelo menos 1997.
Difere do shell Z, do shell 93 Korn, do shell Bourne Again e do shell Debian Almquist, nenhum dos quais implementa ou documenta esse comportamento para os built-ins regulares. O shell Z, por exemplo, documenta que os embutidos regulares sempre são encontrados, antes da etapa que procura
PATH
. O mesmo acontece com o shell Debian Almquist. E é isso que todos os shells fazem, mesmo que sejam invocados comosh
nas opções de ativação do POSIX.No entanto, não executar
printf
quando não estiverPATH
ativado é o comportamento do shell PD Korn, shell Heirloom Bourne e shell MirBSD Korn; porque eles não têm umprintf
built-in em primeiro lugar. ☺fonte
A redação pode ser melhorada.
Se o shell estiver no modo posix
set --posixly-correct
::Para embutidos regulares que não existem no PATH, isso é impresso:
Qual é uma descrição clara: é um interno, mas não há executável com o mesmo nome no PATH.
No entanto, para built-ins regulares cujo nome também existe no PATH, isso é impresso:
O que parece implicar que o executável em / bin / echo será executado (o que não será). Sugiro que uma alteração de
at
paraalso found in PATH at
:faria uma descrição melhor. Talvez incluir isso entre parênteses (como a outra resposta) poderia torná-lo melhor.
No modo POSIX, nenhum built-in regular funcionará menos que também seja encontrado no PATH.
No entanto, ambos (POSIX) são especiais:
E o yash é semi-especial (não especial para POSIX):
builtins ainda funcionam.
fonte