Questa è una regola "come se".
In poche parole: il comportamento della shell quando gli utenti lo vedono non dovrebbe cambiare se un'implementazione decide di rendere disponibile anche un comando esterno standard come shell integrata.
Il contrasto che ho mostrato su /unix//a/496291/5132 tra i comportamenti (da un lato) delle conchiglie PD Korn, MirBSD Korn e Heirloom Bourne; (d'altra parte) le conchiglie Z, 93 Korn, Bourne Again e Debian Almquist; e (sulla mano avvincente) il guscio Watanabe lo evidenzia.
Per le shell che non hanno printf
come built-in, la rimozione /usr/bin
da PATH
fa invocare l' printf
interruzione del funzionamento. Il comportamento conforme POSIX, esposto dalla shell Watanabe nella sua modalità conforme, provoca lo stesso risultato. Il comportamento della shell che ha un printf
built-in è come se stesse invocando un comando esterno.
Considerando che il comportamento di tutte le shell non conformi non cambia se /usr/bin
viene rimosso da PATH
, e non si comportano come se stessero invocando un comando esterno.
Ciò che lo standard sta cercando di garantirvi è che le shell possono incorporare tutti i tipi di comandi normalmente esterni (o implementarli come proprie funzioni di shell), e otterrete comunque lo stesso comportamento dai built-in con i comandi esterni se si regola PATH
per interrompere la ricerca dei comandi. PATH
rimane il tuo strumento per selezionare e controllare quali comandi puoi invocare.
(Come spiegato su /unix//a/448799/5132 , anni fa le persone hanno scelto la personalità del loro Unix cambiando ciò che accadeva PATH
.)
Si potrebbe affermare che far funzionare sempre il comando indipendentemente dal fatto che sia possibile trovarlo PATH
è in effetti il punto di creare comandi normalmente esterni incorporati. (È per questo che il mio set di strumenti nosh ha appena ottenuto un printenv
comando integrato nella versione 1.38, in realtà. Anche se questa non è una shell.)
Ma lo standard ti dà la garanzia che vedrai lo stesso comportamento per i normali comandi esterni che non sono attivi PATH
dalla shell come vedrai da altri programmi non shell che invocano la execvpe()
funzione, e la shell non sarà magicamente in grado di eseguire (apparentemente) normali comandi esterni che altri programmi non riescono a trovare con lo stesso PATH
. Tutto funziona in modo auto-coerente dal punto di vista dell'utente ed PATH
è lo strumento per controllare come funziona.
Ulteriori letture