La yashcarcasa tiene una funciónprintf , de acuerdo con su manual .
Sin embargo, esto es lo que veo en un yashshell con configuración predeterminada:
kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf
¿Está printfintegrado en este shell o no? El resultado es similar para una serie de otras utilidades supuestamente integradas que también están disponibles como comandos externos.
Como comparación, en pdksh( kshen OpenBSD, donde noprintf está integrado):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
Y en bash(donde printf está incorporado):
$ command -v printf
printf
$ type printf
printf is a shell builtin
posix
printf
shell-builtin
yash
Kusalananda
fuente
fuente

PATHel fin de regular de una función de para ser ejecutado, entonces haga su pregunta al respecto.Respuestas:
La
yashcáscara hace tener, y hace uso, una versión incorporada deprintf(y otros servicios públicos). Simplemente resulta que es muy pedagógicamente compatible con POSIX en la forma en que formula el resultado de lacommand -vytypecomandos .Como comenta mosvy , el estándar POSIX requiere que un habitual comando integrado estará disponible como un comando externo en
$PATHla versión integrada del comando a ejecutar.Este es el texto relevante del estándar :
Esto significa que la salida de
command -v printfsignifica que elprintfcomando se encontró en la ruta de búsqueda, mientras que la salida detype printfagrega a esto que el comando es un elemento incorporado normal.Dado que el
printfcomando se encontró en la ruta de búsqueda, y dado que es una función integrada normal en el shell,yashllamará a su versión integrada del comando . Si laprintfse no encuentra en el camino, y si layashcáscara estaba corriendo en POSIX-ly modo correcto, se habría generado un error en lugar.yashse enorgullece de ser un shell muy compatible con POSIX, y esto también es cierto si miramos lo que POSIX dice sobrecommand -v:fuente
La carcasa de Watanabe tiene tres tipos de elementos integrados, que se describen en detalle en su manual. Todos los comandos integrados también se enumeran allí, pero uno tiene que inferir que algo es un comando incorporado "normal" por la ausencia de una nota que diga que el comando es un "especial" o un "semi-especial" incorporado. Las incorporaciones regulares no están marcadas.
printfes uno de esos "regulares" integrados. En modo nativo, siempre se invoca, independientemente de si se encuentra un comando externo con ese nombre.Pero cuando la
posixly-correctopción de shell está configurada, solo está integrada si el comando externo se puede encontrar en elPATH.Esto es realmente conforme a lo que dice la Especificación Single Unix, y lo ha dicho al menos desde 1997.
Difiere del shell Z, el shell 93 Korn, el shell Bourne Again y el shell Debian Almquist, ninguno de los cuales implementa o documenta tal comportamiento para las incorporaciones regulares. El shell Z, por ejemplo, documenta que siempre se encuentran elementos integrados regulares , antes del paso que busca
PATH. También lo hace el shell Debian Almquist. Y eso es lo que hacen todos estos shells, incluso si se invocan comoshcon sus opciones de encendido POSIX.Sin embargo, no se ejecuta
printfcuando no estáPATHactivado el comportamiento del shell PD Korn, el shell Heirloom Bourne y el shell MirBSD Korn; porque no tienen unprintfincorporado en primer lugar. ☺fuente
La redacción podría mejorarse.
Si el shell está en modo posix
set --posixly-correct::Para las incorporaciones regulares que no existen en la RUTA, esto se imprime:
Lo cual es una descripción clara: es un archivo incorporado pero no hay un ejecutable con el mismo nombre en la RUTA.
Sin embargo, para las incorporaciones regulares cuyo nombre también existe en la RUTA, esto se imprime:
Lo cual parece implicar que se ejecutará el ejecutable en / bin / echo (que no se ejecutará). Sugiero que un cambio de
ataalso found in PATH at:haría una mejor descripción. Quizás incluir eso entre paréntesis (como lo hizo la otra respuesta) podría mejorarlo.
En el modo POSIX, no funcionará ninguna construcción regular a menos que también se encuentre en la RUTA.
Sin embargo, ambos (POSIX) especiales:
Y semi-especial de yash (no especial para POSIX):
Los builtins todavía funcionan.
fuente