2017-01-04 2 views
1

Ich dachte immer, ich Anführungszeichen um $() in bash setzen müssen, wie in:

FOO="$(echo "bar baz")" 

aber anscheinend ist dies nicht notwendig, mindestens während variable Zuordnung:

$ FOO=$(echo "foo  bar") 
$ echo "$FOO" 
foo  bar 

Wenn ich dagegen versuche, einer Variablen mehrere Wörter zuzuweisen, erhalte ich eine Fehlermeldung, weil sie als "Variable für Dauer des nachfolgenden Befehls einstellen" interpretiert wird:

$ FOO=bar  fooooo 
fooooo: command not found 

Auch, wenn ich nur $() verwenden, ohne Anführungszeichen in Nicht-Zuordnung Kontext, sind sie wieder als getrennte Wörter behandelt:

$ echo $(echo "baa beee") 
baa beee 

Also, was sind die Regeln bezüglich $() und "" Interaktion und wie sicher ist die Nicht-Quote-Variante? Ich wäre besonders dankbar für Manpage-Zitate oder andere maßgebliche Referenzen. Gibt es hier auch "gute Praxis/Stil"?

+0

Danke für die Verknüpfung der Duplikate! Ich konnte keinen selbst finden. – akavel

Antwort

4

Kurz gesagt, Zitate sind notwendig, um ansonsten normales Verhalten zu unterdrücken. In den meisten Kontexten müssen Sie die Befehlsersetzung angeben, um die Worttrennung und die Pfadnamenerweiterung zu unterdrücken.

Aus der Manpage unter „Befehl Substitution“:

If the [command] substitution appears within double quotes, word 
splitting and pathname expansion are not performed on the results. 

jedoch die rechte Seite einer Zuweisung ist nicht eines dieser Kontexte. Von der Manpage unter "PARAMETERS":

A variable may be assigned to by a statement of the form 

       name=[value] 

If value is not given, the variable is assigned the null string. All values 
undergo tilde expansion, parameter and variable expansion, command substitution, 
arithmetic expansion, and quote removal (see EXPANSION below). 

Beachten Sie, dass weder Wortaufspaltung noch Pfadnamenerweiterung erwähnt werden.

In der Regel im Zweifelsfall eine Erweiterung angeben. Die Zeiten, in denen Sie Word-Splitting und Pfadnamen Expansion einer Erweiterung wollen, sind selten und in der Regel offensichtlich.