2009-01-19 44 views
10

Die Frage ist so einfach wie im Titel angegeben: Was ist der Unterschied zwischen den folgenden beiden Ausdrücken?

$(...) 
`...` 

Zum Beispiel sind die beiden Variablen test1 und test2 anders?

test1=$(ls) 
test2=`ls` 
+0

@theman: Danke für den "aufschlussreichen" Kommentar. –

+0

Bitte beachten Sie, dass dies nicht nur Bash ist. Dies funktioniert in ksh und einfach alt sh (auch in sh, das ist nicht bash verkleidet). – dwc

Antwort

9

Das Ergebnis ist das gleiche, aber die neuere Syntax $() ist viel klarer und einfacher zu lesen. Zumindest doppelt so, wenn man versucht zu nisten. Die Verschachtelung ist mit der alten Syntax nicht einfach, funktioniert aber gut mit der neuen.

vergleichen:

$ echo $(ls $(pwd)) 

gegen:

$ echo `ls \`pwd\`` 

Sie müssen die eingebetteten Backticks zu entkommen, so dass es viel komplizierter sowohl Typen ganz ist und lesen.

Laut this page gibt es mindestens einen kleinen Unterschied in der Behandlung eingebetteter doppelter Backslashes.

+2

Die Verschachtelung * ist * mit der Backtick-Syntax möglich, sie erfordert nur viele Backslashes und wird schnell fast unlesbar. Vor allem, wenn Sie andere Arten von Anführungszeichen mischen. – hobbs

+0

@hobbs Danke, das habe ich wahrscheinlich nicht bemerkt. Ich habe die Antwort bearbeitet. – unwind

5

Vielleicht möchten man bash lesen:

Wenn die alten Stil Backquote Form der Substitution verwendet wird, Backslash behält seine wörtliche Bedeutung, außer wenn sie von $ gefolgt, `, oder. Das erste Backquote, dem kein Backslash vorangestellt ist, beendet die Befehlsersetzung. Bei Verwendung der $ (Befehl) -Form bilden alle Zeichen zwischen den Klammern den Befehl; keine werden speziell behandelt.

Das ist unter dem "Command Substitution" Abschnitt der Hilfeseite.

5

Mit `` `ist die historische Syntax, POSIX hat die jetzt Standard` $ (...) Syntax angenommen. Siehe Section 2.6.3

+0

Interessant. Ich dachte immer, dass die $() - Syntax eine reine Bash-Addition war (eine sehr schöne, aber). –

+0

Ich sah es zum ersten Mal in ksh, damals im Jahr 1992, bevor ich Bash einmal benutzt hatte. – Vatine

+0

Es wird allgemein angenommen, dass $() bash-spezifisch ist, aber das liegt daran, dass vim die Syntax nicht wie in POSIX hervorhebt, sondern die ursprüngliche Shell-Syntax verwendet, die heute von sehr wenigen Menschen programmiert wird. Um Vim zu sagen, sinnvolle Syntaxhervorhebung für Shell-Skripte zu verwenden, setze dies in deine .vimrc let g: is_posix = 1 – pixelbeat

Verwandte Themen