Betriebssystem : Ubuntu 16.04.3
Shell : Bash 4.3.48
Ich weiß, dass es möglich ist, den Inhalt einer Variablen wie in vorübergehend zu ändern var=value command
, was wahrscheinlich IFS= read -r var
der bemerkenswerteste Fall ist.
Und dank Gregs Wiki verstehe ich auch:
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
Was meinem Verständnis entgeht, ist folgendes:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Soweit ich weiß (und nach der Logik der vorherigen Beispiele), sollte es nicht gedruckt bar
werden (bar baz)
.
Passiert das nur mir? Ist das das beabsichtigte Verhalten und ich vermisse etwas? Oder ist das ein Bug?
export var=(foo bar); echo "${var[0]}"
es druckefoo
, nicht(foo bar)
.export
ihm zeigt:declare -ax var=([0]="foo" [1]="bar")
export i_am_array=(foo bar); /usr/bin/env | grep i_am_array
gibt hier keine Ausgabe aus.foo() { declare -p var; } ; var=(bar baz) foo
gibtdeclare -x var="(bar baz)"
Bestätigung, dass es als Zeichenfolge behandelt wird, nicht als ArrayAntworten:
Generell anrufend:
wo
cmd
ist eine funktion ist nicht portabel.Mit
bash
funktioniert dies nur für skalare Variablen (undx=(...)
wenn sie als Array analysiert, aber als Skalar zugewiesen wurden). Wenn Sie dies tun, gibt es eine Reihe von Problemen mit dem Gültigkeitsbereich. Mitksh93
undyash
funktioniert dies, aber die Variablendefinition bleibt danach erhalten. Mit erhaltenmksh
Sie einen Syntaxfehler. In der Bourne-Shell funktionierte das überhaupt nicht, auch nicht für skalare Variablen.Beachten Sie auch, dass selbst bei skalaren Variablen die Angabe, ob die Variable innerhalb der Funktion exportiert (dh an auszuführende Befehle übergeben) wird, von Shell zu Shell unterschiedlich ist (in bash, yash, mksh, zsh, aber nicht in ksh). Asche).
Es funktioniert nur so, wie Sie es erwarten
zsh
. Beachten Sie, dasszsh
Array-Indizes bei 1 beginnen.quelle
Es ist nicht nur ein Fehler, es scheint eine nicht implementierte Funktion zu sein, ohne dass dies jemals geplant ist. Dieser Mailinglisten-Beitrag aus dem Jahr 2014 hat folgende Angaben des Erstellers:
Das Ziehen aus dem neuesten Git-Repo für Bash hat dies in
variables.c
:Das Vorschlagen, was auch immer da ist, ist nicht vollständig.
quelle
execve()
Systemaufruf erforderlich ist. Siehezsh
für eine Schale , die unterstützen Funktionen mit einer Reihe Aufruf auf diese Weise vorübergehend eingestellt.my_var=one func_bar
. Können wir sagen, dass diesexport
der Umwelt zugutekommt und der Export hier unter der Haube betrieben wird? Schau dir meine Antwort an, ich habe den Demo-Code hinzugefügt.Aus der
man bash
BUGS Sektion (die Version vonbash
ist 4.3):Der nächste Code zeigt, dass eine temporäre Variable nur in der Umgebung vorhanden ist, während die Funktion ausgeführt wird. Wenn die Funktion abgeschlossen ist, verschwindet die temporäre Variable.
Verwandte Informationen:
VAR=VALUE some-command
Konstruktion.quelle