¿Qué caracteres están permitidos en los nombres de variables de entorno de Linux? Mi búsqueda superficial de páginas de manual y la web solo produjo información sobre cómo trabajar con variables, pero no qué nombres están permitidos.
Tengo un programa Java que requiere una variable de entorno definida que contiene un punto, como com.example.fancyproperty
. Con Windows puedo configurar esa variable, pero no tuve suerte configurándola en Linux (probado en SuSE y Ubuntu). ¿Se permite incluso ese nombre de variable?
linux
syntax
environment-variables
Christian Semrau
fuente
fuente
-D
opción de línea de comando), por lo que funciona ahora. Obviamente, el programa se ve en ambos conjuntos de variables sin decirme. Pero aún tengo curiosidad sobre qué nombres de variables de entorno están permitidos.com_example_fancyproperty
yCOM_EXAMPLE_FANCYPROPERTY
.Respuestas:
Del grupo abierto :
Por lo tanto, los nombres pueden contener cualquier carácter excepto = y NUL, pero:
Entonces, aunque los nombres pueden ser válidos, es posible que su shell no admita nada más que letras, números y guiones bajos.
fuente
[a-zA-Z_][a-zA-Z0-9_]*
(lo que sugiere implícitamente que este formulario es más sensato), pero la especificación real (cita 1) requiere que toda la implementación admita cualquier cosa menos=
yNUL
?La sección de estándares POSIX en shells de IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Shell y herramientas estándar no define la convención léxica para nombres de variables, sin embargo, una mirada superficial a la fuente revela que usa algo similar a
[a-zA-Z_]+[a-zA-Z0-9_]*
(Editar: Se agregó subrayado perdido en la segunda clase de caracteres).
Una nota rápida, ya que algunos shells no admiten el + en la expresión regular, una expresión regular potencialmente más portátil puede ser:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
fuente
[a-zA-Z_][a-zA-Z0-9_]*
Para aquellos como yo que encuentran la referencia a bash-4.1 un poco vaga (616'000 líneas de código), aquí hay algunos consejos para encuentre las líneas de código relevantes:subst.c: param_expand(), in the default case
->general.h:
/ * Defina exactamente en qué consiste un identificador de shell legal. * / #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
.Mi prueba rápida mostró que básicamente siguen las mismas reglas que los nombres de variables C, es decir
_
y 0-9Entonces esto excluye
.
dentro de ellos. Cualquier nombre de variable ilegal se acredita conunknown command
.Esto se probó en ZSH, que es principalmente compatible con BASH.
fuente
Depende de lo que quieras decir con 'permitido'.
Ignorando Windows para el nonce:
El entorno es una serie de cadenas, pasadas a la función principal de un programa. Si lee execve (2), no verá requisitos o límites en estas cadenas que no sean terminación nula.
Por convención, cada cadena consta de NOMBRE = valor. No existe una convención de citas, por lo que no puede tener un '=' en el nombre de esta convención.
Los humanos normales establecen estas cadenas discutiéndolas con su caparazón. Cada shell tiene sus propias ideas de lo que son variables NAME válidas, por lo que debe leer la página del manual del shell del momento para ver qué piensa.
En general, cosas como com.baseball.spit = fleagh son propiedades del sistema Java, y si algún programa Java está dispuesto a recurrir al entorno, es mejor especificarlos con -D.
fuente
Depende de la cáscara. Supongo que está usando bash de forma predeterminada, en cuyo caso se permiten letras, números y guiones bajos, pero no puede comenzar el nombre de la variable con un número. A partir de Bash v.3, no se permiten puntos dentro de los nombres de variables .
fuente
SI, PUEDES HACERLO.
Usa
exec
yenv
ordena para implementar esta escena.Dispositivo de prueba en Docker
Ejecutar comando en contenedor:
Verifique las variables de entorno:
Use
ps aux
para verificar que el PID no haya cambiadoUse
python
para verificar la variable de entornoSALIDA es
happy-variable-name
.¿Qué ocurre?
De otra manera
Si está usando docker, puede establecer variables en Dockerfile
Si está utilizando kubernetes, puede configurar variables mediante ConfigMap
test.yaml
Implementar pod
kubectl apply -f test.yaml
Verificar
kubectl logs foobar
salida:ConfigMap permite '-', '_' o '.'
fuente
Si bien la mayoría de los shell no permitirán establecer variables de entorno (como se menciona en otras respuestas), si lo necesita, puede ejecutar otros programas con variables de entorno no estándar utilizando
env(1)
.Por ejemplo, borrar todo el entorno y establecer el
Strange.Env:Var
valorfoo
, y ejecutar el programa perl que lo imprime:imprimirá
fuente