Wird die Befehlsersetzungssyntax $() als Operator oder als Befehl betrachtet?

Wird die Befehlsersetzungssyntax $() als Operator oder als Befehl betrachtet?

Ich kann keine offizielle Dokumentation finden, in der es als das eine oder das andere bezeichnet wird. Was genau ist überhaupt der technische Unterschied zwischen einem Befehl und einem Operator?

Antwort1

Der Text in POSIX listet es unter2.6 Worterweiterungen, zusammen mit Tilde-Erweiterung, Parametererweiterung, arithmetischer Erweiterung, Feldaufteilung, Pfadnamenerweiterung und Anführungszeichenentfernung.

Ähnlich listet Bashs Handbuch es unterShell-Erweiterungen.

Ersteres verwendet „Operator“ für Umleitungsoperatoren und ;, &, |, &&, ||, (usw., ist also keiner von beiden. Es ist auch offensichtlich kein Befehl, also muss ich sagen, dass es, egal wie wichtig die Terminologie ist, keiner von beiden ist.

Antwort2

Ein Kommando:

  • hat normalerweise eine alphanumerische Zeichenfolge als Namen.

  • ist entweder ein externes Dienstprogramm, ein integriertes Programm oder eine Funktion. Fast alles, typewofür das integrierte Programm eine Ausgabe erzeugt, ist in diesem Sinne ein Befehl.

  • hatPräfixNotation.

  • ändert normalerweise eine Art E/A.

Ein Operateur:

  • ist normalerweise eine symbolische Zeichenfolge und hat möglicherweise keinen Namen, aber möglicherweise einen Spitznamen.

  • wird vom typeintegrierten Programm nicht verstanden (es sei denn, es gibt eine Funktion oder ein Skript mit einem verwirrenden Namen).

  • öfter hatInfixoderSuffixSyntax.

  • lenkt manchmal I/O wie ein Verkehrspolizist, ändert aber nichts an dem, wasInEs.

  • bestimmt manchmal die Reihenfolge der Prozesse.

$()ist ein BefehlAuswechslung:

  • zunächst einmal (oder zuletzt, je nachdem, wie wir es betrachten) ist es eine Zeichenfolge.
  • Die Zeichenfolge besteht aus dem TextAusgabeder darin aufgeführten Befehle.

[ist ein in die Shell integrierter Befehl:

  • Es ist der testBefehl mit einem obligatorischen ]Suffix.

[[ist ein bashShell-Schlüsselwort:

  • Es ist wie ein vielseitigeres und schnelleres [integriertes Programm, aber SFAIK ohne entsprechenden test-ähnlichen Befehl.
  • Shell-Schlüsselwörter umfassen Dinge wie timeund for, die wie Befehle aussehen, sich aber eher wie Operatoren verhalten, die verschiedene Geschwisterschlüsselwörter als Trennzeichen und Syntax erfordern. Dieser Code führt das typeBuiltin auf der Ausgabe des helpBuiltins aus, das eine Liste von Schlüsselwörtern und Builtins auf der linken Seite anzeigt:

    COLUMNS=30 help -m | tail -n +9 | 
    tee >(cut -d ' ' -f2) >(cut -c 17-30 | cut -d ' ' -f1) > /dev/null | 
    sort | sed -n "s/.*/type '&'/e"';/found/!p'
    

Vergleich mit einer gesprochenen Sprache:

  • Befehle (und einige Schlüsselwörter) sind wie Verben.
  • Dateien und Zeichenfolgen sind Substantive.
  • Operatoren sind wie Satzzeichen und Präpositionen.

Im Abstrakten sind Operatoren nur Befehle mit unterschiedlicher Syntax, die durch ähnliche ersetzt werden könntenPräfixStilbefehle zusammen mit den anderen verwenden. Die Verwendung wäre wahrscheinlich nicht so bequem.

Analytisch gesehen könnte der kompilierte Code einer Shell durch einen Disassembler ausgeführt werden, und die Operatoren sind wieder nur Befehle oder vielmehr eine Reihe von Assemblerbefehlen.

Antwort3

Aus der Sicht des Benutzers ist eine Befehlsersetzung eine Art Shell-Grundelement. Es handelt sich dabei um eine in der Shell implementierte Funktion, die mehrere Aktionen ausführt (eine Subshell startet, einen Befehl ausführt...) und einen Wert zurückgibt (die Ausgabe des Befehls). Bevor die Shell Erweiterungen ausführt, ist eine Befehlsersetzung normalerweise das Argument eines Befehls. Mit anderen Worten: Der Benutzer erhält das Ergebnis eines Shell-Prozesses mithilfe einer Shell-Funktion.

verwandte Informationen