
La yash
concha tiene unprintf
incorporado,según su manual.
Sin embargo, esto es lo que veo en un yash
shell con configuración predeterminada:
$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf
¿Está printf
integrado en este shell o no? El resultado es similar para otras utilidades supuestamente integradas que también están disponibles como comandos externos.
A modo de comparación, en pdksh
( ksh
en OpenBSD, dondeprintf
estánoincorporado):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
Y en bash
(dondeprintf
esincorporado):
$ command -v printf
printf
$ type printf
printf is a shell builtin
Respuesta1
La yash
cáscarahacetiene, y utiliza, una versión integrada de printf
(y otras utilidades). Simplemente resulta ser muy pedante y compatible con POSIX en la forma en que formula el resultado de los comandos command -v
y type
.
como comenta mosvy, el estándar POSIX requiere que un comando integrado normal esté disponible como comando externo $PATH
para que se ejecute la versión integrada del comando.
Esto esel texto relevante de la norma:
Búsqueda y ejecución de comandos
Si un comando simple da como resultado un nombre de comando y una lista opcional de argumentos, se deberán realizar las siguientes acciones:
Si el nombre del comando no contiene ningún carácter <barra diagonal>, se producirá el primer paso exitoso en la siguiente secuencia:
a. Si el nombre del comando coincide con el nombre de una utilidad incorporada especial, se invocará esa utilidad incorporada especial.
[...]
- mi. De lo contrario, se buscará el comando utilizando la variable de entorno PATH como se describe en Variables de entorno XBD:
- i.Si la búsqueda tiene éxito:
- a.Si el sistema ha implementado la utilidad como una función incorporada normal o como una función de shell, se invocará en este punto de la búsqueda de ruta.
- b. De lo contrario, el shell ejecuta la utilidad en un entorno de utilidad separado
.- ii. Si la búsqueda no tiene éxito, el comando fallará con un estado de salida de 127 y el shell escribirá un mensaje de error.
- Si el nombre del comando contiene al menos una <barra>, [...]
Esto significa que la salida de command -v printf
significa que el printf
comandoerase encuentra en la ruta de búsqueda, mientras que el resultado de type printf
agrega a esto que el comando es un comando integrado normal.
Dado que el printf
comando se encontró en la ruta de búsqueda y que está integrado en el shell,yash
llamará a su versión incorporada del comando. si el printf
fueranoencontrado en la ruta, y si el yash
shell se estuviera ejecutando en modo POSIX-ly correcto, se habría generado un error en su lugar.
yash
se enorgullece de ser un shell muy compatible con POSIX, y esto también es cierto si miramoslo que dice POSIX sobrecommand -v
:
-v
Escriba una cadena en la salida estándar que indique la ruta o el comando que utilizará el shell, en el entorno de ejecución actual del shell (consulteEntorno de ejecución de Shell), para invocar
command_name
, pero no invocarcommand_name
.
- servicios públicos,utilidades integradas regulares,
command_names
incluido un<slash>
carácter, y cualquier función definida por la implementación que se encuentre usando laPATH
variable (como se describe enBúsqueda y ejecución de comandos),se escribirán como nombres de ruta absolutos.
Respuesta2
El caparazón de Watanabe tiene tres tipos de funciones integradas, que se describen en detalle en su manual. Todos los comandos integrados también se enumeran allí, pero hay que inferir que algo es un comando integrado "normal" delausenciaEs de destacar que el comando es un comando incorporado "especial" o "semiespecial". Los elementos integrados habituales no están marcados.
printf
es uno de esos integrados "normales". En modo nativo essiempreinvocado, independientemente de si hay un comando externo encontrado con ese nombre.
$RUTA=/usr/bin $imprimirf printf: este comando requiere un operando $escriba printf printf: un elemento integrado normal en /usr/bin/printf $ $RUTA=/ $imprimirf printf: este comando requiere un operando $escriba printf printf: un incorporado normal (no se encuentra en $PATH) $
Pero cuando la posixly-correct
opción Shell está configurada, solo es integrada si el comando externo se puede encontrar en el archivo PATH
.
$establecer --posixly-correcto $ $RUTA=/usr/bin $imprimirf printf: este comando requiere un operando $ $RUTA=/ $imprimirf yash: no existe tal comando `printf' $
En realidad, esto se ajusta a lo que dice la especificación única de Unix, y lo ha dicho desde al menos 1997.
Se diferencia del shell Z, el shell 93 Korn, el shell Bourne Again y el shell Debian Almquist, ninguno de los cuales implementa ni documenta dicho comportamiento para los integrados regulares. El shell Z, por ejemplo, documenta que las funciones integradas habituales estánsiempreencontró,antesel paso que busca PATH
. Lo mismo ocurre con el shell de Debian Almquist. Y eso es lo que hacen todos estos shells, incluso si se invocan como sh
con sus opciones de activación de POSIX.
%/bin/exec -a sh zsh -c "RUTA=/; escriba printf; printf" printf es un shell incorporado zsh:printf:1: no hay suficientes argumentos %/bin/exec -a sh ksh93 -c "RUTA=/; escriba printf; printf" printf es un shell incorporado Uso: printf [opciones] formato [cadena...] %/bin/exec -a sh bash --posix -c "RUTA=/ escriba printf ; printf" printf es un shell incorporado printf: uso: printf [-v var] formato [argumentos] %/bin/exec -a sh guión -c "RUTA=/; escriba printf; printf" printf es un shell incorporado sh: 1: printf: uso: formato printf [arg...] %
Sin embargo, no ejecutarse printf
cuando no está en el PATH
es el comportamiento del shell PD Korn, el shell Heirloom Bourne y el shell MirBSD Korn; porque no tienen printf
incorporado en primer lugar. ☺
%/bin/exec -a sh `comando -v ksh` -c "RUTA=/; escriba printf; printf" printf no encontrado sh: printf: no encontrado %/bin/exec -a sh `comando -v oksh` -c "RUTA=/; escriba printf; printf" printf no encontrado sh: printf: no encontrado %/bin/exec -a sh `comando -v jsh` -c "RUTA=/; escriba printf; printf" printf no encontrado sh: printf: no encontrado %/bin/exec -a sh mksh -c "RUTA=/; escriba printf; printf" printf no encontrado sh: printf: no encontrado %ksh -c "escriba printf; printf" printf es un alias rastreado para /usr/bin/printf uso: formato printf [argumentos...] %oksh -c "escriba printf; printf" printf es un alias rastreado para /usr/bin/printf uso: formato printf [argumentos...] %jsh -c "escriba printf; printf" printf tiene hash (/usr/bin/printf) uso: formato printf [argumentos...] %mksh -c "escriba printf; printf" printf es un alias rastreado para /usr/bin/printf uso: formato printf [argumentos...] $