Es gibt zwei Möglichkeiten, die Ausgabe der Befehlszeile in zu erfassen bash
:
Legacy Bourne Shell Backticks
``
:var=`command`
$()
Syntax (die meines Wissens Bash-spezifisch ist oder zumindest von alten Nicht-POSIX-Shells wie dem ursprünglichen Bourne nicht unterstützt wird)var=$(command)
Gibt es einen Vorteil bei der Verwendung der zweiten Syntax im Vergleich zu Backticks? Oder sind die beiden zu 100% gleichwertig?
$()
ist POSIX und wird von allen modernen Bourne-Shells unterstützt, z. B. Ksh, Bash, Ash, Dash, Zsh, Busybox. (Ein nicht so modernes ist Solaris/bin/sh
, aber unter Solaris sollten Sie/usr/xpg4/bin/sh
stattdessen das moderne verwenden).$()
und Backticks in Aliasen. Wenn Siealias foo=$(command)
in Ihrem.bashrc
danncommand
ausgeführt, wenn die Alias - Befehl selbst wird während laufen.bashrc
Interpretation. Mitalias foo=`command`
,command
wird jedes Mal ausgeführt wird , wird der Alias ausgeführt werden . Wenn Sie jedoch$
mit dem$()
Formular (z. B.alias foo=\$(command)
) entkommen , wird es jedes Mal ausgeführt, wenn der Alias ausgeführt wird, anstatt während der.bashrc
Interpretation. Soweit ich das durch Testen beurteilen kann; Ich kann in den Bash-Dokumenten nichts finden, was dieses Verhalten erklärt.`command`
command
wird nur einmal ausgeführt. Ich habe es überprüft: function aaa () {printf date; echo aaa >> ~ / test.txt; } alias test1 =aaa
. Die Funktion aaa wird nur einmal (nach jedem Login) ausgeführt, unabhängig davon, wie oft alias (test1
) ausgeführt wurde. Ich habe .bashrc (unter Debian 10) verwendet.Antworten:
Das wichtigste ist die Fähigkeit, sie zu verschachteln , Befehle innerhalb von Befehlen, ohne Ihre geistige Gesundheit zu verlieren, um herauszufinden, ob irgendeine Form der Flucht auf den Backticks funktioniert.
Ein Beispiel, wenn auch etwas erfunden:
Hier erhalten Sie eine Liste aller Dateien im
/dir
Verzeichnisbaum, die denselben Namen wie die früheste datierte Textdatei vom Dezember 2011 haben (a) .Ein anderes Beispiel wäre etwa das Abrufen des Namens (nicht des vollständigen Pfads) des übergeordneten Verzeichnisses:
(a) Da ein bestimmter Befehl möglicherweise nicht funktioniert, habe ich die Funktionalität nicht getestet. Wenn Sie mich dafür stimmen, haben Sie die Absicht aus den Augen verloren :-) Es ist nur als Illustration gedacht, wie Sie nisten können, nicht als fehlerfreies produktionsfertiges Snippet.
quelle
Do whatever the heck you want with it.
" :-) Auf jeden Fall bin ich mir ziemlich sicher, dass es Humor von DVK war.Angenommen, Sie möchten das lib-Verzeichnis finden, das dem
gcc
Installationsort entspricht. Du hast eine Wahl:Der erste ist einfacher als der zweite - verwenden Sie den ersten.
quelle
x=$(f); x=`f`
benimm dich genauso wiex="$(f)"; x="`f`"
. Im Gegensatz dazu Array Zuordnungx=($(f)); x=(`f`)
kann durchführen Splitting bei$IFS
Zeichen wie erwartet , wenn Befehle aufgerufen wird . Dies ist praktisch (x=1 2 3 4
macht keinen Sinn), aber inkonsistent.x=$(f)
Arbeit ohne Anführungszeichen. Ich hätte genauer sein sollen; Ich schlug vor,libdir=$(dirname "$(dirname "$(which gcc)")")/lib
(Anführungszeichen um die inneren Befehlssubstitutionen) zu verwenden. Wenn Sie nicht zitiert werden, unterliegen Sie weiterhin der üblichen Wortaufteilung und Glob-Erweiterung.Die backticks (
`...`
) sind die Legacy-Syntax, die nur von den ältesten nicht POSIX-kompatiblen Bourne-Shells benötigt$(...)
wird. Sie sind POSIX und werden aus mehreren Gründen bevorzugter:Backslashes (
\
) in Backticks werden auf nicht offensichtliche Weise behandelt:Verschachtelte Zitate im Inneren
$()
sind weitaus praktischer:anstatt:
oder etwas schreiben wie:
weil
$()
verwendet einen völlig neuen Kontext zum ZitierenDas ist nicht tragbar, da Bourne- und Korn-Muscheln diese Backslashes erfordern würden, während Bash und Dash dies nicht tun.
Die Syntax für das Ersetzen von Verschachtelungsbefehlen ist einfacher:
als:
weil
$()
ein völlig neuer Kontext für das Zitieren erzwungen wird, 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:
Es löst ein Problem inkonsistenten Verhaltens bei der Verwendung von Backquotes:
echo '\$x'
Ausgänge\$x
echo `echo '\$x'`
Ausgänge$x
echo $(echo '\$x')
Ausgänge\$x
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 die neueren
$()
Formular jede Art von gültigem eingebettetem Skript verarbeiten kann.Diese ansonsten gültigen eingebetteten Skripte funktionieren beispielsweise nicht in der linken Spalte, sondern auf dem rechten IEEE :
Daher sollte die Syntax für die Substitution von
$
Befehlen mit Präfix die bevorzugte Methode sein, da sie mit einer sauberen Syntax visuell klar ist (verbessert die Lesbarkeit von Mensch und Maschine), verschachtelbar und intuitiv ist, ihre innere Analyse getrennt ist und auch konsistenter ist (mit alle anderen Erweiterungen, die in doppelten Anführungszeichen analysiert werden), wobei Backticks die einzige Ausnahme sind und`
Charakter leicht getarnt werden kann"
was das Lesen noch schwieriger macht, insbesondere bei kleinen oder ungewöhnlichen Schriftarten.Quelle: Warum wird
$(...)
bevorzugt`...`
(Backticks)?bei BashFAQSiehe auch:
quelle
Von Mann schlagen:
quelle
Zusätzlich zu den anderen Antworten
fällt optisch besser auf als
Backticks sehen zu sehr nach Apostrophen aus; Dies hängt von der verwendeten Schriftart ab.
(Und wie ich gerade bemerkt habe, ist es viel schwieriger, Backticks in Inline-Codebeispiele einzugeben.)
quelle
$
(
und)
als für Backtick habe. YMMV.$()
ermöglicht das Verschachteln.Ich denke, Backticks erlauben es nicht.
quelle
out=`echo today is \`date\``
.Es ist der POSIX-Standard, der die
$(command)
Form der Befehlssubstitution definiert . Die meisten heute verwendeten Shells sind POSIX-kompatibel und unterstützen diese bevorzugte Form gegenüber der archaischen Backtick-Notation. Der Befehlsersetzungsabschnitt (2.6.3) des Shell Language-Dokuments beschreibt Folgendes:quelle
Dies ist eine Legacy-Frage, aber ich habe ein perfekt gültiges Beispiel für
$(...)
Over gefunden`...`
.Ich habe einen Remotedesktop für Windows verwendet, auf dem Cygwin ausgeführt wird, und wollte ein Ergebnis eines Befehls durchlaufen. Leider konnte der Backtick-Charakter weder aufgrund des Remote-Desktops noch aufgrund von Cygwin selbst eingegeben werden.
Es ist vernünftig anzunehmen, dass ein Dollarzeichen und Klammern einfacher sind, solche seltsamen Einstellungen einzugeben.
quelle