it-swarm.com.de

Was ist der Unterschied zwischen $ (stuff) und `stuff`?

Es gibt zwei Syntaxen für die Befehlssubstitution: mit Dollar-Klammern und mit Backticks. Ausführen von top -p $(pidof init) und top -p `pidof init` gibt die gleiche Ausgabe. Gibt es zwei Möglichkeiten, dasselbe zu tun, oder gibt es Unterschiede?

270
tshepang

Die Backquotes im alten Stil ` ` Behandeln Backslashes und Verschachtelungen etwas anders. Der neue Stil $() interpretiert alles zwischen ( ) Als Befehl.

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

funktioniert, wenn die verschachtelten Backquotes maskiert sind:

echo `uname | \`echo cat\``
Linux

backslash-Spaß:

echo $(echo '\\')
\\

echo `echo '\\'`
\

Der neue Stil $() gilt für alle POSIX - konformen Shells.
Wie mouviciel hervorhob, könnte für ältere Muscheln ein alter Stil ` ` Erforderlich sein.

Neben dem technischen Gesichtspunkt hat der alte Stil ` ` Auch einen visuellen Nachteil:

  • Schwer zu bemerken: I like $(program) better than `program`
  • Leicht zu verwechseln mit einem einfachen Anführungszeichen: '`'`''`''`'`''`'
  • Nicht so einfach zu tippen (vielleicht nicht einmal im Standardlayout der Tastatur)

(und SE verwendet ` ` für eigene Zwecke, es war ein Schmerz, diese Antwort zu schreiben :)

364
wag

Offensichtlicher Unterschied, den ich beobachte, ist, dass Sie keine Backticks verschachteln können, während Sie $() verschachteln können. Vielleicht existieren beide aus alten Gründen. Ebenso ist das . und source Befehle sind Synonyme.

41
balki

$() funktioniert nicht mit der alten Bourne Shell. Aber es war jahre Jahrzehnte, seit ich mit der alten Bourne Shell gearbeitet habe.

28
mouviciel

Ein weiterer Hinweis: $() verbraucht mehr Systemressourcen als Backticks, ist jedoch etwas schneller.

In Mastering Unix Shell Scripting hatte Randal K. Michael einen Test in einem Kapitel mit dem Titel "24 Möglichkeiten, eine Datei Zeile für Zeile zu verarbeiten" durchgeführt.

6
cuonglm

Um das zu ergänzen, was andere hier gesagt haben, können Sie die Backticks verwenden, um Inline-Kommentare zu simulieren:

echo foo `# I'm a comment!` bar

Die Ausgabe lautet: foo bar.

Weitere Informationen finden Sie im Folgenden: https://stackoverflow.com/a/12797512 (Beachten Sie auch die Kommentare unter diesem Beitrag.)

5
phk

Die Syntax $() funktioniert nicht mit der alten bourne Shell.
Bei neueren Shells sind ` ` Und $() gleichwertig, aber $() ist viel bequemer zu verwenden, wenn Sie mehrere Befehle verschachteln müssen.

Zum Beispiel :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

ist einfacher zu tippen und zu debuggen als:

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
1
Emmanuel