it-swarm.com.de

Wurden Backticks (d. H. "Cmd") in * sh-Shells veraltet?

Ich habe diesen Kommentar viele Male unter Unix & Linux sowie auf anderen Websites gesehen, die die Formulierung "Backticks wurden veraltet" in Bezug auf Shells wie Bash & Zsh verwenden.

Ist diese Aussage wahr oder falsch?

126
slm

Es gibt zwei verschiedene Bedeutungen von "veraltet".

veraltet sein: (hauptsächlich von 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 veraltet.

Der veraltete Status kann auch anzeigen, dass die Funktion in Zukunft entfernt wird.

Wikipedia

Nach dieser Definition sind Backticks nicht veraltet.

Wird immer noch unterstützt:

Unter Berufung auf Open Group Specification für Shell-Befehlssprachen , insbesondere Abschnitt "2.6.3 Befehlssubstitution", ist ersichtlich, dass beide Formen der Befehlssubstitution, Backticks (`..cmd..`) Oder Dollar-Parens ($(..cmd..)) werden weiterhin unterstützt, sofern die Spezifikation dies zulässt.

Auszug

Durch die Befehlssubstitution kann die Ausgabe eines Befehls anstelle des Befehlsnamens selbst ersetzt werden. Die Befehlsersetzung erfolgt, wenn der Befehl wie folgt beigefügt ist:

          $(command)

          or (backquoted version):

          `command`

Die Shell erweitert die Befehlssubstitution, indem sie den Befehl in einer Subshell-Umgebung ausführt (siehe Shell-Ausführungsumgebung) und die Befehlssubstitution (Befehlstext plus das einschließende $() oder Backquotes) durch die Standardausgabe des Befehls ersetzt Entfernen von Sequenzen mit einem oder mehreren <newline> -Zeichen am Ende der Ersetzung. Eingebettete <newline> -Zeichen vor dem Ende der Ausgabe dürfen nicht entfernt werden. Sie können jedoch als Feldtrennzeichen behandelt und während der Feldaufteilung entfernt werden, abhängig vom Wert des IFS und dem gültigen Angebot. Wenn die Ausgabe Null-Bytes enthält, ist das Verhalten nicht angegeben.

Innerhalb des hinter zitierten Stils der Befehlssubstitution behält <backslash> seine wörtliche Bedeutung bei, außer wenn gefolgt von: '$', '\`' Oder <backslash> . Die Suche nach dem passenden Backquote wird durch das erste nicht zitierte, nicht maskierte Backquote erfüllt. Wenn bei dieser Suche in einem Shell-Kommentar ein nicht maskiertes Backquote, ein Here-Dokument, eine eingebettete Befehlsersetzung des Formulars $(command) oder eine Zeichenfolge in Anführungszeichen gefunden wird, treten undefinierte Ergebnisse auf. Eine Zeichenfolge in einfachen oder doppelten Anführungszeichen, die innerhalb der Sequenz "`...`" Beginnt, aber nicht endet, führt zu undefinierten Ergebnissen.

Mit dem Formular $(command) bilden alle Zeichen, die der offenen Klammer bis zur übereinstimmenden schließenden Klammer folgen, den Befehl. Jedes gültige Shell-Skript kann für Befehle verwendet werden, mit Ausnahme eines Skripts, das ausschließlich aus Umleitungen besteht und nicht spezifizierte Ergebnisse liefert.

Warum sagen dann alle, dass Backticks veraltet sind?

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

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

    Auszug

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

    ...

  • Bash Hackers Wiki - Veraltete und veraltete Syntax

    Auszug

    Dies ist die ältere Bourne-kompatible Form des Befehlssubstitution . Sowohl die Syntax `COMMANDS` Als auch die Syntax $(COMMANDS) werden von POSIX spezifiziert, wobei letztere stark bevorzugt wird, obwohl die erstere leider immer noch sehr verbreitet ist Skripte. Befehlsersetzungen neuen Stils werden von jeder modernen Shell (und einigen anderen) weitgehend implementiert. Der einzige Grund für die Verwendung von Backticks ist die Kompatibilität mit einer echten Bourne Shell (wie Heirloom). Backtick-Befehlsersetzungen erfordern ein spezielles Escapezeichen, wenn sie verschachtelt sind, und Beispiele in freier Wildbahn werden häufig falsch zitiert. Siehe: Warum wird $ (...) gegenüber `...` (Backticks) bevorzugt? .

  • POSIX Standard Begründung

    Auszug

    Aufgrund dieses inkonsistenten Verhaltens wird die neu zitierte Variante der Befehlssubstitution nicht für neue Anwendungen empfohlen, die Befehlssubstitutionen verschachteln oder versuchen, komplexe Skripts einzubetten.

HINWEIS: Dieser dritte Auszug (oben) zeigt einige Situationen, in denen Backticks einfach nicht funktionieren, die neuere Dollar-Parens-Methode jedoch, beginnend mit der folgende Absatz:

Darüber hinaus unterliegt die Syntax für Backquotes historische Einschränkungen für den Inhalt des eingebetteten Befehls. Während das neuere "$ ()" - Formular jede Art von gültigem eingebettetem Skript verarbeiten kann, kann das rückgängig gemachte Formular einige gültige Skripte, die Rückführungszeichen enthalten, nicht verarbeiten.

Wenn Sie diesen Abschnitt weiter lesen, werden die Fehler hervorgehoben, die zeigen, wie sie mit Backticks fehlschlagen würden. Arbeiten Sie jedoch mit der neueren Dollar-Parens-Notation.

Schlussfolgerungen

Es ist daher vorzuziehen, dass Sie Dollar-Parens anstelle von Backticks verwenden, aber Sie verwenden nicht etwas, das technisch "veraltet" ist, wie in "Dies wird irgendwann an einem geplanten Punkt nicht mehr funktionieren."

Nachdem Sie dies alles gelesen haben, sollten Sie die Möglichkeit haben, Dollar-Parens zu verwenden, es sei denn, Sie benötigen speziell Kompatibilität mit einer echten Original-Bourne-Shell ohne POSIX.

131
slm

Es ist nicht veraltet, aber die Backticks (`...`) Sind die Legacy-Syntax, die nur von den ältesten nicht POSIX-kompatiblen Bourne-Shells benötigt wird, und $(...) ist POSIX und aus mehreren Gründen bevorzugter ::

  • Backslashes (\) In Backticks werden auf nicht offensichtliche Weise behandelt:

    $ echo "`echo \\a`" "$(echo \\a)"
    a \a
    $ echo "`echo \\\\a`" "$(echo \\\\a)"
    \a \\a
    # Note that this is true for *single quotes* too!
    $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
    foo is \, bar is \\
    
  • Verschachtelte Anführungszeichen in $() sind weitaus praktischer:

    echo "x is $(sed ... <<<"$y")"
    

    anstatt:

    echo "x is `sed ... <<<\"$y\"`"
    

    oder etwas schreiben wie:

    IPs_inna_string=`awk "/\`cat /etc/myname\`/"'{print $1}' /etc/hosts`
    

    weil $() einen völlig neuen Kontext zum Zitieren verwendet

    das ist nicht tragbar, da Bourne- und Korn-Muscheln diese Backslashes erfordern würden, während Bash und Dash dies nicht tun.

  • Die Syntax zum Verschachteln von Befehlsersetzungen ist einfacher:

    x=$(grep "$(dirname "$path")" file)
    

    als:

    x=`grep "\`dirname \"$path\"\`" file`
    

    da $() einen völlig neuen Kontext für das Zitieren erzwingt, ist jede Befehlsersetzung geschützt und kann für sich behandelt werden, ohne dass besondere Bedenken hinsichtlich des Zitierens und des Escapings bestehen. Bei der Verwendung von Backticks wird es nach zwei und mehr Levels immer hässlicher.

    Einige weitere Beispiele:

    echo `echo `ls``      # INCORRECT
    echo `echo \`ls\``    # CORRECT
    echo $(echo $(ls))    # CORRECT
    
  • Es löst ein Problem inkonsistenten Verhaltens bei der Verwendung von Backquotes:

    • echo '\$x' Gibt \$x Aus.
    • echo `echo '\$x'` Gibt $x Aus.
    • echo $(echo '\$x') gibt \$x aus
  • Die Backticks-Syntax unterliegt historischen Einschränkungen für den Inhalt des eingebetteten Befehls und kann einige gültige Skripts, die Backquotes enthalten, nicht verarbeiten, während das neuere Formular $() jede Art von gültigem eingebettetem Skript verarbeiten kann.

    Beispielsweise funktionieren diese ansonsten gültigen eingebetteten Skripte nicht in der linken Spalte, sondern in der rechten IEEE ::

    echo `                         echo $(
    cat <<\eof                     cat <<\eof
    a here-doc with `              a here-doc with )
    eof                            eof
    `                              )
    
    
    echo `                         echo $(
    echo abc # a comment with `    echo abc # a comment with )
    `                              )
    
    
    echo `                         echo $(
    echo '`'                       echo ')'
    `                              )
    

Daher sollte die Syntax für $ - Präfix Befehlssubstitution die bevorzugte Methode sein, da sie mit sauberer Syntax visuell klar ist (verbessert die Lesbarkeit von Mensch und Maschine), verschachtelbar und intuitiv ist Das innere Parsen ist separat und konsistenter (mit allen anderen Erweiterungen, die aus doppelten Anführungszeichen analysiert werden), bei denen Backticks die einzige Ausnahme darstellen und das Zeichen ` leicht getarnt werden kann, wenn es neben " erschwert das Lesen, insbesondere bei kleinen oder ungewöhnlichen Schriftarten.

Quelle: Warum wird $(...) gegenüber `...` (Backticks) bevorzugt? bei BashFAQ

Siehe auch:

16
kenorb