$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Dlaczego echo nie jest niezależnym Narzędzie jak ls
, ps
, cat
itp? Dlaczego jest on specyficzny dla powłoki? Jakieś dobre powody?
shell
command-line
shell-builtin
Lazer
źródło
źródło
echo
pewnością jest wbudowany w Bash. W rzeczywistości jest wbudowany w każdą większą nowoczesną powłokę.Odpowiedzi:
Istnieją dwie klasy wbudowanych:
Niektóre polecenia muszą być wbudowane w sam program powłoki, ponieważ nie mogą działać, jeśli są zewnętrzne.
cd
jest jednym z nich, ponieważ gdyby był zewnętrzny, mógłby jedynie zmienić własny katalog; nie może wpłynąć na bieżący katalog roboczy powłoki. (Zobacz także: Dlaczegocd
nie jest programem? )Druga klasa poleceń jest wbudowana w powłokę wyłącznie w celu zwiększenia wydajności.
Strona człowiek posiada sekcję na builtins który wspomina , i jako przykłady poleceń w tej klasie.
dash
printf
echo
test
Systemy uniksowe zawsze zawierały osobne pliki wykonywalne dla poleceń w tej drugiej klasie. Te osobne pliki wykonywalne są nadal dostępne w każdym systemie Unixy, z którego korzystałem, nawet jeśli są wbudowane w każdą powłokę, której prawdopodobnie będziesz używać. ( POSIX faktycznie wymaga obecności tych plików wykonywalnych).
Myślę, że
echo
został wbudowany w powłokę w AT&T Unix System V Release 3.1. Opieram to na porównaniu dwóch różnych wydań instrukcji obsługi systemów uniksowych serii AT i Ts 3B1 . Ktoś uprzejmie zeskanował wydania tych podręczników z 1986 r. I umieścił je w Internecie ; odpowiadają one pierwotnemu wydaniu SVR3. Widać, żeecho
nie ma go na liście na stronie 523 UNIX System V Podręcznik użytkownika, tom II , gdzie można się spodziewać, gdyby polecenie zostało wbudowane w powłokę. W mojej lokalnej wersji papierowej instrukcji SVR3.1 z 1987 r. Wymienionyecho
jest w tej części instrukcji.Jestem prawie pewien, że nie jest to innowacja Berkeley CSRG, którą AT&T wróciło do domu. 4.3BSD wyszedł w tym samym roku, co SVR3, 1986, ale jeśli spojrzysz na stronę podręcznika sh.1 4.3BSD , zobaczysz, że
echo
nie ma go na liście wbudowanych poleceń sekcji „Polecenia specjalne”. Jeśli CSRG to zrobi, pozostanie nam udokumentowane źródło, które to udowodni.W tym momencie możesz się zastanawiać, czy
echo
został on wbudowany w powłokę wcześniej niż SVR3.1 i czy do tego czasu ten fakt nie został po prostu udokumentowany . Najnowszy dostępny dla mnie kod źródłowy AT&T Unix sprzed SVR3 znajduje się w tarballu PDP-11 System III , w którym znajdziesz kod źródłowy powłoki Bourne'a. Nie znajdzieszecho
wbudowanej tabeli poleceń/usr/src/cmd/sh/msg.c
. Na podstawie sygnatur czasowych w tym pliku dowodzi, że zecho
pewnością nie było go w powłoce w 1980 roku.Drobnostki
Ten sam katalog zawiera również plik o nazwie,
builtin.c
który nie zawiera żadnych informacji na temat tego pytania, ale znajdujemy ten interesujący komentarz:źródło
print
polecenie dla ksh, o którym mówi się, że zachowuje się jakecho
. To polecenie jest także obecne w coś takiego jak AT&T Unix SVR4 2.1 i386 z ISC.print "\012"
daje taki sam wynik jak echo. Zastanawiasz się, dlaczego ksh ma wbudowane drukowanie, a nie echo? W każdym razie naprawdę interesujące.Istnieje trzeci powód, dla którego niektóre polecenia mają być wbudowane: można ich używać, gdy wykonywanie poleceń zewnętrznych jest niemożliwe.
Czasami system jest tak zepsuty, że
ls
polecenie nie działa. W niektórych przypadkachecho *
nadal będzie działać.Innym (ważniejszym!) Przykładem jest
kill
: Jeśli w systemie zabraknie wolnych PID-ów, uruchomienie nie będzie możliwe/bin/kill
(ponieważ potrzebuje PID-a :-), ale wbudowanekill
będzie działać.Btw.,
which
Jest poleceniem zewnętrznym (przynajmniej nie jest wewnętrznym poleceniem bash), więc nie może wyświetlić poleceń wewnętrznych. Na przykład:źródło
ldconfig
chyba że DOKŁADNIE wiesz, co robisz). A co jeśli zdmuchniesz swoją partycję / bin lub, co gorsza, partycję / sbin, ale nadal masz załadowaną powłokę?ps
polecenia, więc musisz ręcznie znaleźć PID/proc
.which
to uruchamiany alias bash,alias | /usr/bin/which --read-alias ...
aby zewnętrznywhich
mógł identyfikować aliasy (ale nadal nie jest wbudowany). Nie mogę zdecydować, czy uznać to za genialne, czy zboczone.Zgodnie z podręcznikiem użytkownika Bash chodzi o wygodę.
Przewodnik Advanced Bash Scripting Guide zawiera bardziej szczegółowe wyjaśnienie:
Należy również pamiętać, że
echo
istnieje jako samodzielne narzędzie w niektórych systemach. Oto, co mam w moim systemie Darwin (MacOSX 10.5.8 - Leopard)echo
jest również dostępny jako wbudowany, ale najwyraźniej moje skrypty używają / bin / echo na moim Macu i używają wbudowanego Bash na większości moich systemów Linux i FreeBSD. Ale to nie wydaje się mieć znaczenia, ponieważ skrypty nadal działają dobrze wszędzie.źródło
type
.Aby uzupełnić odpowiedź bhm, powiedzmy, że
/bin
został przypadkowo usunięty z twojegoPATH
. Chciałbyś mócecho $PATH
to odkryć, prawda?źródło
Chociaż większość powłok ma
echo
obecnie wbudowane funkcje, GNU CoreUtils zawiera również samodzielną implementację:Wygląda na to, że nie masz zainstalowanego GNU Coreutils (większość systemów operacyjnych dla komputerów stacjonarnych i serwerów opartych na systemie Linux jest zainstalowanych domyślnie, ale osadzony Linux lub inny system UNIX może zamiast tego używać alternatywnych kolekcji narzędzi powłoki).
BTW: jeśli spojrzeć na Busybox , zobaczysz, że
ls
,ps
acat
także wbudowanych komend tam (lub przynajmniej może być, jest używany dla systemów osadzone i nie wszystko potrzebne mogą zostać pominięte).źródło
/bin/echo
która nie istnieje. Pokazują tylko, że wbudowane ma pierwszeństwo przed jakimkolwiekecho
programem w ścieżce.Oto prawdziwy powód, dla którego
echo
powinna być wbudowana powłoka:Załóżmy, że masz hasło
$PASSWORD
. Jak zapisać to do pliku./password
? Oczywiście większość programistów napisałaby:Jeśli
echo
jednak nie byłyby wbudowane w powłokę, hasło przeciekłoby do wszystkich użytkowników za pośrednictwemps
informacji.Oczywiście, jeśli chcesz być sprytny, możesz znaleźć sposób na przechowywanie hasła bez
echo
, być może wykorzystując inną funkcję powłoki:Jednak posiadanie
echo
wbudowanego jest ważnym pasem bezpieczeństwa, ponieważ najbardziej oczywisty sposób na zapisanie hasła do pliku powinien również działać.źródło