GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sind Backticks (d. h. `cmd`) in *sh-Shells veraltet?

Ich habe diesen Kommentar viele Male auf Unix und Linux sowie auf anderen Websites gesehen, die die Formulierung „Backticks sind veraltet“ in Bezug auf Shells wie Bash und Zsh verwenden.

Ist diese Aussage wahr oder falsch?

Akzeptierte Antwort:

Es gibt zwei verschiedene Bedeutungen von „veraltet.“

veraltet werden: (hauptsächlich einer Softwarefunktion) verwendbar sein, aber als veraltet angesehen und am besten vermieden werden, typischerweise weil sie ersetzt wurden.

—Neues Oxford American Dictionary

Nach dieser Definition sind Backticks sind veraltet.

Der Status "Veraltet" kann auch Geben Sie an, dass die Funktion in Zukunft entfernt wird.

—Wikipedia

Nach dieser Definition sind Backticks nicht veraltet.

Noch unterstützt:

Unter Berufung auf die Open Group Specification on Shell Command Languages,
insbesondere Abschnitt „2.6.3 Command Substitution“, ist ersichtlich, dass beide Formen der Befehlssubstitution, Backticks (`..cmd..` ) oder Dollarklammern ($(..cmd..) ) werden weiterhin unterstützt, soweit die Spezifikation geht.

Auszug

Die Befehlsersetzung ermöglicht es, die Ausgabe eines Befehls anstelle des Befehlsnamens
selbst zu ersetzen. Die Befehlsersetzung erfolgt, wenn der Befehl
wie folgt eingeschlossen wird:

          $(command)

          or (backquoted version):

          `command`

Die Shell soll die Befehlsersetzung erweitern, indem sie den Befehl in einer
Subshell-Umgebung ausführt (siehe Shell-Ausführungsumgebung) und die
Befehlsersetzung ersetzt (der Text des Befehls plus das einschließende $() oder
Backquotes) mit der Standardausgabe des Befehls, wobei Sequenzen von einem
oder mehr Zeichen am Ende der Substitution entfernt werden. Eingebettete -Zeichen vor dem Ende der Ausgabe werden nicht entfernt; sie können jedoch
als Feldtrennzeichen behandelt und während der Feldaufteilung eliminiert werden,
abhängig vom Wert von IFS und der gültigen Quotierung. Wenn die Ausgabe
Nullbytes enthält, ist das Verhalten nicht spezifiziert.

Innerhalb des Backquotes-Stils der Befehlsersetzung, behält
seine wörtliche Bedeutung, außer wenn gefolgt wird von:‘$’, ‘` ‘, oder . Die
Suche nach dem passenden Backquote soll durch das erste nicht zitierte
nicht maskierte Backquote erfüllt werden; Wenn während dieser Suche ein Backquote ohne Escapezeichen
in einem Shell-Kommentar, einem Here-Dokument, einem eingebetteten Befehl
als Ersatz des $(command) gefunden wird Form oder eine Zeichenfolge in Anführungszeichen, treten undefinierte Ergebnisse
auf. Eine Zeichenfolge in einfachen oder doppelten Anführungszeichen, die
innerhalb von „`...` beginnt, aber nicht endet ”-Sequenz erzeugt undefinierte Ergebnisse.

Mit dem $(command) bilden alle Zeichen nach der öffnenden Klammer bis
der passenden schließenden Klammer den Befehl. Jedes gültige
Shell-Skript kann für Befehle verwendet werden, mit Ausnahme eines Skripts, das nur aus
Umleitungen besteht, die unspezifische Ergebnisse erzeugen.

Warum sagen dann alle, dass Backticks veraltet sind?

Weil die meisten Anwendungsfälle sollten verwenden Sie die Dollar-Parens-Form anstelle von Backticks. (Im ersten Sinne oben veraltet.) Viele der seriösesten Websites (einschließlich U&L) geben dies oft auch durchgehend an, also ist es ein vernünftiger Rat. Dieser Rat sollte nicht mit einem nicht existierenden Plan verwechselt werden, die Unterstützung für Backticks aus Shells zu entfernen.

  • BashFAQ #082 – Warum wird $(…) gegenüber `…` (Backticks) bevorzugt?

    Auszug

    `...` ist die Legacy-Syntax, die nur von den allerältesten
    nicht POSIX-kompatiblen Bourne-Shells benötigt wird. Es gibt mehrere Gründe,
    immer $(...) zu bevorzugen Syntax:

  • Bash Hackers Wiki – Veraltete und veraltete Syntax

    Auszug

    Dies ist die ältere Bourne-kompatible Form der Befehlsersetzung.
    Sowohl die `COMMANDS` und $(COMMANDS) Syntaxen werden von POSIX spezifiziert,
    aber letzteres ist sehr bevorzugt, obwohl ersteres leider
    in Drehbüchern immer noch sehr weit verbreitet ist. Befehlsersetzungen neuen Stils werden in großem Umfang
    von jeder modernen Shell (und noch einigen) implementiert. Der einzige Grund für die Verwendung von
    Backticks ist die Kompatibilität mit einer echten Bourne-Shell (wie Heirloom).
    Backtick-Befehlsersetzungen erfordern spezielles Escapezeichen, wenn sie verschachtelt sind, und
    in der Wildnis gefundene Beispiele werden häufiger falsch zitiert oft als nicht. Siehe:Warum wird $(…) gegenüber `…` (Backticks) bevorzugt?.

  • POSIX-Standardbegründung

    Auszug

    Aufgrund dieses inkonsistenten Verhaltens wird die Variante der Befehlsersetzung mit Backquotes nicht für neue Anwendungen empfohlen, die Befehlsersetzungen verschachteln oder versuchen, komplexe Skripte einzubetten.

HINWEIS: Dieser dritte Auszug (oben) zeigt mehrere Situationen, in denen Backticks einfach nicht funktionieren, aber die neuere Dollar-Parens-Methode, beginnend mit dem folgenden Absatz:

Darüber hinaus hat die Backquotes-Syntax historische Beschränkungen für den Inhalt des eingebetteten Befehls. Während das neuere „$()“-Formular jede Art gültiger eingebetteter Skripte verarbeiten kann, kann das Backquotes-Formular einige gültige Skripte, die Backquotes enthalten, nicht verarbeiten.

Wenn Sie diesen Abschnitt weiterlesen, werden die Fehler hervorgehoben, die zeigen, wie sie mit Backticks fehlschlagen würden, aber mit der neueren Dollar-Parens-Notation funktionieren.

Verwandte:Wie positionieren Sie Ihre Hand, um die Befehlstaste (cmd) + Wahltaste (alt) zu drücken?

Schlussfolgerungen

Daher ist es vorzuziehen, Dollarparens anstelle von Backticks zu verwenden, aber Sie verwenden nicht wirklich etwas, das technisch „veraltet“ ist, wie in „das wird an einem geplanten Punkt vollständig aufhören zu funktionieren.“

Nachdem Sie all dies gelesen haben, sollten Sie wissen, dass Sie dringend ermutigt werden, Dollarparens zu verwenden, es sei denn, Sie spezifisch erfordern Kompatibilität mit einer echten Original-Nicht-POSIX-Bourne-Shell.


Linux
  1. Linux-Terminal-Trick:Hacken Sie den cd-Befehl, um sich daran zu erinnern, wo Sie gewesen sind

  2. Wie verwende ich den Befehl Coproc in verschiedenen Shells?

  3. Alle Dateien erhalten, die an einem bestimmten Datum geändert wurden?

  4. Welche Shells unterstützen keine Dollar-Klammer-Expansion und verlangen Backticks?

  5. Beispiele für das Erstellen von Befehlsaliasnamen in verschiedenen Shells

Haben Sie eine Kuh an der Linux-Befehlszeile

So finden Sie heraus, wie lange ein Prozess unter Linux läuft

Terminals, Shells, Konsolen und Befehlszeilen

3 Linux-Befehle, die Sie vergessen haben

Kann ein Linux-Befehl Großbuchstaben haben?

Hat Bash einen Farbbefehl, wie in MS-Windows CMD zu sehen?