Polecenie czy program?

19

Szukałem różnicy między adduseri useradd, a wyjaśnieniem jest to, że useraddjest to polecenie, podczas gdy adduserjest to skrypt perla. Rozumiem, czym jest skrypt Perla, ale nie rozumiem, czym jest commanddokładnie wtedy.

Zawsze myślałem, że polecenia podoba ls, ln, cditp są wszystkie proste programy napisane w jakimkolwiek języku, który po prostu zrobić jedną rzecz. Jaka jest różnica między tymi „prostymi programami” a skryptem perla?

Wiem oczywiście, że skrypt (perl) nie jest kompilowany, ale interpretowany w czasie wykonywania, ale myślę, że to nie jedyna różnica?

kramer65
źródło
1
w tym przypadku nie skupiaj się zbytnio na skompilowanym kontra interpretowanym. możesz mieć zinterpretowaną powłokę (chociaż dlaczego chcesz ją mieć, jest wątpliwa). zamiast tego skup się na tym, że kod akcji polecenia jest statyczną częścią kodu źródłowego powłoki, podczas gdy skrypt jest zewnętrzny, nie należy zakładać, że istnieje lub zachowuje się dokładnie tak samo w dwóch nieco różnych systemach i może niekoniecznie muszą być spełnione wszystkie jego zależności. skrypty są bardziej elastyczne iz tego powodu ogólnie mniej niezawodne, podczas gdy polecenie będzie działać w dowolnym miejscu powłoki.
Frank Thomas
Krótko mówiąc: polecenie to wszystko, co można wykonać, a program to plik binarny, który można wykonać.
Pithikos

Odpowiedzi:

32

Mówiąc najprościej, polecenie jest instrukcją (lub zestawem instrukcji), które ma wykonać komputer.

Samodzielne polecenia

Podstawowe narzędzia uniksowe, takie jak ls, lnitp. Są (zwykle) napisane w C i skompilowane jako samodzielne programy wykonywalne , które nie wymagają wykonania interpretera; zazwyczaj wymagają pewnych plików biblioteki do zainstalowania w systemie, ale to odpowiedź na inne pytanie.

Skrypty

Skrypt to zbiór poleceń, a same skrypty są uważane za polecenia.

Perl skrypt jest ciągiem wypowiedzi Perl i wymaga perlwykonywalny (stand-alone i skompilowane) programu do interpretowania sprawozdań Perl.

Czasami duże i złożone skrypty interpretacyjne (w językach takich jak Perl, Python i Ruby) są również nazywane programami interpretowanymi, podczas gdy termin skrypt jest zarezerwowany dla krótszych i prostszych skryptów.

Skrypt jest sekwencją innych poleceń (dowolny rodzaj rozkazu) i wymaga Unix powłok takich jak Basha interpretować skryptu. Ze strony podręcznika użytkownika Bash:

Bash to interpreter języka poleceń kompatybilny z SH, który wykonuje polecenia odczytane ze standardowego wejścia lub z pliku.

Wbudowane powłoki

Powłoki zwykle mają wbudowane polecenia, które nie są ani samodzielnymi programami, ani skryptami. Zamiast tego są częścią samej powłoki i działają bezpośrednio przy niej. cdjest przykładem takiej wbudowanej komendy.

Czasami istnieją polecenia, które istnieją jako wbudowane powłoki i jednocześnie jako samodzielne polecenia, np echo. Polecenie.

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

echo samodzielnie wykonuje wbudowaną powłokę, podczas gdy samodzielne polecenie można wykonać, podając pełną ścieżkę.

Uruchom wbudowaną wersję echa:

$ echo --version
--version

Uruchom echoprogram autonomiczny :

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Uwaga: powyższe szczegóły dotyczą środowiska Unix, ale te same zasady dotyczą środowiska Windows.

Anthony G - sprawiedliwość dla Moniki
źródło
Echo, do którego się odwołujesz w systemie Windows, występuje tylko po zainstalowaniu Cygwin. Nie znajdziesz echa. * W Windowsie, ponieważ jest to wyłącznie polecenie powłoki CMD (echo w PowerShell jest aliasowane do obiektu zapisu)
Jim B
@JimB To prawda. Zredagowałem ostatni wiersz, aby wyjaśnić, co miałem na myśli. Przypadkowo dopiero zacząłem uczyć się PowerShell w tym tygodniu (na szczęście nie musiałem pracować z .batplikami przez wiele, wiele lat).
Anthony G - sprawiedliwość dla Moniki
2

Wbudowane polecenie jest częścią powłoki. Program jest wykonywany przez powłokę.

Wbudowane polecenia są zawarte w samej powłoce. Gdy nazwa wbudowanego polecenia jest używana jako pierwsze słowo polecenia prostego (patrz Proste polecenia ), powłoka wykonuje polecenie bezpośrednio, bez wywoływania innego programu. Wbudowane polecenia są niezbędne do wdrożenia funkcjonalności niemożliwej lub niewygodnej do uzyskania za pomocą oddzielnych narzędzi.

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands

Steven
źródło
Ale useraddnie ma wbudowanej powłoki. Witryna internetowa właśnie powiedziała „polecenie”, a nie „polecenie wbudowane”. W jaki sposób to wyjaśnienie ma znaczenie dla tego pytania?
Barmar
1

Polecenie oznacza po prostu sposób na poinformowanie aplikacji lub systemu, aby coś zrobił.

Aplikacja zazwyczaj akceptuje wiele różnych poleceń z GUI, stdinale możliwe są inne metody, np. Gniazdo UNIX lub nazwany potok, jakiś interfejs API sieci Web, połączenie RPC lub inny niestandardowy protokół.

Aplikację, która wykonuje tylko jedną rzecz, a następnie kończy działanie, zwykle bez GUI, można również nazwać komendą, ponieważ tak naprawdę można tylko „nadać” tej aplikacji jedno znaczące „polecenie”. Tak działają małe programy lsi takie są i dlatego nazywane są komendami.

Ale nie nazwałbyś Photoshopa poleceniem, ale z pewnością wydawałbyś w nim polecenia poprzez GUI.

Jednak termin ten może oznaczać różne rzeczy dla różnych ludzi. W twoim przykładzie komenda służy do opisania pliku wykonywalnego uruchamianego bezpośrednio, a nie pliku wymagającego interpretera skryptów do pracy. To rozróżnienie może być ważne, ponieważ kiedy uruchamiasz skrypt Perla, /usr/bin/perljest to plik binarny, który faktycznie działa (więc jeśli chcesz zabić długo działający skrypt Perla, to właśnie tego musisz szukać ps). Jednak większość powłok ma wbudowane polecenia, które są poleceniami samej powłoki i nie powodują uruchomienia zewnętrznego pliku wykonywalnego. Na przykład cdjest obsługiwany bashsam i nie wywołuje /sbin/cdani nie jest podobny.

LawrenceC
źródło
Ciekawa perspektywa. Na poziomie abstrakcji, z którego to oglądasz, kusi mnie, by nazwać to „inwokacją” lub „gestem”, a nawet używać terminologii Androida jako „intencją”. To powiedziawszy, nie wiem, czy podoba mi się pomysł, aby kompilować vs interpretować kryteria. Na przykład PowerShell jest interpretowany hybrydowo (, Net), ale jako powłoka ma polecenia w swojej bazie kodu. ale wtedy masz rację, że zewnętrzne skompilowane pliki wykonywalne (kod maszynowy) różnią się od skryptów, ale także poleceń. jak powiedziałem, interesująca perspektywa.
Frank Thomas