Befehlszeilenterminologie: Wie heißen diese Teile eines Befehls?

21

An der Kommandozeile verwende ich oft "einfache" Befehle wie

mv foo/bar baz/bar

aber ich weiß nicht, wie ich das alles nennen soll:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

Ich (glaube ich) weiß, dass 1 ein Befehl und 2 ein Argument ist, und ich würde wahrscheinlich 3 eine Argumentliste nennen (ist das richtig?).

Ich weiß jedoch nicht, wie ich 4 nennen soll .

Wie werden komplexere "Befehle" bezeichnet?

find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2' {} {/}

Ich würde eine Antwort begrüßen, die aufschlüsselt, wie 1,2,3,4 und wie jeder Teil von zB diesem "Befehl" oben genannt wird.

Es wäre großartig, auch über andere Dinge zu lernen, die einzigartig / überraschend sind, die ich hier nicht aufgenommen habe.

theonlygusti
quelle
1
Haben Sie sich die manSeiten gitund findinsbesondere den Abschnitt mit den Inhaltsangaben angesehen?
Fpmurphy
4
Haben Sie auf den man - Seiten für git sah und finden also die Frage scheint nichts mit dem zu tun gitoder findeher allgemeine Terminologie für Linux.
Att Righ
Laut der bash man - Seite in A | B, A | Bist eine Pipeline , Aund Bgeben Befehle (es ist bedauerlich , dass diese die gleichen Namen wie gerade die erste Welt in einem Befehl hat). Ich könnte das erste Argument als ausführbare Datei bezeichnen, aber ich kann keine Quelle finden, die mit mir übereinstimmt.
Att Righ
4
Im Rahmen der git checkout ..., checkoutist ein subcommand , und im Rahmen sh -c ..., -cist eine Option .
wjandrea
@JoL danke für den Hinweis. Sie haben richtig geraten, das habe ich bearbeitet. Das liegt daran, dass ich diesen Abschnitt etwa viermal neu geschrieben habe, als ich versucht habe, es richtig zu machen
theonlygusti

Antworten:

33

Die allgemeinen Namen für jedes Teil lauten wie folgt:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘
  1. Befehlsname (erstes Wort oder Token der Befehlszeile, bei dem es sich nicht um eine Umleitung oder Variablenzuweisung handelt, und nachdem Aliase erweitert wurden).

  2. Token, Wort oder Argument für den Befehl. Von Mann Bash:

    Wort: Eine Folge von Zeichen, die von der Shell als eine Einheit betrachtet werden. Wird auch als Token bezeichnet.

  3. Allgemein: Argumente

  4. Befehlszeile.

Die Verkettung zweier einfacher Befehle mit a |ist eine Pipe-Sequenz oder -Pipeline:

┌─1┐ ┌──────2──────┐ ┌─2─┐ ┌──2──┐   ┌──1───┐ ┌2┐┌2┐┌2┐┌────2─────┐ ┌2┐ ┌2┐
find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2'  {} {/}
│    └────────────3──────────────┘            └────────────3──────────────┘
└───────────────────────────────────4─────────────────────────────────────┘

Beachten Sie, dass es auch Umleitungen und Variablenzuweisungen gibt:

┌──5──┐ ┌1┐ ┌─2─┐ ┌─2─┐   ┌───6──┐ ┌1┐ ┌─5─┐
<infile tee file1 file2 | LC_ALL=C cat >file
└─────────7───────────┘   └───────7────────┘
└─────────────────────4────────────────────┘

Wo (neben den Zahlen von oben):

  1. Umleitung.
  2. Variablenzuordnung.
  3. Einfacher Befehl.

Dies ist keine vollständige Liste aller Elemente, die eine Befehlszeile haben könnte. Eine solche Liste ist zu komplex für diese kurze Antwort.

Isaac
quelle
2
In der POSIX-Terminologie ist das, was Sie als Pipe bezeichnen, eine Pipe-Sequenz oder -Pipeline (obwohl eine Pipeline optional einen führenden !Punkt haben kann , um ihren Status zu negieren). pipe würde sich eher auf den IPC-Mechanismus beziehen, der von den meisten Shells zur Implementierung von Pipelines verwendet wird (Pipelines müssen keine Pipelines verwenden, ksh93 verwendet beispielsweise bei einigen Systemen Socket-Paare). Einige Shells haben mehr Schlüsselwörter wie time, noglobdie stattdessen oder zusätzlich zu !hier verwendet werden können.
Stéphane Chazelas
1
IMHO, diese Dinge werden Argumente genannt - sonst nichts, also denke ich, dass das Wort Token in diesem Kontext "atomare Einheit der Bash-Grammatik" bedeutet. Hier existiert der Begriff Token nur im Kontext der Shell-Kommandozeile , nicht im Kontext des auszuführenden Programms. Es wäre etwas seltsam zu sagen, "das sind die Programm-Token", aber vielleicht weniger seltsam zu sagen, "das zweite Token in der Befehlszeile ist $ test". Eine Unterscheidung wird getroffen cat $file, hier würde ich sagen, $fileist ein Token, aber der Wert von file ist das Argument.
Att Righ
1
@PeterCordes Sie haben Recht, <<< "…" ist eine Umleitung, kein Argument. Obwohl es immer noch ein Zeichen der Linie ist. Entschuldigung für die Verwirrung.
Isaac
1
@TOOGAM Das ist genau das Gegenteil von den Standarddefinitionen. Die Dinge, die der Aufrufer bereitstellt, sind Argumente; vgl. "Formaler Parameter" oder diese SO-Frage .
Michael Homer
1
@TOOGAM "Was ich sehe, sind Parameter" . Hmm ich denke du hast recht. Entsprechend der POSIX-Spezifikation: "Die Shell führt eine Funktion (siehe Befehl zur Funktionsdefinition), eine integrierte Datei (siehe Spezielle integrierte Dienstprogramme) oder ein Skript aus und gibt die Namen der Argumente als Positionsparameter mit den Nummern 1 bis n an. und den Namen des Befehls (oder im Fall einer Funktion innerhalb eines Skripts den Namen des Skripts) als Positionsparameter mit der Nummer 0 (siehe Befehlssuche und -ausführung). " und ich hatte mich all die Jahre geirrt ... Obwohl es zu meiner Verteidigung heißtargv
Att Righ
15

@ isaacs Antwort oben scheint gut zu sein.

Ich möchte dies mit einigen Quellen erweitern.

Ich denke, der POSIX-Standard könnte in gewissem Sinne als kanonisch angesehen werden . Andere Quellen könnten man bashund sein man proc.

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

POSIX schlägt vor, dass:

  1. Ist der Befehlsname (anstelle des Befehls, obwohl auch in diesem Dokument der Befehl an bestimmten Stellen verwendet wird)
  2. Streit
  3. Argumente
  4. Befehl ( man procverwendet jedoch die Befehlszeile )

Es hat auch eine Terminologie für viel kompliziertere Befehle.

Ich denke, Befehl ist ziemlich vieldeutig, also sind der Begriff Befehlsname und Befehlszeile für Klarheit gut

Att Righ
quelle
Was ist proc? Ich habe nie davon gehört.
theonlygusti
5
+1 Diese Antwort gefällt mir am besten. (In diesem speziellen Kontext ist 2 ein Unterbefehl , im Allgemeinen jedoch ein Argument.)
Kubanczyk
@theonlygusti procist ein spezielles Dateisystem (eine Sammlung von Dateien), das Informationen über den internen Status des Kernels enthält. Ich glaube, es steht für Prozesse (siehe auch sysfs , das Informationen über andere Dinge als Prozesse liefert). Der Grund, warum es relevant ist, wird von Kernel-Entwicklern geschrieben , kann also durchaus die Sprache widerspiegeln, die sie verwenden, was etwas formeller sein könnte.
Att Righ