La yash
coque a un printf
intégré, selon son manuel .
Cependant, c'est ce que je vois dans un yash
shell avec une configuration par défaut:
kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf
Est printf
un intégré dans ce shell ou non? Le résultat est similaire pour un certain nombre d'autres utilitaires supposés intégrés qui sont également disponibles en tant que commandes externes.
A titre de comparaison, dans pdksh
( ksh
sur OpenBSD, où printf
n'est pas intégré):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
Et dans bash
(où printf
est intégré):
$ command -v printf
printf
$ type printf
printf is a shell builtin
posix
printf
shell-builtin
yash
Kusalananda
la source
la source
PATH
pour un incorporé régulier à exécuter - alors veuillez poser votre question à ce sujet.Réponses:
Le
yash
shell possède et utilise une version intégrée deprintf
(et d'autres utilitaires). Il se trouve qu'il est très conforme à la norme POSIX dans la façon dont il formule le résultat des commandescommand -v
ettype
.Comme le commente mosvy , la norme POSIX requiert qu'une commande intégrée standard soit disponible en tant que commande externe
$PATH
pour que la version intégrée de la commande soit exécutée.Voici le texte pertinent de la norme :
Cela signifie que la sortie de
command -v printf
signifie que laprintf
commande a été trouvée dans le chemin de recherche, tandis que la sortie detype printf
ajoute à cela que la commande est une fonction intégrée standard.Étant donné que la
printf
commande a été trouvée dans le chemin de recherche, et puisqu'il s'agit d'un shell intégré normal,yash
appellera sa version intégrée de la commande . Si l'printf
on ne trouve dans le chemin, et si layash
coque est en cours d' exécution en mode POSIX ment correct, une erreur aurait été générée à la place.yash
se targue d'être un shell très conforme à POSIX, et cela est également vrai si nous regardons ce que POSIX dit à propos decommand -v
:la source
La coque Watanabe a trois sortes de fonctions intégrées, décrites en détail dans son manuel. Toutes les commandes intégrées y sont également répertoriées, mais il faut en déduire que quelque chose est une commande intégrée "régulière" de l' absence de note indiquant que la commande est une "spéciale" ou une "semi-spéciale" intégré. Les fonctions intégrées standard ne sont pas marquées.
printf
est un tel intégré "régulier". En mode natif, il est toujours appelé, qu'il existe ou non une commande externe trouvée sous ce nom.Mais lorsque l'
posixly-correct
option shell est définie, elle n'est intégrée que si la commande externe peut être trouvée sur lePATH
.Ceci est en fait conforme à ce que dit la spécification Unix unique, et le dit depuis au moins 1997.
Il diffère du shell Z, du shell 93 Korn, du shell Bourne Again et du shell Debian Almquist. Le shell Z, par exemple, documente que les intégrations régulières sont toujours trouvées, avant l'étape de recherche
PATH
. Il en va de même pour le shell Debian Almquist. Et c'est ce que font tous ces shells, même s'ils sont invoqués commesh
avec leurs options d'activation POSIX.Cependant, ne fonctionne pas
printf
quand il n'est pas sur lePATH
comportement du shell PD Korn, du shell Heirloom Bourne et du shell MirBSD Korn; parce qu'ils n'ont pasprintf
intégré en premier lieu. ☺la source
Le libellé pourrait être amélioré.
Si le shell est en mode posix
set --posixly-correct
::Pour les incorporations régulières qui n'existent pas dans le PATH, ceci est imprimé:
Ce qui est une description claire: c'est une fonction intégrée mais il n'y a pas d'exécutable du même nom dans le PATH.
Cependant, pour les fonctions intégrées régulières dont le nom existe également dans le CHEMIN, ceci est imprimé:
Ce qui semble impliquer que l'exécutable de / bin / echo sera exécuté (ce qui ne le sera pas). Je suggère qu'un changement de
at
àalso found in PATH at
:ferait une meilleure description. Peut-être que la mise entre parenthèses (comme l'a fait l'autre réponse) pourrait l'améliorer.
En mode POSIX, aucune fonction intégrée normale ne fonctionnera à moins qu'elle ne se trouve également dans le PATH.
Cependant, les deux (POSIX) spéciaux:
Et semi-spécial de yash (pas spécial pour POSIX):
les builtins fonctionnent toujours.
la source