it-swarm.com.de

Befehlsersetzung: Backticks oder Dollarzeichen / Paren beigelegt?

Was ist die bevorzugte Methode für die Befehlsersetzung in Bash?

Ich habe es immer so gemacht:

echo "Hello, `whoami`."

Aber in letzter Zeit habe ich es oft so geschrieben gesehen:

echo "Hello, $(whoami)."

Was ist die bevorzugte Syntax und warum? Oder sind sie so ziemlich austauschbar?

Ich neige dazu, die erste zu bevorzugen, einfach weil mein Texteditor zu wissen scheint, was es ist, und die Syntax-Hervorhebung entsprechend ausführt.

Ich lese hier , dass maskierte Zeichen in jedem Fall ein bisschen anders handeln, aber mir ist nicht klar, welches Verhalten vorzuziehen ist oder ob es nur von der Situation abhängt.

Nebenfrage: Ist es üblich, beide Formulare in einem Skript zu verwenden, zum Beispiel beim Verschachteln von Befehlsersetzungen?

154
Dagg Nabbit

Es gibt hier mehrere Fragen/Probleme, daher wiederhole ich jeden Abschnitt des Texts des Posts, in Blockzitaten und gefolgt von meiner Antwort.

Was ist die bevorzugte Syntax und warum? Oder sind sie so ziemlich austauschbar?

Ich würde sagen, dass das $(some_command) -Formular dem `some_command` -Formular vorgezogen wird. Die zweite Form, die ein Paar Anführungszeichen verwendet (das "` "-Zeichen, auch Backtick und ein Grab-Akzent genannt), ist die historische Methode, um dies zu tun. Das erste Formular, in dem Dollarzeichen und Klammern verwendet werden, ist ein neueres POSIX-Formular, was bedeutet, dass es wahrscheinlich eine Standardmethode ist. Ich denke, dass dies wiederum bedeutet, dass es wahrscheinlicher ist, mit verschiedenen Shells und mit verschiedenen * nix-Implementierungen korrekt zu arbeiten.

Ein weiterer Grund für den Vorzug des ersten (POSIX-) Formulars ist, dass es einfacher zu lesen ist, insbesondere wenn Befehlsersetzungen verschachtelt sind. Beim Backtick-Formular müssen die Backtick-Zeichen in den verschachtelten (inneren) Befehlsersetzungen mit einem Backslash versehen werden.

Mit dem POSIX-Formular müssen Sie das nicht tun.

Was die Frage betrifft, ob sie austauschbar sind, würde ich sagen, dass sie im Allgemeinen austauschbar sind, abgesehen von den Ausnahmen, die Sie für maskierte Zeichen erwähnt haben. Ich weiß jedoch nicht und kann nicht sagen, ob alle modernen Shells und alle modernen * Nixe beide Formen unterstützen. Ich bezweifle, dass dies der Fall ist, insbesondere bei älteren Shells/älteren * Nixen. Wenn ich Sie wäre, würde ich nicht auf Austauschbarkeit angewiesen sein, ohne zuerst ein paar schnelle, einfache Tests jedes Formulars für Shell/* nix-Implementierungen durchzuführen, auf denen Sie Ihre fertigen Skripts ausführen möchten.

Ich neige dazu, die erste zu bevorzugen, einfach weil mein Texteditor zu wissen scheint, was es ist, und die Syntax-Hervorhebung entsprechend ausführt.

Leider scheint Ihr Editor das POSIX-Formular nicht zu unterstützen. Vielleicht sollten Sie überprüfen, ob es ein Update für Ihren Editor gibt, das die POSIX-Methode unterstützt. Long Shot vielleicht, aber wer weiß? Oder vielleicht sollten Sie sogar einen anderen Editor ausprobieren.

GGG, welchen Texteditor benutzt du ???

Ich habe hier gelesen, dass maskierte Zeichen in jedem Fall ein bisschen anders handeln, aber mir ist nicht klar, welches Verhalten vorzuziehen ist oder ob es nur von der Situation abhängt.

Ich würde sagen, das hängt davon ab, was Sie erreichen wollen. mit anderen Worten, ob Sie maskierte Zeichen zusammen mit der Befehlsersetzung verwenden oder nicht.

Nebenfrage: Ist es üblich, beide Formulare in einem Skript zu verwenden, beispielsweise beim Verschachteln von Befehlsersetzungen?

Nun, es könnte das Lesen des Skripts etwas erleichtern (typografisch gesprochen), aber es ist schwieriger zu verstehen! Jemand, der Ihr Drehbuch liest (oder SIE, der es sechs Monate später liest!), Würde sich wahrscheinlich fragen, warum Sie sich nicht einfach an das eine oder andere Formular gehalten haben - es sei denn, Sie haben in den Kommentaren eine Notiz darüber gemacht, warum Sie dies getan haben. Wenn Sie beide Formulare in einem Skript mischen, ist die Wahrscheinlichkeit geringer, dass das Skript portierbar ist: Damit das Skript ordnungsgemäß funktioniert, muss die Shell, die es ausführt, BEIDE Formulare unterstützen, nicht nur das eine oder das andere Formular.

Um ein Shell-Skript verständlich zu machen, würde ich es persönlich vorziehen, in jedem Skript an der einen oder anderen Form festzuhalten, es sei denn, es gibt einen guten technischen Grund, etwas anderes zu tun. Außerdem würde ich das POSIX-Formular dem älteren Formular vorziehen. es sei denn, es gibt einen guten technischen Grund, etwas anderes zu tun.

Weitere Informationen zum Thema der Befehlsersetzung und den zwei verschiedenen Methoden für die Befehlsersetzung finden Sie im Abschnitt zur Befehlsersetzung im O'Reilly-Buch "Classic Shell Scripting", zweite Ausgabe, von Robbins und Beebe. In diesem Abschnitt geben die Autoren an, dass das POSIX-Formular für die Befehlsersetzung "für alle Neuentwicklungen empfohlen wird". Ich habe kein finanzielles Interesse an diesem Buch; Es ist nur eines, das ich über Shell-Skripte habe (und liebe), obwohl es eher für mittelschwere oder fortgeschrittene Shell-Skripte gedacht ist und nicht für den Anfang von Shell-Skripten.

-B.

152
Bruce Brown

Sie können die Unterschiede zu bash manual ablesen. In den meisten Fällen sind sie austauschbar.


Eine Sache zu erwähnen ist, dass Sie backquote entkommen sollten, um Befehle zu verschachteln:

$ echo $(echo hello $(echo Word))
hello Word    

$ echo `echo hello \`echo Word\``
hello Word

41
kev

Die Backticks sind mit alten Shells kompatibel, daher sollten Skripte, die portierbar sein müssen (wie GNU autoconf snippets)), diese bevorzugen.

Die $() -Form ist etwas augenschonender, insb. nach ein paar Ebenen der Flucht.

8
phs