¿Cómo se determina si las variables de shell se exportan o no?

13

Con la familia de shell Bourne, todas las variables de shell tienen mayúsculas; lo que significa que no puede saber si una variable en particular es una variable de entorno o no simplemente mirando su nombre. ¿Cómo se determina qué variables de shell Bourne son locales (definidas solo dentro del shell actual)?

Shoulderpadz
fuente
44
¿Bourne shell o Bourne-again shell? ¿Puede señalar una referencia para la variable mayúscula?
Jeff Schaller
En el shell Bourne-again ya que todas las variables son mayúsculas, ¿cómo puede determinar qué variables bash son locales?
Shoulderpadz
77
@Shoulderpadz nada le impide crear variables en minúsculas.
muru
1
¿Por local quiere decir variables que no se han exportado?
Eliah Kagan
44
La distinción que está preguntando son las variables de shell frente a las variables de entorno, no las globales frente a las locales. Tenga en cuenta que hay variables de shell que no son variables de entorno (es decir, lo que llama "local"), y hay variables de entorno que no son variables de shell (el entorno puede contener nombres que no son identificadores de shell válidos, y por lo tanto no pueden ser variables).
chepner

Respuestas:

17

Si desea ver si una variable se exporta o no, use declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"
muru
fuente
26

La forma más portátil es export -p.

export -penumera las variables exportadas. Esto suele ser declare -x, si su caparazón tiene declare.

Los shells de estilo Bourne actualmente en uso deberían ser compatibles export -p, como lo requiere POSIX :

Cuando se especifica -p , export escribirá en la salida estándar los nombres y valores de todas las variables exportadas, en el siguiente formato:

"export %s=%s\n", <name>, <value>

si se establece el nombre y:

"export %s\n", <name>

si el nombre no está establecido

El estándar continúa explicando que el valor de la variable se muestra de tal manera que generalmente permite su uso posterior en el lado derecho de =una asignación. Esto quiere decir que puede ser citado. Diferentes proyectiles pueden mostrarlos de manera diferente pero con el mismo efecto. export -pfunciona incluso en proyectiles que no tienen declareincorporado, como Dash .

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

He canalizado la salida a la grepcompacidad, pero si no la filtra, obtendrá la lista completa de sus variables exportadas. Según su pregunta, parece que eso es lo que puede encontrar más útil.

Algunos shells, como Bash, usan un formato no estándar a menos que se les indique explícitamente que se comporten de manera compatible con POSIX. En Bash export -pda la misma salida que declare -xpor defecto.

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

Zsh muestra un formato no estándar incluso cuando la compatibilidad POSIX está habilitada:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

En cualquier caso, puede extraer representaciones portátiles (que pueden ser citadas) buscando una palabra seguida de =. Esto no se basa en palabras anteriores en la línea, siempre y cuando no precedan inmediatamente =, lo que no deberían. Por ejemplo:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

Tenga en cuenta que no todas las entradas tienen necesariamente =. Esto se debe a que las variables pueden desarmarse pero exportarse. Esas entradas se filtran mediante el grepcomando anterior, que puede o no ser lo que desea.

La mayoría de las veces, lo que desea inspeccionar la salida y por lo que no le importa si las entradas están precedidos por export, declare -x, typeset -x, o alguna otra cosa. Entonces solo corre export -p.

Probé esos comandos en Ubuntu 16.04 LTS con versiones oficialmente empaquetadas de cada shell.

Eliah Kagan
fuente
0

Las variables que NO se exportan se pueden ver desde la salida del declarecomando en bash.

Las variables que se exportan se pueden ver desde la salida declare -xo el exportcomando en bash.

S471
fuente