Zauważyłem, że /bin/echo
w moim systemie Ubuntu MATE 17.04 istnieje plik binarny .
Myślałem, że to dziwne, ponieważ
$ type echo
echo is a shell builtin
Testy kursowe sugerują, że /bin/echo
robi to samo, co wbudowane Bash echo
:
$ /bin/echo foo
foo
$ /bin/echo $USER
zanna
Dlaczego więc istnieje inna wersja programu echo
niezależnego od programu Bash i dlaczego lub kiedy miałbym z niego korzystać?
command-line
bash
echo
Zanna
źródło
źródło
echo
jest dostarczane jako wbudowana powłoka, podczas gdy to pytanie pyta, dlaczego jest dostarczane jako polecenie zewnętrzne.Odpowiedzi:
Jeśli otworzysz
bash
monit i wpiszeszecho
polecenie, które używa wbudowanej powłoki, a nie działa/bin/echo
. Powody, dla których nadal jest ważne/bin/echo
, to:echo
wbudowanego. To nie jest faktycznie wymagane.Aby rozwinąć na # 1, załóżmy, że chciał, aby przenieść wszystkie pliki, których nazwy regularne rozpoczął się
abc
w dowolnym miejscusrc
nadest
. Można to zrobić na kilka sposobów, ale jednym z nich jest:Załóżmy jednak, że zamiast uruchamiać to, chcesz zobaczyć każde polecenie, które zostanie uruchomione jako pierwsze. Cóż, możesz
echo
przejść do polecenia, tak jak w innych kontekstach:Ale
find
nie używa powłoki. To działa/bin/echo
.Poza tym
find
z-exec
lub-execdir
,/bin/echo
plik wykonywalny będzie wywoływany przez inne programy, które same uruchamiają programy, ale nie przez powłokę. To się dzieje zxargs
poleceniem (która jest związana dofind
), a także w wielu innych sytuacjach, takich jak naExec=
linii z pomocą.desktop
pliku . Innym przykładem jest uruchamianiesudo echo
, które może być przydatne do testowania, czysudo
działa.Podobnie niektóre powłoki mają
printf
wbudowane funkcje, ale/usr/bin/printf
również istnieją.Mniej powszechnym możliwym powodem, dla którego możesz celowo użyć,
/bin/echo
jest poleganie na różnicach między nim aecho
poleceniem dostarczonym przez twoją powłokę.man echo
dokumenty/bin/echo
;help echo
wbash
dokumentachbash
wbudowanego.echo
nie jest bardzo przenośny, ponieważ różne implementacje - zarówno w systemach operacyjnych, jak i powłokach w tym samym systemie operacyjnym - obsługują różne opcje (np.-e
) i różnią się traktowaniem ukośników odwrotnych . Oczywiście lepiej unikać polegania na takich szczegółach i używaćprintf
zamiast tego, który jest o wiele bardziej przenośny .W
bash
, możesz sprawić, bytype
wbudowany pokazał się/bin/echo
również - zakładając, że/bin
jest w twoim,$PATH
jak zawsze powinien być - przekazując mu-a
flagę :źródło
cd
istnienie pliku wykonywalnego (który po uruchomieniu zmienia katalog i kończy pracę, pozostawiając program wywołujący tam, gdzie był wcześniej), a niektóre systemy operacyjne go mają. Przydatne może być cytowanie 4.1 w standardach GNU .cd
jest po prostu test możliwości dostępu do danego katalogu: jeśli się/usr/bin/cd some/dir
powiedzie, w jednym ujęciu przetestowałeś: a) którysome/dir
istnieje, b) że jest to katalog lub link do jednego, oraz c) istnieją wymagane uprawnienia dostępu do tego katalogu; wszystko bez zmiany własnego stanu./bin/echo
, nie\bin\echo
, chyba, że używasz systemu Windows. ;)Eliah wykonał świetną robotę, odpowiadając na to pytanie, ale chcę skomentować część „dlaczego istnieje inna wersja
echo
oddzielna od programu Bash”. To złe pytanie.Prawidłowe pytanie brzmi: dlaczego jest to wbudowane przede wszystkim , skoro mogło to być (i jest) doskonale zewnętrzne polecenie?
Dla uproszczenia spójrz na wbudowane funkcje w myślniku, marne 38 (bash ma 61, dla porównania, przechodząc przez wynik
compgen -b
):Ile z nich wymaga wbudowania?
[
,echo
,false
,printf
,pwd
,test
, Itrue
nie trzeba być builtins: Nie wszystko, co tylko może rób wbudowane (wpływ lub uzyskanie stanu powłoki, która nie jest dostępna dla poleceń zewnętrznych). Bash korzystaprintf
przynajmniej z wbudowanej funkcji:printf -v var
zapisuje dane wyjściowe do zmiennejvar
.time
w bash jest również wyjątkowy: będąc słowem kluczowym, możesz mierzyć dowolne listy poleceń w bash (myślnik nie matime
odpowiednika).pwd
nie musi też być wbudowany - każde polecenie zewnętrzne odziedziczy bieżący katalog roboczy (i to też polecenie zewnętrzne ).:
jest wyjątkiem - potrzebujesz NOP i tak:
jest. Reszta wykonuje czynności, które może łatwo wykonać polecenie zewnętrzne.Tak więc jedna piąta wbudowanych nie musi być wbudowana. Dlaczego więc? Strona
dash
man * wyjaśnia, dlaczego są one wbudowane (moje podkreślenie):To wszystko: te wbudowane funkcje są dostępne, ponieważ są używane tak często, interaktywnie i w skryptach, a ich funkcjonalność jest na tyle prosta, że powłoka może wykonać zadanie. I tak to się dzieje: niektóre (większość?) Muszle wziął w pracy ** wracać. Od 2,9 BSD i nie znajdzie polecenie wbudowane.
sh
echo
Jest więc całkiem możliwe, że minimalna powłoka może pominąć implementację takich poleceń jak wbudowane (nie sądzę jednak, że jakakolwiek obecna powłoka to robi). Projekt GNU coreutils nie zakłada, że będziesz je uruchamiał w określonej powłoce, a POSIX wymaga tych poleceń. Coreutils i tak je zapewnia i pomija te, które nie mają żadnego znaczenia poza powłoką.
* Jest to prawie identyczne z odpowiadającym mu tekstem strony podręcznej dla powłoki Almquist , na której opiera się dash, powłoka Almquist Debiana.
** doprowadza
zsh
ten pomysł do skrajności: polecenia, które dostajesz, ładując różne modułyzmv
, są rzeczami, o których nie pomyślałbyś, że powłoka powinna się w to wniknąć . W tym momencie prawdziwe pytanie brzmi: dlaczego miałbyś używać bash zamiast zsh, który ma wszystkie te wbudowane funkcje?źródło
:
ponieważ zewnętrzny tak naprawdę nie byłby NOP, nadal będziesz miećPATH
wyszukiwanie, próbę wykonania polecenia itp., Gdy wszystko, czego naprawdę chcesz, to wyraźnie nic nie robić.:
jak wbudowane robi to.pwd
być wbudowany, aby działał tak, jak działa, z domyślnym zachowaniem pokazującym ścieżkę „logiczną” (pwd -L
)./bin/pwd
może jedynie zaimplementowaćpwd -P
zachowanie pokazujące rzeczywiste katalogi nadrzędne, a nie przekierowane przez ciebie dowiązanie symbolicznecd
.pwd
jest nieco zagrożony obecnościąPWD
, ale tak, jest to również przypadek basha wykorzystującego status wbudowany w celu poprawy funkcjonalności