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?
shell
command-line
command-substitution
Tshepang
quelle
quelle
Antworten:
Die Backquotes im alten Stil
` `
behandeln Backslashes und Nesting etwas anders. Der neue Stil$()
interpretiert alles dazwischen( )
als Befehl.funktioniert, wenn die geschachtelten Anführungszeichen maskiert sind:
Backslash-Spaß:
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 :)quelle
{ }
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.
undsource
Synonyme.quelle
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ützensource
(und nicht.
) obwohl.$()
funktioniert nicht mit alter Bourne-Shell. Aber es istJahreJahrzehnte her, seit ich mit der alten Bourne-Shell gearbeitet habe.quelle
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.
quelle
$()
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:
Die Ausgabe lautet:
foo bar
.Weitere Informationen finden Sie im Folgenden: https://stackoverflow.com/a/12797512 (Beachten Sie auch die Kommentare unter diesem Beitrag.)
quelle
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 :
ist einfacher zu tippen und zu debuggen als:
quelle