La yash
carcasa tiene una funciónprintf
, de acuerdo con su manual .
Sin embargo, esto es lo que veo en un yash
shell 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á printf
integrado 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
( ksh
en 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
PATH
el fin de regular de una función de para ser ejecutado, entonces haga su pregunta al respecto.Respuestas:
La
yash
cá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 -v
ytype
comandos .Como comenta mosvy , el estándar POSIX requiere que un habitual comando integrado estará disponible como un comando externo en
$PATH
la versión integrada del comando a ejecutar.Este es el texto relevante del estándar :
Esto significa que la salida de
command -v printf
significa que elprintf
comando se encontró en la ruta de búsqueda, mientras que la salida detype printf
agrega a esto que el comando es un elemento incorporado normal.Dado que el
printf
comando se encontró en la ruta de búsqueda, y dado que es una función integrada normal en el shell,yash
llamará a su versión integrada del comando . Si laprintf
se no encuentra en el camino, y si layash
cáscara estaba corriendo en POSIX-ly modo correcto, se habría generado un error en lugar.yash
se 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.
printf
es 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-correct
opció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 comosh
con sus opciones de encendido POSIX.Sin embargo, no se ejecuta
printf
cuando no estáPATH
activado el comportamiento del shell PD Korn, el shell Heirloom Bourne y el shell MirBSD Korn; porque no tienen unprintf
incorporado 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
at
aalso 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