Befehl gegen Programm?

19

Ich habe nach dem Unterschied zwischen adduserund gesucht useradd, und eine Erklärung ist, dass useraddes sich um einen Befehl handelt, während adduseres sich um ein Perl-Skript handelt. Ich verstehe, was ein Perl-Skript ist, aber was ich nicht verstehe, ist, was ein commandDann genau ist.

Ich dachte immer, dass Befehle wie ls, ln, cdusw. sind alle einfache Programme geschrieben in welcher Sprache auch immer , dass eine Sache einfach tun. Was ist der Unterschied zwischen diesen "einfachen Programmen" und einem Perl-Skript?

Ich weiß natürlich, dass ein (Perl-) Skript zur Laufzeit nicht kompiliert, sondern interpretiert wird, aber ich denke, das ist nicht der einzige Unterschied?

kramer65
quelle
1
Konzentrieren Sie sich in diesem Fall nicht zu sehr auf kompilierte vs. interpretierte. Sie könnten eine interpretierte Shell haben (obwohl fraglich ist, warum Sie eine wollen würden). konzentrieren Sie sich stattdessen auf die Tatsache, dass der Code für eine Befehlsaktion ein statischer Teil des Quellcodes der Shell ist, wohingegen ein Skript extern ist, nicht als vorhanden oder auf zwei leicht unterschiedlichen Systemen genauso zu verhalten ist und möglicherweise Es müssen nicht unbedingt alle Abhängigkeiten erfüllt sein. Skripte sind flexibler und daher im Allgemeinen weniger zuverlässig, wohingegen ein Befehl überall in der Shell funktioniert.
Frank Thomas
Mit einfachen Worten: Befehl ist alles, was ausgeführt werden kann, während Programm eine Binärdatei ist, die ausgeführt werden kann.
Pithikos

Antworten:

32

In einfachen Worten ist ein Befehl eine Anweisung (oder ein Befehlssatz), die von einem Computer ausgeführt wird.

Standalone-Befehle

Fundamental Unix - Dienstprogramme wie ls, lnetc. ( in der Regel) in C geschrieben und kompiliert eigenständige ausführbare werden Programme , die ausgeführt keinen Dolmetscher erforderlich ist; Normalerweise müssen bestimmte Bibliotheksdateien auf dem System installiert sein, aber das ist eine Antwort auf eine andere Frage.

Skripte

Ein Skript ist eine Sammlung von Befehlen, und Skripte selbst werden als Befehle betrachtet.

Ein Perl-Skript ist eine Folge von Perl-Anweisungen und erfordert ein perlausführbares (eigenständiges und kompiliertes) Programm , um die Perl-Anweisungen zu interpretieren.

Manchmal werden große und komplexe interpretative Skripte (in Sprachen wie Perl, Python und Ruby) auch als interpretierte Programme bezeichnet, während der Begriff Skript kürzeren und einfacheren Skripten vorbehalten ist.

Ein Shell-Skript ist eine Folge anderer Befehle (jeder Befehlstyp) und erfordert eine Unix-Shell wie Bash, um das Skript zu interpretieren. Von der Bash-Manpage:

Bash ist ein sh-kompatibler Befehlsspracheninterpreter, der Befehle ausführt, die von der Standardeingabe oder aus einer Datei gelesen werden.

Shell-Einbauten

Shells verfügen normalerweise über integrierte Befehle, bei denen es sich weder um eigenständige Programme noch um Skripte handelt. Stattdessen sind sie Teil der Shell selbst und werden direkt von der Shell ausgeführt. cdist ein Beispiel für einen solchen eingebauten Befehl.

Manchmal gibt es Befehle, die gleichzeitig als Shell-Built-Ins und als Standalone-Befehle existieren, z echo. B. den Befehl.

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

echo Führt die integrierte Shell eigenständig aus, während der eigenständige Befehl ausgeführt werden kann, indem der vollständige Pfad angegeben wird.

Führen Sie die integrierte Version von echo aus:

$ echo --version
--version

Führen Sie ein eigenständiges echoProgramm aus:

$ /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.

Hinweis: Die obigen Angaben beziehen sich auf eine Unix-Umgebung, gelten jedoch auch für eine Windows-Umgebung.

Anthony G - Gerechtigkeit für Monica
quelle
Das Echo, auf das Sie in Windows verweisen, wird nur angezeigt, wenn Sie Cygwin installieren. Sie werden echo. * In Windows nicht finden, da dies nur ein CMD-Shell-Befehl ist (echo in Powershell ist auf write-object ausgerichtet)
Jim B
@JimB Das stimmt. Ich habe die letzte Zeile bearbeitet, um zu verdeutlichen, was ich meinte. Zufälligerweise habe ich diese Woche gerade erst angefangen, PowerShell zu lernen (zum Glück musste ich seit .batvielen, vielen Jahren nicht mehr mit Dateien arbeiten).
Anthony G - Gerechtigkeit für Monica
2

Ein eingebauter Befehl ist Teil der Shell. Ein Programm wird von der Shell ausgeführt.

Integrierte Befehle sind in der Shell selbst enthalten. Wenn der Name eines eingebauten Befehls als erstes Wort eines einfachen Befehls verwendet wird (siehe Einfache Befehle ), führt die Shell den Befehl direkt aus, ohne ein anderes Programm aufzurufen. Integrierte Befehle sind erforderlich, um Funktionen zu implementieren, die mit separaten Dienstprogrammen nicht oder nur schwer zu erhalten sind.

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

Steven
quelle
Ist useraddaber keine Shell eingebaut. Die Website sagte nur "Befehl", nicht "eingebauter Befehl". Wie ist diese Erklärung für diese Frage relevant?
Barmar
1

Befehl bedeutet nur eine Möglichkeit, eine Anwendung oder ein System anzuweisen, etwas zu tun.

Eine Anwendung akzeptiert normalerweise viele verschiedene Befehle, entweder von der GUI aus stdin, aber andere Methoden sind möglich, z. B. ein UNIX-Socket oder eine Named Pipe, eine Art Web-API, eine RPC-Verbindung oder ein anderes benutzerdefiniertes Protokoll.

Eine Anwendung, die nur eines tut und dann beendet wird, in der Regel ohne GUI, kann auch als Befehl bezeichnet werden, da Sie dieser Anwendung nur einen aussagekräftigen Befehl geben können. Dies ist, wie kleine Programme wie lsund solche funktionieren und warum sie Befehle genannt werden.

Sie würden Photoshop jedoch nicht als Befehl bezeichnen, sondern über die grafische Benutzeroberfläche Befehle eingeben.

Der Begriff kann jedoch für verschiedene Personen unterschiedliche Bedeutungen haben. In Ihrem Beispiel wird mit dem Befehl eine ausführbare Datei beschrieben, die direkt ausgeführt wird, im Gegensatz zu einer Datei, für deren Ausführung ein Skriptinterpreter erforderlich ist. Die Unterscheidung kann wichtig sein, da es sich bei der Ausführung eines Perl-Skripts /usr/bin/perlum die tatsächlich ausgeführte Binärdatei handelt (wenn Sie also ein lang laufendes Perl-Skript beenden möchten, müssen Sie danach suchen ps). Die meisten Shells verfügen jedoch über "integrierte" Befehle, die Befehle für die Shell selbst sind und die Ausführung einer externen ausführbaren Datei verhindern. Wird zum Beispiel cdvon bashalleine gehandhabt und ruft nicht /sbin/cdoder ähnlich auf.

LawrenceC
quelle
Interessante Perspektive. Auf der Abstraktionsebene, von der aus Sie dies betrachten, bin ich versucht, es als "Aufruf" oder "Geste" zu bezeichnen oder sogar mit der Android-Terminologie als "Absicht" umzugehen. Das heißt, ich weiß nicht, ob mir die Idee gefällt, kompilierte vs. interpretierte Kriterien zu erstellen. Powershell zum Beispiel ist hybride interpretiert (, Net), aber als Shell hat es Befehle in seiner Codebasis. Aber dann sagen Sie, dass sich extern kompilierte (Maschinencode) ausführbare Dateien von Skripten, aber auch von Befehlen unterscheiden. wie gesagt interessante perspektive.
Frank Thomas