
Das WortBefehlbezieht sich in Linux auf zwei verschiedene Konzepte:
- Ein ausführbares Programm, wie zum Beispielgrep(oder eine Shell-Integration wieCD). Anwendungsbeispiel: „Hier sind die 10 wichtigsten Linux-Befehle, die Sie lernen sollten.“
- Eine vollständige Textzeichenfolge, die zur Ausführung an die Shell gesendet wird, wie etwagrep com /etc/hosts. Anwendungsbeispiel: „Geben Sie einen Linux-Befehl ein und drücken Sie die Eingabetaste.“
Kennt jemand bewährte Methoden, um diese Mehrdeutigkeit beim Schreiben von Prosa über Linux-Befehle zu vermeiden? Hier sind einige Versuche, die ich bereits abgelehnt habe:
- Mit dem WortProgrammoderausführbarfür Bedeutung Nr. 1. Es ist für Shell-Built-Ins ungenau.
- Mit dem AusdruckBefehlszeilefür Bedeutung Nr. 2. Das ist verwirrend, weil „Befehlszeile“ auch ein Synonym für „Shell“ ist.
- Mit dem AusdruckBefehlszeichenfolgefür Bedeutung Nr. 2. Es ist ungenau, da sowohl Nr. 1 als auch Nr. 2 Zeichenfolgen sind.
Jeder Ratschlag ist willkommen.
Antwort1
POSIXbezieht sich auf die Dinge, die wie grep
und cd
als „Versorgungsunternehmen", UndReserven"Befehl" für die Anweisungen. Bei einheitlicher Verwendung sind diese Begriffe eindeutig.
Um Ihre Fälle der Reihe nach zu bearbeiten
„Ein ausführbares Programm wie grep (oder eine integrierte Shell wie cd)“ist einDienstprogramm:
DienstprogrammEin Programm, ausgenommenspezielle integrierte Dienstprogrammewird als Teil der Shell-Befehlssprache bereitgestellt und kann von einer Shell namentlich aufgerufen werden, um eine bestimmte Aufgabe oder einen verwandten Satz von Aufgaben auszuführen.
Welches istweiter verdeutlicht mit:
Das System kann bestimmte Dienstprogramme als Shell-Funktionen oder integrierte Dienstprogramme implementieren
um deutlich zu machen, dass dies gewöhnliche Dienstprogramme einschließt, wie
true
sie häufig als integrierte Shell-Funktionen zu finden sind.Formell:spezielle integrierte Dienstprogramme" sind von nicht weiter spezifizierten Dienstprogrammen getrennt; dies sind Dinge wie
break
,.
,eval
,set
, undtrap
, die den internen Zustand der Shell beeinflussen, aber sienichtincludecd
, ein reguläres integriertes Element. Abgesehen von den nuancierten Anforderungen der Spezifikation (bestimmtes Verhalten bei der Variablenzuweisung unterscheidet sich und ist mit nicht verfügbarexecvp
) reicht „Dienstprogramm“ aus, um beide Kategorien auf Benutzerebene abzudecken. Artikel mit Shell-Syntax wieif
undwhile
sind überhaupt keine Dienstprogramme."Eine vollständige Textzeichenfolge, die zur Ausführung an die Shell gesendet wird, wie beispielsweise
grep com /etc/hosts
"ist einBefehl:BefehlEine Anweisung an die Shell, eine bestimmte Aufgabe auszuführen.
Zu den Befehlen gehören einfache Befehle wie
grep com /etc/hosts
, Pipelines und zusammengesetzte Befehle wieif
Konstrukte und Gruppierungsbefehle mit( ... )
, aber das Wort „Befehl“ bezieht sich nie auf ein Dienstprogramm selbst. Innerhalb eines Befehls kann einBefehlsnamekann vorkommen, dass ein Dienstprogramm oder eine Funktion identifiziert: der Befehlsname ingrep com /etc/hosts
istgrep
und bezieht sich aufdas Dienstprogramm grep.
Die umgangssprachliche Verwendung von „Befehl“ im Sinne eines Nutzens oder einer Funktion kann durch den Kontext eindeutig werden, die formale Bedeutung ist jedoch nur die einer Anweisung. Wenn eine vollständige Vermeidung von Mehrdeutigkeiten erforderlich ist,Sie können „Dienstprogramm“ und „Befehl“ konsequent verwendenfür diese beiden Rollen.
Allerdings kann man von den Benutzern wahrscheinlich nicht erwarten, dass sie diese Unterscheidung selbst treffen, sodass suchmaschinenoptimierte Artikel mit den „Top 10 Linux-Befehlen“ aufgrund ihrer Anreize wahrscheinlich die richtige Wahl treffen.
Antwort2
ZUSAMMENFASSUNG
Die Art von Mehrdeutigkeit, die Sie hier ansprechen, lässt sich am besten durch die Verwendung von Begriffen wieProgramm, einausführbare Dateioder einfach einausführbarfür denjenigen, der einen Pfad hat/ist, versusShell-Befehloder auchBefehlszeile wenn Sie auf alles verweisen möchten, was Sie in IhrBefehlsinterpreter.
Historischer Zusammenhang
Der Index zu frühen Drucken vonDie Programmiersprache C("K&R", Prentice-Hall) enthielt nur eine einzige Erwähnung des WortesBefehlund zwar nicht speziell für dieses Wort, sondern fürKommandozeilenargumente. Dieser kleine Bedeutungskern liefert den entscheidenden Samen, der keimte und sich zu allen späteren Verwendungen verzweigte. Aus Seite 111 einer Ausgabe von 1978:
5.11 Kommandozeilenargumente
In Umgebungen, die C unterstützen, gibt es eine Möglichkeit, Befehlszeilenargumente oder -parameter an ein Programm zu übergeben, wenn mit der Ausführung begonnen wird.
Das heißt, das WortBefehlwird nur in einem Shell-Kontext verwendet (da eine Shell per Definition eineBefehlsinterpreter), sei es im interaktiven Einsatz oder in der Skriptprogrammierung. Die Autoren fahren mit diesem Beispiel fort:
Die einfachste Darstellung der notwendigen Deklarationen und Verwendung ist das Programm
echo
, das seine Kommandozeilenargumente einfach in einer einzigen Zeile, getrennt durch Leerzeichen, ausgibt. Das heißt, wenn das Kommandoecho hello, world
gegeben ist, ist die Ausgabe
hello, world
Beachten Sie, wie K&R dort über Programme und Befehlszeilen sprechen. Mit anderen Worten, es ist das, was IEEEPOSIX 1003.2dreht sich alles um,nichtWasPOSIX 1003.1ist. Im Allgemeinen behandelt Dot-1 die C-Programmierung, während Dot-2 die Shell-Programmierung behandelt.
Und Shell-Programmierung, nicht C-Programmierung, ist das, worüber Sie hier wirklich sprechen. Deshalb ist die Einführung inAbschnitt 1 des Unix-Programmierhandbuchserwähnt Befehle, keine Funktionsaufrufe:
NAME
intro – Einführung in allgemeine Befehle (Tools und Dienstprogramme)
BESCHREIBUNG
Die Handbuchseiten in Abschnitt 1 enthalten die meisten Befehle, aus denen die BSD-Benutzerumgebung besteht. Einige der in Abschnitt 1 enthaltenen Befehle sind Texteditoren, Befehlsshell-Interpreter, Such- und Sortierwerkzeuge, Dateibearbeitungsbefehle, Systemstatusbefehle, Befehle zum Remote-Kopieren von Dateien, Mail-Befehle, Compiler und Compilerwerkzeuge, formatierte Ausgabewerkzeuge und Zeilendruckerbefehle.
Alle Befehle setzen beim Beenden einen Statuswert, der getestet werden kann, um festzustellen, ob der Befehl normal abgeschlossen wurde. Die Beendigungswerte und ihre Bedeutung werden in den einzelnen Handbüchern erläutert. Traditionell bedeutet der Wert 0, dass der Befehl erfolgreich abgeschlossen wurde.
Wenn Sie in 1003.1-Jargon sprechen würden, würden Sie es vielleicht das String-Argument nennen fürDieSystemFunktion in der C-Bibliothek. Das liegt daran, dass es sich nicht um einen Systemaufruf selbst handelt, sondern um eine Bibliotheksfunktion, die im Hintergrund verschiedene Systemaufrufe verwendet, einer davon ist
execve
. Dieser Systemaufruf verwendet
char *
als erstes Argument eine Konstante, nämlich den Pfad zur ausführbaren Datei im Dateisystem.
Veröffentlichte Lösungen
Eine veröffentlichte Lösung verwendet durchgängig die folgenden Definitionen:
ausführbare Datei
ADateidas speziell markiert ist, um zu sagen, dieBetriebssystemdass es in Ordnung ist, diese Datei als Programm auszuführen. Normalerweise abgekürzt als „ausführbare Datei“.
Befehl
InHülseProgrammierung, die syntaktische Kombination eines Programmnamens und seiner Argumente. Etwas lockerer ausgedrückt alles, was Sie in eine Shell (einen Befehlsinterpreter) eingeben, damit diese etwas tut. [...]
Kommandozeilenargumente
Die Werte, die Sie zusammen mit einem Programmnamen angeben, wenn Sie einem HülseausführenBefehl. [...]
Befehlsname
Der Name desProgrammderzeit ausgeführt, wie auf demBefehlszeile. [...]
Aus der vierten Ausgabe vonPerl-Programmierung(O'Reilly) und hier mit freundlicher Genehmigung der Autoren des Buches verwendet. :) .
Wenn Sie Glück haben, können Sie all dies und noch mehr selbst finden, indem Sie einfach diese einfache Befehlszeile in Ihre Shell eingeben, sodass sie dieMannausführbare Datei/Programm für Sie:
man perlglossary
Aber wenn Sie nicht so viel Glück haben,Sie finden sie auch hier.
Shell-Befehle
Dies könnte ein Shell-Befehl sein:
exec 2>errs.out
Beachten Sie, dass hier nichts ausgeführt wurde exec
. Wir haben lediglich einen Dateideskriptor neu angeordnet.
Das Gleiche gilt hier:
exec 5<&0 # save old stdin
exec 0<&3 # read some_var
exec 0<&4 # read another_var
exec 0<&5 # restore it
Daher ist jede Zeile in einem Skript ein „Befehl“, auch hier (wobei ich es dem Leser als Übung überlasse, wie viele tatsächliche execve
Systemaufrufe es erzeugt, wenn es vollständig ausgeführt wird):
#!/bin/sh
device=/dev/rmt8
dd_noise='^[0-9]+\+[0-9]+ records (in|out)$'
exec 3>&1
status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1`
exit $status
Aus der ehrwürdigen JeremiadeCSH-Programmierung gilt als schädlich, hier erneut mit freundlicher Genehmigung verwendet, bla bla bla. :)
Antwort3
Eine ziemlich einfache Lösung (und die üblichen philosophischen und sprachlichen Ausreden) ist die Unterscheidung zwischenVerwenden vondas WortBefehl, UndErwähnungdas WortBefehl. Beispielsweise führen bestimmte Wörter Aktionen aus, sogar im normalen Englisch, und ihr Gebrauch bestimmt, wie sie diese ausführen. Wenn Sie unter den richtigen Umständen „Ja, ich will“ sagen, könnten Sie zum Beispiel heiraten. Aber nicht, wenn Sie zitieren, was jemand anderes gesagt haben könnte. Alles, was zitiert wird, ist eine Erwähnung, kein Gebrauch.
Die erste Befehlsliste enthält also keine Verwendungen von Befehlen, sondern Erwähnungen von Befehlen.
Die zweiten Beispiele, wie mein Favorit
$ rev wordlist | sort | rev > speculum
(wodurch eine umgekehrt alphabetisch sortierte Kopie von erstellt wirdwordlist
)
werden tatsächlich etwas bewirken, also sind sie definitiv Verwendungszwecke.
Antwort4
Ich würde in Betracht ziehenes besteht keine Notwendigkeitals Antwort, da die beschriebene Mehrdeutigkeit ohnehin keinen Schaden anrichtet.
Wenn sich das Wort „Befehl“ in allen Kontexten, die ich gesehen habe, auf ein ausführbares Programm bezieht, handelt es sich immer um etwas, das ein Endbenutzer in eine Shell eingeben würde, um es auszuführen. Ich habe noch nie Ausdrücke wie „der init
Befehl" oder "der ld-linux.so
Befehl".
Wenn sich „Befehl“ auf ein Befehlszeilenprogramm bezieht, bezieht es sich eigentlich immer auf „die Befehlsfamilie, die mit dem besagten Programm beginnt“. Wenn Sie beispielsweise sagen „der grep
Befehl", Sie sprechen über all die Dinge, die Sie mit dem grep
Programm tun können, das "eine Familie von Befehlen" bildet. Dies gilt auch für Teilbefehle, wie das Sprichwort "der apt install
Befehl dient zum Installieren von Paketen", wenn der vollständige Befehl apt install
normalerweise nichts Nützliches bewirkt.