Welche Zeichen sind in Linux-Umgebungsvariablennamen zulässig? Meine flüchtige Suche in Manpages und im Web ergab nur Informationen darüber, wie mit Variablen gearbeitet wird, nicht jedoch, welche Namen zulässig sind.
Ich habe ein Java-Programm, das eine definierte Umgebungsvariable benötigt, die einen Punkt enthält, wie z com.example.fancyproperty
. Unter Windows kann ich diese Variable einstellen, aber ich hatte kein Glück, sie unter Linux einzustellen (versucht in SuSE und Ubuntu). Ist dieser Variablenname überhaupt erlaubt?
linux
syntax
environment-variables
Christian Semrau
quelle
quelle
-D
Befehlszeilenoption deklariert wurde) genauso zufrieden ist , sodass es jetzt funktioniert. Offensichtlich sieht das Programm in beiden Variablensätzen aus, ohne es mir zu sagen. Trotzdem bin ich gespannt, welche Umgebungsvariablennamen zulässig sind.com_example_fancyproperty
undCOM_EXAMPLE_FANCYPROPERTY
.Antworten:
Aus der offenen Gruppe :
Namen können also beliebige Zeichen außer = und NUL enthalten, aber:
Während die Namen möglicherweise gültig sind, unterstützt Ihre Shell möglicherweise nur Buchstaben, Zahlen und Unterstriche.
quelle
[a-zA-Z_][a-zA-Z0-9_]*
(implizit bedeutet dies, dass dieses Formular vernünftiger ist), aber die tatsächliche Spezifikation (Anführungszeichen 1) erfordert, dass die gesamte Implementierung alles andere als unterstützt=
undNUL
?Der Abschnitt POSIX-Standards für Shells von IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Der Shell- und Tools-Standard definiert die lexikalische Konvention für Variablennamen nicht. Ein flüchtiger Blick auf die Quelle zeigt jedoch, dass etwas Ähnliches verwendet wird
[a-zA-Z_]+[a-zA-Z0-9_]*
(Bearbeiten: Fehlender Unterstrich in der 2. Zeichenklasse hinzugefügt.)
Ein kurzer Hinweis: Da einige Shells das + in Regex nicht unterstützen, kann ein möglicherweise portablerer Regex sein:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
quelle
[a-zA-Z_][a-zA-Z0-9_]*
Für diejenigen wie mich, die den Verweis auf bash-4.1 etwas vage finden (616'000 Codezeilen), sind hier einige Hinweise Suchen Sie die relevanten Codezeilen:subst.c: param_expand(), in the default case
->general.h:
/ * Definieren Sie genau, woraus eine legale Shell-ID besteht. * / #define legal_variable_starter (c) (ISALPHA (c) || (c == ' ')) #define legal_variable_char (c) (ISALNUM (c) || c == ' ')a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit
.Meine schnellen Tests haben gezeigt, dass sie grundsätzlich den gleichen Regeln folgen wie C-Variablennamen, nämlich
_
und 0-9Das schließt also
.
in ihnen aus. Jeder unzulässige Variablenname wird gutgeschriebenunknown command
.Dies wurde in ZSH getestet, das größtenteils BASH-kompatibel ist.
quelle
Kommt darauf an, was du mit "erlaubt" meinst.
Windows für das Nonce ignorieren:
Die Umgebung ist ein Array von Zeichenfolgen, die an die Hauptfunktion eines Programms übergeben werden. Wenn Sie execve (2) lesen, werden für diese Zeichenfolgen keine anderen Anforderungen oder Einschränkungen als die Nullterminierung angezeigt.
Konventionell besteht jede Zeichenfolge aus NAME = Wert. Es gibt keine Anführungszeichenkonvention, daher kann der Name in dieser Konvention kein '=' enthalten.
Normale Menschen setzen diese Fäden, indem sie sie mit ihrer Hülle besprechen. Jede Shell hat ihre eigenen Vorstellungen von gültigen variablen NAMEs. Sie müssen also die Manpage für die aktuelle Shell lesen, um zu sehen, was sie denkt.
Im Allgemeinen sind Dinge wie com.baseball.spit = fleagh Java-Systemeigenschaften. Unabhängig davon, ob ein Java-Programm bereit ist, auf die Umgebung zurückzugreifen, ist es besser, sie mit -D anzugeben.
quelle
Es kommt auf die Schale an. Ich vermute, Sie verwenden standardmäßig Bash. In diesem Fall sind Buchstaben, Zahlen und Unterstriche zulässig, aber Sie können den Variablennamen nicht mit einer Zahl beginnen. Ab Bash v.3 sind Punkte innerhalb von Variablennamen nicht mehr zulässig .
quelle
Ja, Sie können es tun.
Verwenden Sie
exec
undenv
Befehl, um diese Szene zu implementieren.Testvorrichtung in Docker
Befehl im Container ausführen:
Umgebungsvariablen überprüfen:
Verwenden Sie
ps aux
diese Option, um zu überprüfen, ob die PID nicht geändert wurdeVerwenden Sie
python
diese Option, um die Umgebungsvariable zu überprüfenAUSGABE ist
happy-variable-name
.Was ist los?
Ein anderer Weg
Wenn Sie Docker verwenden, können Sie in Dockerfile eine Variable festlegen
Wenn Sie Kubernetes verwenden, können Sie die Variable über ConfigMap festlegen
test.yaml
Pod bereitstellen
kubectl apply -f test.yaml
kubectl logs foobar
Ausgabe überprüfen :ConfigMap erlaubt '-', '_' oder '.'
quelle
Während die meisten Shell das Festlegen von Umgebungsvariablen nicht zulassen (wie in anderen Antworten erwähnt), können Sie bei Bedarf andere Programme mit nicht standardmäßigen Umgebungsvariablen ausführen
env(1)
.Löschen Sie beispielsweise die gesamte Umgebung, setzen Sie
Strange.Env:Var
den Wertfoo
und führen Sie das Perl-Programm aus, das ihn druckt:wird gedruckt
quelle