Was ist der Unterschied zwischen $(Kommando) und `Kommando` in der shell Programmierung?
Speichern Sie die Ausgabe eines Befehls als variable in sh/ksh/bash, die Sie tun können, entweder
var=$(command)
oder
var=`command`
Was ist der Unterschied wenn überhaupt zwischen den beiden Methoden?
Bitte siehe BashFAQ/082.
Finden Sie die verschachtelte Ausgabe detailliert in der Git-Coding-Guideline: siehe meine Antwort unten.
Verwandte: unix.stackexchange.com/questions/126927
Finden Sie die verschachtelte Ausgabe detailliert in der Git-Coding-Guideline: siehe meine Antwort unten.
Verwandte: unix.stackexchange.com/questions/126927
InformationsquelleAutor hhafez | 2011-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den backticks/gravemarks, wurden verworfen zugunsten von
$()
für Befehls-substitution, weil$()
können leicht nest in sich selbst als in$(echo foo$(echo bar))
. Es gibt auch andere Unterschiede, wie backslashes interpretiert wird, in der " backtick/gravemark-version, etc.Sehen BashFAQ/082 aus mehreren Gründen immer zu bevorzugen die $ ( ... ) - syntax.
Siehe auch die POSIX Skillung für detaillierte Informationen über die verschiedenen Unterschiede.
$(...)
– es nur Hinweise, Sie als alternativen.POSIX kann nicht sagen, dass das Wort nicht aber er sagt
"the backquoted variety of command substitution is not recommended"
welche nur eine langatmige Art zu sagen, veraltet IMHOPOSIX nicht aufgelassen backticks,sondern zusätzliche
$(...)
als eine alternative Methode. Es gibt keine bekannte Umsetzung bug mit backticks, aber es gibt viele bekannte Umsetzung bugs mit$(...)
. Also für Portabilität Fragen, die er empfohlen ist die Verwendung von backticks für nicht-geschachtelte Aufrufe.$(...)
braucht eine rekursive parser, aber das war nicht mit ksh86, erläutert die Funktion. Check in-ulm.de/~mascheck/various/cmd-subst für eine Liste mit korrekten Implementierungen. Eine konforme shell muss unterstützen alle Fälle, ausgenommen den Fall D. 2.Es gibt andere Dinge, die in POSIX, müssen gesehen werden als
deprecated
z.B. die Anwendung vonwaitpid()
verhindert, dass Sie sehen den vollen 32-bits aus derexit()
parameter, aber alle Schalen außer der letzten Bourne-Shell noch verwendenwaitpid()
statt derwaitid()
nennen, der jetzt seit 26 Jahren.Der link in der Antwort Hinweise darauf, dass es einige Unterschiede zwischen den backticks und
$()
, die mehr erklärt in diesem Teil der Dokumentation. Die Unterschiede nicht nur über die Verschachtelung.InformationsquelleAutor SiegeX
Verhalten Sie sich gleich. Der syntaktische Unterschied ist: es ist einfacher, nest
$()
als``
:vs.
echo $(echo \$abc)
ist nicht das gleiche wieecho `echo \$abc`
- Unterschiede gibt es auch für$(echo \`)
und$(echo \\)
InformationsquelleAutor John Kugelman
Wenn die älteren back-tick-form verwendet wird, backslash behält seine wörtliche Bedeutung, außer wenn gefolgt von $,`, " oder \. Die erste back-tick nicht mit einem vorangestellten backslash beendet die Kommando-substitution.
Wenn mit den neueren
$(command)
form, alle Zeichen zwischen den Klammern machen, bis der Befehl; keine speziell behandelt werden.Beide Formen können geschachtelt werden, aber der zurück-tick Vielfalt erfordert das folgende Formular aus.
Als Gegensatz zu:
$()
version sind POSIX-konform.Notiert und aktualisiert werden, vielen Dank.
InformationsquelleAutor ocodo
Juli 2014: Die commit f25f5e6 (von Elia Pinto (
devzero2000
), April 2014, Git 2.0) ergänzt die nesting-Problem:Deshalb ist die git/Dokumentation/CodingGuidelines erwähnt:
thiton kommentiert:
Update Januar 2016: Git 2.8 (März 2016) entledigt backticks ganz.
Sehen commit ec1b763, commit 9c10377, commit c7b793a, commit 80a6b3f, commit 9375dcf, commit e74ef60, commit 27fe43e, commit 2525c51, commit becd67f, commit a5c98ac, commit 8c311f9, commit 57da049, commit 1d9e86f, commit 78ba28d, commit efa639f, commit 1be2fa0, commit 38e9476, commit 8823d2f, commit 32858a0, commit cd914d8 (12 Jan 2016) von Elia Pinto (
devzero2000
).(Zusammengefasst von Junio C Hamano --
gitster
-- in commit e572fef, 22 Jan 2016)Vom Git 2.8 ab, es ist alles
$(...)
nicht mehr`...`
.$()
ist auch POSIX-angegeben-ein Zitat, das beschreibt, backticks als "POSIX-unterstützt" in einer solchen Weise zu implizieren, dass dies ist einzigartig, Sie ist irreführend. Es ist nur (1970s-era), pre-POSIX Bourne, wo backticks sind die einzige unterstützte syntax.InformationsquelleAutor VonC
Gibt es kaum einen Unterschied, außer dem, was unescaped Zeichen, die Sie verwenden können innerhalb des Befehls. Sie können sogar ` ... ` - Befehle in $ ( ... ) (und Umgekehrt) für einen komplizierteren zwei-Niveau-deep command-substitution.
Es ist eine etwas andere interpretation der umgekehrte Schrägstrich " /" - operator. Unter anderem, wenn die Schachtelung `...` substitution Befehle, müssen Sie die Flucht der inneren ` Zeichen mit \, in der Erwägung, dass mit $() substition versteht es die Verschachtelung automatisch.
InformationsquelleAutor DigitalRoss
"Was ist der Unterschied wenn überhaupt zwischen den beiden Methoden?"
Machen, die Aufmerksamkeit auf dieses Verhalten:
Bekommst du diese Ergebnisse:
InformationsquelleAutor Hiro