Verwenden von Backticks oder Dollar in Shell-Skripten

9

Ich bin damit beschäftigt, ein Shell-Skript (mit Bash) zu schreiben, in dem ich eine Variable aus dem zurückgegebenen Ergebnis eines anderen Befehls füllen muss.

Ich verwende also eine Syntax wie diese:

VAR=`command 2>/dev/null`

Bei der Suche nach Informationen zu Skript-Shells stellte ich jedoch häufig fest, dass das oben Genannte auch mit der folgenden Syntax erreicht werden kann:

VAR=$(command 2>/dev/null)

Beide arbeiten für mich (ich habe in beiden Fällen das erwartete Ergebnis erhalten) und ich frage mich daher, ob ich beide Formulare noch austauschbar verwenden kann oder ob ich mich an ein Formular halten muss, um sicherzugehen, dass ich mit der zukünftigen Entwicklung von kompatibel bin Shell?

Justin
quelle
Die Links von belacqua bieten viele Informationen über die Unterschiede und die Verwendung. Schließen, da es sich nicht um ein Ubuntu-Problem handelt, sondern eher um ein Programmierproblem. Ich empfehle dringend, den oben genannten Links zu folgen.
Luis Alvarado

Antworten:

13

Verwenden Sie Dollar. Backticks sind teilweise veraltet , da ihre Verwendung komplizierter ist (siehe Link) und sie keine Vorteile bieten, es sei denn, Sie spielen Code-Golf und müssen unbedingt einen einzelnen Charakter speichern. Sie werden wahrscheinlich nicht so schnell aus beliebten Muscheln entfernt, sodass Sie beide vorerst sicher verwenden können.

l0b0
quelle
3

Halten Sie sich an die Dollarzeichen-Notation, $()wann immer Sie können. Backticks werden umständlich / verwirrend, wenn Sie verschachtelte Zitate erstellen müssen. Ex:

$ FOO=`echo "foo's"`
$ echo $FOO
foo's

Das Ersetzen der Backticks durch $()die gleichen Ergebnisse führt zu derselben Ausgabe und ist leichter zu lesen (weniger Anführungszeichen für verschiedene Winkel):

$ FOO=$(echo "foo's")
$ echo $FOO
foo's

Das und jedes Anführungszeichen (einfaches Anführungszeichen, doppeltes Anführungszeichen, Backtick) bedeutet etwas anderes in der Shell, sodass die Verwendung von $ dazu beitragen kann, ein Maß an Komplexität zu beseitigen. Und der Entwickler, der Ihnen folgt, wird es Ihnen danken, denn es fällt ihm leichter, herauszufinden, was Sie getan haben.

Aaron
quelle
Backticks können nicht einmal funktional verschachtelt werden.
Bernhard
@Bernhard Mein Beispiel zeigt, was ich mit dieser Aussage vorhatte.
Aaron