Czy „cat” jest wbudowaną powłoką czy programem zewnętrznym?


33

Kiedy używam typepolecenia, aby dowiedzieć się, czy catjest 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 catjest to program zewnętrzny /bin/cat?

Byłem zdezorientowany, ponieważ kiedy sprawdziłem dane wyjściowe poniżej echo, zobaczyłem, że jest built-into 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/catkonieczności oznacza program zewnętrzny, ponieważ echo było /bin/echojednak nadal wbudowane.

Więc skąd mam wiedzieć, co catto jest? Wbudowany czy zewnętrzny?


1
- Polecenie cat to zewnętrzny program, który stanowi część systemu, ponieważ wiele działań, które może wykonać, nie jest prostym wbudowanym programem.
Żart s. OK,

12
type whichmoże dać ci odpowiedź, dlaczego whichnie da ci odpowiedzi.
Dubu,

1
Zależy od
używanej

6
Zabawa fakt: zarówno cati lssą / 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ę
Alec Teal

2
@AlecTeal Czy zdajesz sobie sprawę, że większość systemów uniksowych używa wersji ls i cat, które długo poprzedzają wersje GNU, w których Richard Stallman miał rękę?
Ross Ridge,

Odpowiedzi:


59

typemówi ci, czego użyłaby powłoka. Na przykład:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

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 Debiana whichjest 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, whichnic nie zwróci:

$ type help
help is a shell builtin
$ which help
$ 

Teraz spójrzmy na cat:

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat jest zewnętrznym plikiem wykonywalnym, a nie wbudowanym w powłokę.


5
Możesz type -all echodowiedzieć 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, lub command echo)
Olivier Dulac,

Dobra odpowiedź. Jeden dodatek: Istnieją dwie wersje z echopowodó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/echoutrzymywano dla zachowania kompatybilności, ponieważ od tego zależały różne rzeczy. (To samo stało się z test.)
Alexis

Uwaga dodatkowa: whichsama może być wbudowaną powłoką cmd, na przykład w tcsh:which which which: shell built-in command.
Dan Cornilescu

Przybywam późno na przyjęcie, ale dlaczego nie zajrzysz na jego stronę podręcznika i rzeczywiście widzisz liczbę między nawiasami, co wskazuje, czy jest to powłoka wbudowana czy coś w tym stylu
poz2k4444

46

cat is hashed (/bin/cat)jest jak cat is /bin/cat(to znaczy jest to program zewnętrzny ).

Różnica polega na tym, że uruchomiłeś już cattę sesję, więc bash już ją sprawdził $PATHi 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

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

9
Moim zdaniem jest to jedyna odpowiedź, która dotyczy twojego pytania :)
André Chalella

IMHO to ^^^ jest prawdą. Ta odpowiedź powinna być zaakceptowana.
LinuxSecurityFreak

4

Kolejny sposób na sprawdzenie listy wbudowanych powłok: Używanie compgenwbudowanej powłoki!

Następujące polecenie wyświetla wszystkie wbudowane polecenia powłoki:

compgen -b

Możesz to sprawdzić cat, echogreping jak: -

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

Widoczne są compgen -b | grep catzwroty bez danych wyjściowych, co oznacza, że catnie jest wbudowane w powłokę .

Odwiedź listę przydatnych opcji dostarczonych przez compgen.


Możesz także użyć wzajemnie wbudowanego polecenia: helpaby wyświetlić wbudowane powłoki.

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

Nie mogę znaleźć żadnej formalnej dokumentacji dla tych opcji, czy wiesz, gdzie ona istnieje?
Random832

@ Random832 czy mówisz o opcjach compgen?
Pandya,

tak, nie mogłem znaleźć niczego na stronie podręcznika Bash o tym, co oznacza -b lub połowa innych opcji. Znalazłem go później na gnu.org/software/bash/manual/html_node/…
Random832

@ Random832 spróbować man bash | grep -e '-A action$' -A 32prawdopodobnie uzyskać wyjście jak ten . (zwiększ / zmniejsz cyfrę po, -Aaby poprawnie zarządzać).
Pandya,

4

Możesz także użyć polecenia, whereisktóre jest bardziej wydajne, ponieważ pokazuje miejsce, w którym znajduje się ono na komputerze, takie jak biblioteka stron podręcznika itp.


-Przepraszam za mój zły angielski, ponieważ dopiero się uczę i nie jestem zbyt dobry w posługiwaniu się! ...
Żartuje s. OK,

2

Inni już odpowiedzieli cat, chciałbym tylko wyjaśnić problem echo. Jeśli użyjesz -aopcji type (pokaż wszystkie dopasowania), zobaczysz, że echojest to zarówno wbudowana powłoka, jak i program zewnętrzny:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

Obie są całkowicie od siebie niezależne. typebez opcji po prostu zwróci pierwsze znalezione polecenie. Więc typ foopokaże ci, co zostanie wykonane, jeśli uruchomisz foo. Mogą istnieć inne opcje, ale nie zostaną one wyświetlone, chyba że użyjesz -a.


2

Ponieważ istnieje kilka dobrych odpowiedzi na temat używania typu do sprawdzania, czy polecenie takie jak catwbudowany 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, execi exit. 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, califei super. Wszystkie pozostałe polecenia mogą być budowane jako wbudowane lub zewnętrzne programy.catto ś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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.