Kiedy używam type
polecenia, aby dowiedzieć się, czy cat
jest wbudowana w powłokę, czy program zewnętrzny, otrzymuję dane wyjściowe poniżej:
-$ type cat
cat is hashed (/bin/cat)
-$
Czy to oznacza, że cat
jest to program zewnętrzny /bin/cat
?
Byłem zdezorientowany, ponieważ kiedy sprawdziłem dane wyjściowe poniżej echo
, zobaczyłem, że jest built-in
to program, ale także/bin/echo
-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$
Nie mogłem więc użyć logiki, która z /bin/cat
konieczności oznacza program zewnętrzny, ponieważ echo było /bin/echo
jednak nadal wbudowane.
Więc skąd mam wiedzieć, co cat
to jest? Wbudowany czy zewnętrzny?
bash
cat
echo
shell-builtin
sps
źródło
źródło
type which
może dać ci odpowiedź, dlaczegowhich
nie da ci odpowiedzi.cat
ils
są / były napisane przez samego Stallmana. Byłbyś zaskoczony, jak wiele rzeczy napisał. Nie zapomnij, że napisał pierwsze wersje kompilatora, który jest obecnie najlepszym kompilatorem na świecie, który kompiluje WSZYSTKO i większość podstawowych narzędzi. Tylko mówięOdpowiedzi:
type
mówi ci, czego użyłaby powłoka. Na przykład:Oznacza to, że jeśli w wierszu polecenia bash wpiszesz
echo
, otrzymasz wbudowane. Jeśli podasz ścieżkę, jak w/bin/echo
, otrzymasz polecenie zewnętrzne.which
, przeciwnie, jest programem zewnętrznym, który nie ma specjalnej wiedzy o tym, co zrobi powłoka. W systemach podobnych do Debianawhich
jest skrypt powłoki, który przeszukuje PATH w poszukiwaniu pliku wykonywalnego. W ten sposób poda ci nazwę zewnętrznego pliku wykonywalnego, nawet jeśli powłoka użyłaby wbudowanego.Jeśli polecenie jest dostępne tylko jako wbudowane,
which
nic nie zwróci:Teraz spójrzmy na
cat
:cat
jest zewnętrznym plikiem wykonywalnym, a nie wbudowanym w powłokę.źródło
type -all echo
dowiedzieć się (w kolejności), jakie są różne „echa” znane powłoce (pierwszy to ten, który wywoła powłoka, jeśli nie określisz czegoś, co zmieni kolejność, np. Wywoływanie"echo"
lub\echo
, lubcommand echo
)echo
powodów historycznych. Zaczęło się jako polecenie zewnętrzne, a następnie zostało dodane jako wbudowane. Wczesne wersje powłoki Bourne (/bin/sh
) nie miały go./bin/echo
utrzymywano dla zachowania kompatybilności, ponieważ od tego zależały różne rzeczy. (To samo stało się ztest
.)which
sama może być wbudowaną powłoką cmd, na przykład w tcsh:which which
which: shell built-in command.
cat is hashed (/bin/cat)
jest jakcat is /bin/cat
(to znaczy jest to program zewnętrzny ).Różnica polega na tym, że uruchomiłeś już
cat
tę sesję, więc bash już ją sprawdził$PATH
i zapisał wynikową lokalizację w tabeli skrótów, aby nie musiał jej ponownie szukać w tej sesji.Aby zobaczyć wszystkie komendy, które zostały zaszyfrowane w sesji, uruchom
hash
źródło
Kolejny sposób na sprawdzenie listy wbudowanych powłok: Używanie
compgen
wbudowanej powłoki!Następujące polecenie wyświetla wszystkie wbudowane polecenia powłoki:
Możesz to sprawdzić
cat
,echo
greping jak: -Widoczne są
compgen -b | grep cat
zwroty bez danych wyjściowych, co oznacza, żecat
nie jest wbudowane w powłokę .Odwiedź listę przydatnych opcji dostarczonych przez
compgen
.Możesz także użyć wzajemnie wbudowanego polecenia:
help
aby wyświetlić wbudowane powłoki.źródło
compgen
?man bash | grep -e '-A action$' -A 32
prawdopodobnie uzyskać wyjście jak ten . (zwiększ / zmniejsz cyfrę po,-A
aby poprawnie zarządzać).Możesz także użyć polecenia,
whereis
które jest bardziej wydajne, ponieważ pokazuje miejsce, w którym znajduje się ono na komputerze, takie jak biblioteka stron podręcznika itp.źródło
Inni już odpowiedzieli
cat
, chciałbym tylko wyjaśnić problemecho
. Jeśli użyjesz-a
opcji type (pokaż wszystkie dopasowania), zobaczysz, żeecho
jest to zarówno wbudowana powłoka, jak i program zewnętrzny:Obie są całkowicie od siebie niezależne.
type
bez opcji po prostu zwróci pierwsze znalezione polecenie. Więc typfoo
pokaże ci, co zostanie wykonane, jeśli uruchomiszfoo
. Mogą istnieć inne opcje, ale nie zostaną one wyświetlone, chyba że użyjesz-a
.źródło
Ponieważ istnieje kilka dobrych odpowiedzi na temat używania typu do sprawdzania, czy polecenie takie jak
cat
wbudowany lub program zewnętrzny. Mam zamiar przyjąć bardziej ogólne podejście. Istnieje kilka poleceń, które muszą zostać wbudowane, ponieważ wpływają na bieżącą powłokę. Trzy klasyczne przykłady sącd
,exec
iexit
. Istnieje kilka poleceń, których nie można wbudować, ponieważ ich funkcjonalność zależy od zachowania wywołania execve lub systemowego. Przykładami takich programów sąsu
,sudo
,calife
isuper
. Wszystkie pozostałe polecenia mogą być budowane jako wbudowane lub zewnętrzne programy.cat
to świetny przykładowy program tej klasy, ponieważ istnieją powłoki, które zawierają go jako wbudowane i powłoki, które tego nie robią. Warto zauważyć, że wiele poleceń tej klasy, które są dostępne jako wbudowane, są również dostępne jako programy zewnętrzne.źródło