Jest to reguła „jak gdyby”.
Mówiąc najprościej: Zachowanie powłoki, jak widzą użytkownicy, nie powinno się zmieniać, jeśli implementacja zdecyduje się udostępnić standardowe polecenie zewnętrzne również jako wbudowane powłoki.
Kontrast, który pokazałem na /unix//a/496291/5132 między zachowaniami (z jednej strony) skorup PD Korn, MirBSD Korn i Heirloom Bourne; (z drugiej strony) pociski Z, 93 Korn, Bourne Again i Debian Almquist; i (na chwytającej ręce) powłoka Watanabe podkreśla to.
W przypadku powłok, które nie są printf
wbudowane, usunięcie /usr/bin
z PATH
powoduje wywołanie printf
zatrzymania działania. Zachowanie zgodne z POSIX, wykazywane przez powłokę Watanabe w trybie zgodności, powoduje ten sam wynik. Zachowanie powłoki, która ma printf
wbudowane, jest tak, jakby wywoływała zewnętrzne polecenie.
Podczas gdy zachowanie wszystkich niezgodnych powłok nie zmienia się, jeśli /usr/bin
zostanie usunięte PATH
, i nie zachowują się tak, jakby wywoływały zewnętrzne polecenie.
To, co standard próbuje Ci zagwarantować, to to, że powłoki mogą wbudowywać wszelkiego rodzaju normalnie zewnętrzne polecenia (lub implementować je jako własne funkcje powłoki), a nadal będziesz mieć takie samo zachowanie z wbudowanych funkcji, jak to robiłeś z zewnętrznymi poleceniami, jeśli dostosujesz, PATH
aby zatrzymać wyszukiwanie poleceń. PATH
pozostaje narzędziem do wybierania i kontrolowania poleceń, które można wywoływać.
(Jak wyjaśniono na /unix//a/448799/5132 , lata temu ludzie wybrali osobowość swojego Uniksa, zmieniając to, co było włączone PATH
.)
Można by pomyśleć, że sprawienie, by polecenie zawsze działało bez względu na to, czy można je znaleźć, PATH
jest w rzeczywistości celem wbudowania normalnie zewnętrznych poleceń. (Właśnie dlatego mój zestaw narzędzi nosh właśnie uzyskał wbudowane printenv
polecenie w wersji 1.38. Chociaż nie jest to powłoka).
Ale standard daje ci gwarancję, że zobaczysz to samo zachowanie dla zwykłych poleceń zewnętrznych, które nie są włączone PATH
z powłoki, jak zobaczysz w innych programach innych niż powłoki wywołujących tę execvpe()
funkcję, a powłoka nie będzie magicznie mogła uruchamiaj (najwyraźniej) zwykłe polecenia zewnętrzne, których inne programy nie mogą znaleźć przy tym samym PATH
. Wszystko działa spójnie z perspektywy użytkownika i PATH
jest narzędziem do kontrolowania, jak to działa.
Dalsza lektura