yash
Powłoka posiada printf
wbudowany, zgodnie z instrukcją .
Jednak to widzę w yash
powłoce z domyślną konfiguracją:
kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf
Czy printf
jest wbudowany w tę powłokę, czy nie? Wynik jest podobny w przypadku wielu innych rzekomo wbudowanych narzędzi, które są również dostępne jako polecenia zewnętrzne.
Dla porównania, w pdksh
( ksh
w OpenBSD, gdzie printf
jest nie wbudowany):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
I w bash
(gdzie printf
jest wbudowany):
$ command -v printf
printf
$ type printf
printf is a shell builtin
posix
printf
shell-builtin
yash
Kusalananda
źródło
źródło
PATH
w celu regularnego wbudowanego do wykonania - zadaj pytanie na ten temat.Odpowiedzi:
yash
Powłoka nie mają, a nie wykorzystania, wbudowany w wersjęprintf
(i innych narzędzi). Zdarza się, że jest bardzo pedantycznie zgodny ze standardem POSIX w sposobie formułowania wyniku poleceńcommand -v
itype
.W komentarzach mosvy standard POSIX wymaga, aby regularne wbudowane polecenie było dostępne jako polecenie zewnętrzne w
$PATH
celu wykonania wbudowanej wersji polecenia.To jest odpowiedni tekst standardu :
Oznacza to, że dane wyjściowe
command -v printf
oznaczają, żeprintf
polecenie zostało znalezione w ścieżce wyszukiwania, a dane wyjściowetype printf
dodają, że polecenie jest normalnie wbudowane.Ponieważ
printf
polecenie zostało znalezione w ścieżce wyszukiwania, a ponieważ jest ono normalnie wbudowane w powłokę,yash
wywoła swoją wbudowaną wersję polecenia . Jeśliprintf
był nie znalazł się na ścieżce, a jeśliyash
powłoka została uruchomiona w POSIX-ly właściwym trybie, błąd zostałby wygenerowany zamiast.yash
szczyci się tym, że jest powłoką bardzo zgodną z POSIX, i jest to również prawdą, jeśli spojrzymy na to, co mówi POSIXcommand -v
:źródło
Powłoka Watanabe ma trzy rodzaje wbudowanych elementów, szczegółowo opisanych w instrukcji. Wszystkie wbudowane polecenia są tam również wymienione, ale należy wnioskować, że coś jest „zwykłym” wbudowanym poleceniem na podstawie braku jakiejkolwiek uwagi mówiącej, że polecenie jest „specjalne” lub „pół-specjalne” wbudowany Zwykłe wbudowane elementy są nieoznaczone.
printf
jest jednym z takich „zwykłych” wbudowanych. W trybie natywnym jest zawsze wywoływane, niezależnie od tego, czy istnieje taka komenda zewnętrzna.Ale gdy
posixly-correct
ustawiona jest opcja powłoki, jest ona wbudowana tylko wtedy, gdy zewnętrzne polecenie można znaleźć wPATH
.Jest to faktycznie zgodne z tym, co mówi specyfikacja Single Unix i co najmniej od 1997 roku.
Różni się od powłoki Z, powłoki 93 Korn, powłoki Bourne Again i powłoki Debian Almquist, z których żadna z nich nie implementuje ani nie dokumentuje takiego zachowania w przypadku zwykłych wbudowań. Na przykład powłoka Z zawiera dokumenty, w których zawsze znajdują się zwykłe wbudowane elementy , przed przeszukiwanym krokiem
PATH
. Podobnie jest z powłoką Debian Almquist. I to właśnie robią wszystkie te powłoki, nawet jeśli są wywoływane tak, jak wsh
przypadku ich opcji włączania POSIX.Jednak nie działa,
printf
gdy nie jest włączony,PATH
jest zachowanie powłoki PD Korn, powłoki Heirloom Bourne i powłoki MirBSD Korn; ponieważprintf
przede wszystkim nie mają wbudowanego. ☺źródło
Sformułowanie można poprawić.
Jeśli powłoka jest w trybie posix
set --posixly-correct
:W przypadku zwykłych wbudowań, które nie istnieją w ŚCIEŻCE, jest to drukowane:
Co jest jasnym opisem: jest wbudowany, ale nie ma pliku wykonywalnego o tej samej nazwie w ścieżce PATH.
Jednak w przypadku zwykłych wbudowań, których nazwy istnieją również w ścieżce, jest to drukowane:
Co wydaje się sugerować, że plik wykonywalny w / bin / echo zostanie wykonany (co nie będzie). I sugerują, że zmiana z
at
celualso found in PATH at
:byłby lepszy opis. Może ujęcie tego w nawiasie (tak jak w przypadku drugiej odpowiedzi) mogłoby to poprawić.
W trybie POSIX żadne wbudowane narzędzie nie będzie działać, chyba że zostanie również znalezione w ŚCIEŻCE.
Jednak oba (POSIX) specjalne:
I pół-specjalne yash (nie specjalne dla POSIX):
wbudowane nadal działają.
źródło