Gibt es einen Grund, die Substitution für Neuentwicklungen zu verwenden oder zu lehren?


16

Ich verstehe, dass die modernere $(...)Befehlssubstitutionssyntax der altbasierten Syntax vorgezogen wird `, da die Verschachtelung und die Escape-Syntax einfacher und weniger fehleranfällig sind.

Außerdem scheinen die meisten /bin/shMuscheln im modernen Gebrauch Folgendes zu unterstützen $(…):

  • Bash
  • ash (und damit BusyBox, also die meisten Embedded Linux)
  • Strich
  • FreeBSD / bin / sh

Und $(…)wird durch IEEE 1003.1 spezifiziert.

Ich habe also zwei sehr verwandte Fragen:

  • Gibt es einen Grund, `bei der Neuentwicklung von Shell-Skripten zu verwenden, es sei denn, Sie kennen ein bestimmtes altes System, auf dem das Skript ausgeführt werden muss?
  • Gibt es irgendeinen Grund, UNIX-Programmierschülern nicht nur das Schreiben beizubringen $(...)und `nur als veraltete Variante zu diskutieren , auf die sie wahrscheinlich stoßen werden, wenn sie die Shell-Skripte anderer Entwickler lesen (und die sie möglicherweise benötigen, wenn sie mit einem wirklich alten oder nicht standardmäßigen System arbeiten) aus irgendeinem Grund)?

7
Nein, es hat keinen Sinn, etwas zu benutzen oder zu lehren `...`. Es ist nur für die Abwärtsportabilität mit der Bourne-Shell vorgesehen (wie die Bourne-Shell ^(genauso wie |) für die Abwärtsportabilität mit der Thomson-Shell). Beachten Sie jedoch, dass (t)cshdies nicht der Fall ist $(...)(aber es hat auch keinen Sinn, sie zu verwenden oder zu unterrichten).
Stéphane Chazelas

2
Es ist ein Groucho Marx Sache `; {)
Goldilocks

2
Warten Sie, Backticks sind veraltet? Hat jemand eine kanonische Referenz, die erklärt, warum? (Seltsame Syntaxzeichen sind sehr schwer zu suchen.)
MathematicalOrchid

1
Einfacher zu tippen. `` - 2 Tasten drücken; $()- Shift + 4,9, Shift + 0 - 5 Tastendrücke;
Vi.

3
@ MathematicalOrchid stackoverflow.com/questions/9405478/… scheint ziemlich gut zu sein. Backticks lassen sich nur sehr schwer richtig verschachteln, insbesondere wenn zusätzliche Anführungszeichen erforderlich sind.
Michael Ekstrand

Antworten:


19

Da häufig Back-Ticks verwendet werden, ist es sinnvoll, dieses syntaktische Konstrukt zu lehren.

Natürlich $()sollte die Ersetzung von Stilbefehlen als Standardstil (und standardkonformes Konstrukt) hervorgehoben werden.

Warum sind Back-Ticks immer noch beliebt? Weil sie ein Zeichen beim Tippen speichern und das Auge weniger belasten.


18
Ich würde nicht "weniger schwer
fürs

1
Normalerweise benutze ich Backsticks in einfachen Fällen und $ () in komplexen Fällen. Bisher verwenden jedoch sehr viele Skripte die Backsticks, und die Absolventen mussten in der Lage sein, mit ihnen umzugehen.
peterh - Wiedereinsetzung von Monica am

@ jasonwryan In diesem Fall liegt der Fehler nicht an der Kürze, sondern an willkürlichen Problemen. Dh, Backticks ist auf dem Auge leichter, aber das ist nicht , warum es abgeschrieben wird. Es sei denn, Sie versuchen zu sagen, dass Zucker per definitionem schlecht ist und wir alle lieber asm für was auch immer ... Eigentlich mag ich das Aussehen $()besser, aber Backticks sind einfacher und mehr KISS; könnte pavlovian OCDish Folge der allgemeinen Programmierung sein.
Goldlöckchen

@goldilocks Sobald man älter wird, ist die Lesbarkeit sowieso viel schwieriger: Backticks sind in meinem Alter im Code praktisch unsichtbar ...
jasonwryan

3
Auf einer Französisch - Tastatur zum Beispiel `ist Altrg + è, (umständlich Typen), während $, (, )keinen Modifikator benötigen.
Stéphane Chazelas

5

Ich würde sie nicht zum Programmieren verwenden und die Verwendung der Backtick-Substitution in Shell-Skripten als veraltet zu lehren, ist in Ordnung (dies scheint der Konsens zu sein). Ich glaube jedoch nicht, dass sie von Natur aus böse sind, und (zumindest nach Ihrem durchschnittlichen Tutorial zur Linux-Befehlszeile) werden sie immer noch häufig in einfachen Snippets / Einzeilern verwendet, in denen sie wahrscheinlich nicht verschachtelt sind, und Dinge, die Sie tun werde ich nur einmal machen.

Siehe Befehlssubstitution: Backticks oder Dollarzeichen / Paren beiliegend? .


1

Ich vermeide die Verwendung des $()Konstrukts, da es nicht portabel ist - in der realen Welt. Sie haben vier Muscheln aufgelistet - es gibt viel mehr Variationen als diese (eine Größenordnung?). Versuchen Sie, Ihr Skript unter Solaris / bin / sh auszuführen, und sehen Sie, wie Sie vorgehen.

Wann hören Sie auf, alte Systeme zu unterstützen? Kannst du niemals neue Wege beschreiten? Ich denke, Sie sollten Ihrem eigenen Urteil vertrauen, und wenn Sie einen klaren Vorteil des Neuen gegenüber dem Alten sehen können, dann versuchen Sie es ... dies ist keiner von ihnen (ich persönlich finde die Bacticks viel klarer - sie können es nicht sein verwechselt mit Shell-Variablensubstitution, was eine andere Sache ist)


1
POSIX legt nicht fest, dass /bin/shdies konform sein muss. Das Solaris /bin/shist in der Tat sehr nicht konform - obwohl Solaris 9/10 / ... offiziell POSIX-konform ist. Das $()ist nur ein Konstrukt, das es nicht versteht. Aber es gibt noch viel mehr, die es nicht versteht oder anders interpretiert. Der portable Weg, um ein Conforming shdazu zu bringen, auf dem von zurückgegebenen Pfad danach zu suchen getconf PATH.
Maxschlepzig
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.