Es gibt zwei Syntaxen für die Befehlssubstitution: mit Dollar-Klammern und mit Backticks. Laufen 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?
Es gibt zwei Syntaxen für die Befehlssubstitution: mit Dollar-Klammern und mit Backticks. Laufen 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?
Antworten:
Die Backquotes im alten Stil ` `
behandeln Backslashes und Nesting etwas anders. Der neue Stil $()
interpretiert alles dazwischen ( )
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 geschachtelten Anführungszeichen 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 betonte, ` `
könnte für ältere Muscheln ein alter Stil erforderlich sein.
Abgesehen von der technischen Sicht hat der alte Stil ` `
auch einen optischen Nachteil:
I like $(program) better than `program`
'`'`''`''`'`''`'
(und SE verwendet ` `
für eigene Zwecke, es war ein Schmerz, diese Antwort zu schreiben :)
{ }
wird normalerweise "geschweifte Klammern" oder "geschweifte Klammern" genannt de.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
ist eine tote Taste, also muss ich entweder ein Double-Backtick (etwas, das ich normalerweise vergesse, kann ich sogar tun) oder ein Backtick und dann ein Leerzeichen eingeben Schmerzen.
Der offensichtliche Unterschied, den ich beobachte, ist, dass Sie Backticks nicht verschachteln können, während Sie verschachteln können $()
. Vielleicht existieren beide aus alten Gründen. Ebenso sind die Befehle .
und source
Synonyme.
source
. Dash ist ein Beispiel.
$(...)
und `...`
Standard sind (letzteres ist veraltet), während .
es Standard ist, aber nichtsource
(t)csh
können sie nicht verschachtelt werden. (t)csh
aber nicht unterstützen $(...)
. Sie unterstützen source
(und nicht .
) obwohl.
$()
funktioniert nicht mit alter Bourne-Shell. Aber es ist Jahre Jahrzehnte her, seit ich mit der alten Bourne-Shell gearbeitet habe.
Ein weiterer Hinweis, $()
wird mehr Systemressourcen als die Verwendung von Backticks verwenden, ist aber etwas schneller.
Randal K. Michael hatte in Mastering Unix Shell Scripting einen Test in einem Kapitel mit dem Titel "24 Möglichkeiten, eine Datei Zeile für Zeile zu verarbeiten" durchgeführt.
$()
dass Ihr Skript ein Byte größer ist als bei Verwendung `
(vorausgesetzt, Sie verschachteln sie nicht und verwenden keine Backslashes). Was schneller zu analysieren wäre, würde zwischen den Schalen variieren und wäre irrelevant und vernachlässigbar im Vergleich zu den Kosten für die Erstellung eines Rohrs und das Verzweigen von Prozessen, die eine Befehlssubstitution mit sich bringt.
Um das, was andere hier gesagt haben, zu ergänzen, 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.)
Die $()
Syntax funktioniert nicht mit der alten Borowski-Shell.
Mit neueren Shells ` `
und $()
Äquivalenten $()
ist die Verwendung jedoch wesentlich bequemer, 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 \\\`\``