Ist die Notation in eckigen Klammern in Bash-Skripten besser als Anführungszeichen?

352
alle_meije

Als ich das Schreiben von Bash-Skripten lernte, habe ich die Ausgabe eines Befehls in eine Variable geschrieben und dabei Anführungszeichen verwendet, z .

ALLPDFS=`find . -name \*.\[pP\]\[dD\]\[fF\]` 

Die meisten "offiziellen" Skripts (die in Linux-Paketen heruntergeladenen usw. ) verwenden jedoch die Notation mit dem Dollarzeichen und den Klammern:

ALLPDFS=$(find . -name \*.\[pP\]\[dD\]\[fF\]) 

Gibt es einen guten Grund, sich für den anderen zu entscheiden? Ich denke, dass die zweite eher mit der anderen Bash-Syntax übereinstimmt. Für das Timing habe ich es versucht

time for (( i=0; i<10; i++ )); do a=`find . -name \*.\[pP\]\[dD\]\[fF\]`; done time for (( i=0; i<10; i++ )); do a=$(find . -name \*.\[pP\]\[dD\]\[fF\]); done 

und es macht keinen Unterschied. Ist einer vielleicht besser für Stack / Heap-Nutzung?

0
https://stackoverflow.com/questions/22709371/backticks-vs-braces-in-bash oliv vor 5 Jahren 1
Vielen Dank! interessant - Antwort auf eine andere Frage mit anderer Terminologie im falschen Forum ... alle_meije vor 5 Jahren 0
Siehe [BashFAQ # 82: Warum wird $ (...) gegenüber \ `... \` (Backticks) bevorzugt?] (Http://mywiki.wooledge.org/BashFAQ/082). Gordon Davisson vor 5 Jahren 0

1 Antwort auf die Frage

4
choroba

$() Notation wird bevorzugt, wenn Sie sie verschachteln müssen, dh Sie können schreiben

echo $(echo $(echo 123)) 

aber das Äquivalent ``wäre

echo `echo \`echo 123 \`` 

Das Öffnen und Schließen von Klammern ist unterscheidbar, so dass kein Backslash erforderlich ist.

Vielen Dank! Ja, ich denke, das Verschachtelungsargument reicht aus, um den Deal abzuschließen. alle_meije vor 5 Jahren 0
@alle_meije Backticks haben auch einige seltsame Auswirkungen auf andere, mit Escapezeichen versehene Charaktere im Backticked-Befehl. Im Wesentlichen fügt es einen weiteren Verarbeitungsschritt für das Parsen der Fluchten hinzu, so dass Fluchten (Backslashes) darin verdoppelt werden müssen. In verschachtelten Backticks müssten sie vervierfacht werden. `$ ()` vermeidet all diesen Unsinn. Gordon Davisson vor 5 Jahren 0