Un poco confundido acerca de si printf en el shell yash es un comando integrado o no

Un poco confundido acerca de si printf en el shell yash es un comando integrado o no

La yashconcha tiene unprintf incorporado,según su manual.

Sin embargo, esto es lo que veo en un yashshell con configuración predeterminada:

$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf

¿Está printfintegrado 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( kshen 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 yashcá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 -vy type.

como comenta mosvy, el estándar POSIX requiere que un comando integrado normal esté disponible como comando externo $PATHpara 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:

  1. 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.
  2. Si el nombre del comando contiene al menos una <barra>, [...]

Esto significa que la salida de command -v printfsignifica que el printfcomandoerase encuentra en la ruta de búsqueda, mientras que el resultado de type printfagrega a esto que el comando es un comando integrado normal.

Dado que el printfcomando se encontró en la ruta de búsqueda y que está integrado en el shell,yashllamará a su versión incorporada del comando. si el printffueranoencontrado en la ruta, y si el yashshell se estuviera ejecutando en modo POSIX-ly correcto, se habría generado un error en su lugar.

yashse 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 invocar command_name.

  • servicios públicos,utilidades integradas regulares, command_namesincluido un <slash>carácter, y cualquier función definida por la implementación que se encuentre usando la PATHvariable (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.

printfes 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-correctopció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 shcon 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 printfcuando no está en el PATHes el comportamiento del shell PD Korn, el shell Heirloom Bourne y el shell MirBSD Korn; porque no tienen printfincorporado 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...]
$

información relacionada