Cómo exportar una variable que tiene un punto. Recibo un 'nombre de variable no válido' cuando lo intento:
export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name
Incluso escapar del punto de metacaracteres (.) Tampoco ayudó
$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier
shell
environment-variables
ksh
usuario1587504
fuente
fuente
Respuestas:
Al menos para
bash
la página man define la sintaxis de exportación como:También define un "nombre" como:
Por lo tanto, realmente no puede definir una variable como,
my.home
ya que no es un identificador válido.Estoy muy seguro de que su ksh tiene una definición muy similar de un identificador y, por lo tanto, tampoco permite este tipo de variables. (Echa un vistazo a su página de manual).
También estoy muy seguro de que hay algún tipo de estándar general (POSIX?) Que especifica lo que está permitido como un identificador (y, por lo tanto, un nombre de variable).
Si realmente necesita este tipo de variable por alguna razón, puede usar algo como
para definirlo de todos modos. Pero, de nuevo, no podrá acceder a ella utilizando la sintaxis de shell normal. En este caso, probablemente necesite otro idioma como perl:
Por ejemplo
debería imprimir tu camino.
fuente
ANT_OPTS
o por ~ / .antrc. No hay necesidad de nombres de variables de entorno extraños para la hormiga misma.Si bien las variables de entorno pueden tener cualquier nombre (incluida la cadena vacía) que no contenga un signo igual o un byte nulo, los shells asignan las variables de entorno a las variables de shell y, en la mayoría de los shells, los nombres de las variables están limitados a caracteres alfanuméricos ASCII y
_
donde el primer carácter puede ' t ser un dígito (a excepción de los parámetros de posición y otras especiales como$*
,$-
,$@
, ..., (que no se asignan a las variables de entorno correspondientes)). También tenga en cuenta que algunas variables están reservadas / especiales por / al shell.Excepciones a eso:
La
rc
concha y sus derivados comoes
yakanga
apoyar cualquier nombre excepto la cadena vacía, y las que son totalmente numérica o contener=
caracteres (y siempre exportan todas sus variables con el medio ambiente, y tener cuidado con las variables especiales como*
,status
,pid
...):Sin embargo, utiliza su propia codificación para variables cuyo nombre no contiene alnums o para matrices cuando se pasan en el entorno de comandos que se ejecutan:
AT & T
ksh
,yash
yzsh
(tambiénbash
pero sólo para los caracteres de un solo byte) alnums de apoyo en la localización actual, no únicos ASCII.En esos shells, puede cambiar la configuración regional para considerar la mayoría de los caracteres como alfa, pero aún así no funcionaría para caracteres ASCII como
.
. Puede engañarzsh
oksh
pensar que£
es una letra, pero no ese.
o cualquier otro carácter ASCII (cuando se trata de permitir caracteres en nombres de variables, no para el[[:alpha:]]
glob por ejemplo).ksh93
tiene variables especiales cuyo nombre contiene un punto como${.sh.version}
, pero esas no están asignadas a variables de entorno y son especiales. El.
es asegurarse de que no entre en conflicto con otras variables. Si se hubiera elegido llamarlo$sh_version
, entonces podría haber potencialmente roto secuencias de comandos que utiliza esa variable ya (véase, por ejemplo, cómozsh
tiene problemas con su$path
o$commands
variables especiales gama / de hash (a la CSH) que rompen algunos scripts).Tenga en cuenta que, además de conchas que no soportan esas variables, algunas conchas como pdksh / mksh hacen eliminan desde el medio ambiente que reciben (
bash
elimina el uno con un nombre vacío,ash
,ksh
ybash
eliminar esas cadenas de entorno que no contienen un=
carácter):En resumen, lo mejor es seguir con los nombres de variables con el apoyo de la mayoría de las conchas e incluso tratar de usar mayúsculas para las variables de entorno (y minúsculas o mayúsculas y minúsculas para las variables del shell no se exportan-) evitando aquellos que son especiales en conchas (como
IFS
,PS1
,BASH_VERSION
...)Si necesita establecer dicha variable en un shell que no las admite, pero no las descarta, puede volver a ejecutarlo usted mismo, con algo como:
(obviamente, si necesita hacerlo en el medio del script, eso no ayudará, pero podría echar un vistazo a ese enfoque para guardar y restaurar el entorno de ejecución de shell en un re-exec). O pruebe el enfoque del depurador:
(que se parece al trabajo con
zsh
,yash
,csh
ytcsh
en AMD64 Linux, pero no con cualquiera de las otras conchas que probé (mksh
,ksh93
,bash
,dash
)).fuente
mksh
(ypdksh
) de hecho construyen los procesos de entorno que generan completamente desde cero, utilizando solo los parámetros exportados en el entorno de ejecución de shell actual, por lo que no hay forma de pasar esas variables a través de esos shells. (Tenga en cuenta que las variables que se pasan están sujetas a cambios; por ejemplo, estoy planeando admitir las exportaciones de matrices pormksh
algún día)Como señalan las otras publicaciones, los shells más comunes no permiten establecer variables de entorno con puntos en el nombre. Sin embargo, he encontrado situaciones, particularmente involucrando Docker y programas invocados, donde el software requería valores clave con puntos.
Sin embargo, en cada una de estas situaciones, esos pares clave-valor podrían pasarse al programa a través de otros medios además de las variables de entorno. Por ejemplo, en Ant, puede usar el "-propertyfile (filename)" para pasar una colección formateada de valores-clave con formato de archivo de propiedades. Confd permite "-archivo de archivo de fondo (archivo yaml)".
Pasé las variables de entorno en la forma "C__any_value = 'my.property.key = the value'". Luego cambié la invocación del programa para generar primero el archivo:
El
set
comando, en Borne Shell, mostrará cada propiedad en una línea separada en el formularioEl
awk
comando procesará solo las variables de entorno que comienzan conC__
, luego extraerá los valores contenidos en las comillas simples.Este método requiere que el valor de la variable de entorno se establezca en la forma precisa que requiere el programa de procesamiento. Además, si el valor de su propiedad o clave contendrá comillas simples, deberá cambiar el carácter separador de campo awk a algo que sepa que no aparecerá y rodear el valor con ese carácter. Por ejemplo, para usar
%
como separador:(la salida precisa dependerá de su shell.) Deberá tomar medidas adicionales para decodificar el escape de la cotización.
fuente