2017-03-26 4 views
1

Wenn ich eine Variable in Backticks habe, wird sie in der Shell oder in der Subshell erweitert? Zum Beispiel:Shell - Wann ist Variable in Backticks erweitert?

FOO=BAR 
BAZ=`[[ $FOO == BAR ]] && echo 1 || echo 0` 

Wird es definiert, wenn $ FOO erweitert wird? Zum Beispiel sieht die Subshell dies:

[[ $FOO == BAR ]] && echo 1 || echo 0 

oder dies:

[[ BAR == BAR ]] && echo 1 || echo 0 
+1

Verwenden Sie 'set -x', um die Reihenfolge zu sehen – Sundeep

Antwort

3

(Sie wirklich $(...) statt Backticks verwenden sollen, aber das Prinzip ist das gleiche..)

Der Befehl zur in der Subshell ausgeführt werden, besteht aus den Literalzeichen innerhalb der Befehlsersetzungsform, mit Ausnahme der idiosynkratischen und manchmal verwirrenden Regeln um Backslashes in Backticks. Die Variablenerweiterung findet also innerhalb der Subshell statt.

Zum Beispiel

x=$(foo=bar && echo $foo) 

wird x=bar definieren, aber führt nicht in foo sein (Wieder-) in der äußeren Schale definiert ist.

+0

@cdarke Sowohl'() 'und' $() 'führen ihren Inhalt in einer Untershell aus. –

+0

Sie sagen also, $ FOO' wird wörtlich wie einfache Anführungszeichen interpretiert, mit anderen Worten, ich kann 'FOO = "5 == 5 || QUX" 'nicht tun, weil die Unterschale' [[5 == 5 || QUX == BAR]] && echo 1 || echo 0' – newguy

+1

@newguy: Das ist richtig. Befehlsersetzung ist kein Ersatz für 'eval'. Aber Sie können 'eval' sicherlich verwenden, wenn Sie möchten. (Obwohl ich es nicht empfehlen würde, wenn Sie überhaupt eine Alternative haben, nicht nur, weil die Zitationsregeln Sie verrückt machen werden.) – rici