ZUSAMMENFASSUNG

ZUSAMMENFASSUNG

Das WortBefehlbezieht sich in Linux auf zwei verschiedene Konzepte:

  1. Ein ausführbares Programm, wie zum Beispielgrep(oder eine Shell-Integration wieCD). Anwendungsbeispiel: „Hier sind die 10 wichtigsten Linux-Befehle, die Sie lernen sollten.“
  2. 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 grepund cdals „Versorgungsunternehmen", UndReserven"Befehl" für die Anweisungen. Bei einheitlicher Verwendung sind diese Begriffe eindeutig.


Um Ihre Fälle der Reihe nach zu bearbeiten

  1. „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 truesie 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, und trap, die den internen Zustand der Shell beeinflussen, aber sienichtinclude cd, ein reguläres integriertes Element. Abgesehen von den nuancierten Anforderungen der Spezifikation (bestimmtes Verhalten bei der Variablenzuweisung unterscheidet sich und ist mit nicht verfügbar execvp) reicht „Dienstprogramm“ aus, um beide Kategorien auf Benutzerebene abzudecken. Artikel mit Shell-Syntax wie ifund whilesind überhaupt keine Dienstprogramme.

  2. "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 wie ifKonstrukte 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 in grep com /etc/hostsist grepund 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 Kommando

echo 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 execveSystemaufrufe 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 wird wordlist)

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 initBefehl" oder "der ld-linux.soBefehl".

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 grepBefehl", Sie sprechen über all die Dinge, die Sie mit dem grepProgramm tun können, das "eine Familie von Befehlen" bildet. Dies gilt auch für Teilbefehle, wie das Sprichwort "der apt installBefehl dient zum Installieren von Paketen", wenn der vollständige Befehl apt installnormalerweise nichts Nützliches bewirkt.

verwandte Informationen