Esta es una regla de "como si".
En pocas palabras: el comportamiento del shell tal como lo ven los usuarios no debería cambiar si una implementación decide hacer que un comando externo estándar también esté disponible como shell incorporado.
El contraste que mostré en /unix//a/496291/5132 entre los comportamientos de (por un lado) los proyectiles PD Korn, MirBSD Korn y Heirloom Bourne; (por otro lado) los proyectiles Z, 93 Korn, Bourne Again y Debian Almquist; y (en la mano de agarre) el caparazón Watanabe resalta esto.
Para los shells que no tienen printf
incorporado, la eliminación /usr/bin
de PATH
hace una invocación de printf
dejar de funcionar. El comportamiento conforme POSIX, exhibido por el shell Watanabe en su modo conforme, causa el mismo resultado. El comportamiento del shell que tiene printf
incorporado es como si estuviera invocando un comando externo.
Mientras que el comportamiento de todos los shells no conformes no altera si /usr/bin
se elimina PATH
, y no se comportan como si estuvieran invocando un comando externo.
Lo que el estándar intenta garantizarle es que los shells pueden incorporar todo tipo de comandos normalmente externos (o implementarlos como sus propias funciones de shell), y aún obtendrá el mismo comportamiento de los incorporados que lo hizo. con los comandos externos si se ajusta PATH
para evitar que se encuentren los comandos. PATH
sigue siendo su herramienta para seleccionar y controlar qué comandos puede invocar.
(Como se explicó en /unix//a/448799/5132 , hace años la gente eligió la personalidad de su Unix cambiando lo que estaba funcionando PATH
).
Uno podría decir que hacer que el comando siempre funcione independientemente de si se puede encontrar PATH
es, de hecho, el punto de hacer que los comandos normalmente externos estén integrados. (Es por eso que mi conjunto de herramientas nosh acaba de obtener un printenv
comando incorporado en la versión 1.38, de hecho. Aunque esto no es un shell).
Pero el estándar le brinda la garantía de que verá el mismo comportamiento para los comandos externos regulares que no están activados PATH
desde el shell, como lo verá en otros programas que no son del shell que invocan la execvpe()
función, y el shell no podrá mágicamente ejecutar (aparentemente) comandos externos ordinarios que otros programas no pueden encontrar con el mismo PATH
. Todo funciona de forma coherente desde la perspectiva del usuario, y PATH
es la herramienta para controlar cómo funciona.
Otras lecturas