2017-12-20 7 views
2

Ich versuche, herauszufinden, wie sich die onelinerEine Zeile Einstellung Umgebungsvariable und Befehl ausführen, bekam diffferent Ergebnisse in sh und bash

var=value command 

tatsächlich in sh arbeitet. Ich erwarte, dass variable var an die Umgebung von command weitergegeben werden, sollte aber nicht in der aktuellen Umgebung vorhanden ist (bitte nicht Hinweis am Ende weglassen!)

Zuerst versuchen sie es in bash

#bash 
$ var=  #just to be sure it's empty 
$ var=value echo something 
. something 
$ echo "$var" 
. 

$ var=value set something 
$ echo "$var" 
. 

Für jetzt funktioniert es wie erwartet. Aber wenn wir den gleichen Eingang an sh und erneut eingeben zu gehen, wird es so sein:

#sh 
$ var= 
$ var=value echo something 
. something 
$ echo "$var" 
. 

$ var=value set something 
$ echo "$var" 
. value 

Und die letzte unterscheidet. Ist set Befehl eine Art Spezialfall für SH? Warum wurde die Variable var in unserer aktuellen Umgebung gespeichert?

Haftungsausschluss: Ich weiß, dass echo und set Schale sind eingebaut in die und somit Umgebungsvariablen wir sie durch var=value command passieren verschwendet werden, aber meine Frage ist nur über die Syntax. Ich meine, sie sollten verschwendet worden sein, aber in sh, wenn set eingegeben wurde, wurde die Variable irgendwie in die aktuelle Umgebung übergeben.

Antwort

5

set ist ein "special" eingebaut, wie in der POSIX-Spezifikation definiert.

Wie in Einfache Befehle beschrieben, bleiben Variablenzuweisungen, die dem Aufruf eines speziellen integrierten Dienstprogramms vorausgehen, nach Abschluss des integrierten Befehls wirksam; Dies ist bei einem normalen eingebauten oder anderen Dienstprogramm nicht der Fall.

Also in diesem Fall ist bash tatsächlich in Verletzung der POSIX-Spezifikation. Im POSIX-Modus ausgeführt, verhält es sich jedoch genauso wie sh:

$ bash --posix 
$ var=value set something 
$ echo $var 
value 
+0

Ausgezeichnete Antwort. Nur neugierig: Können Sie sich einen Grund vorstellen, warum dieses Sonderfallverhalten eine gute Idee ist? Das gleiche Ergebnis könnte ohne einen speziellen Fall über 'var = value; etwas setzen. – John1024

+0

Ich bin nicht wirklich sicher, warum sie die Shell beeinflussen müssen. Ich möchte nur darauf hinweisen, dass die als spezielle Einbauten klassifizierten Befehle eingebaut sein müssen, da sie Befehle sind, die sich auf die Shell auswirken und nicht nur optional für die Effizienz eingebaut sind. Daher ist es nicht wirklich sinnvoll, wenn Zuweisungen temporär sind, da niemals ein separater Befehl ausgeführt wird. – chepner

Verwandte Themen