Come si determina se le variabili della shell vengono esportate o no?


13

Con la famiglia di shell Bourne, tutte le variabili shell hanno nomi in maiuscolo; il che significa che non puoi sapere se una particolare variabile è una variabile di ambiente o non solo osservando il suo nome. Come si determinano quali variabili della shell Bourne sono locali (definite solo all'interno della shell corrente)?


4
Bourne shell o Bourne-again shell? Puoi indicare un riferimento per la variabile maiuscola?
Jeff Schaller

Nella shell Bourne-again poiché tutte le variabili sono maiuscole, come si possono determinare quali variabili bash sono locali?
Shoulderpadz,

7
@Shoulderpadz nulla ti impedisce di creare variabili minuscole.
Muru,

1
Per locale intendi variabili che non sono state esportate?
Eliah Kagan,

4
La distinzione che stai chiedendo è variabili di shell vs variabili di ambiente, non globale vs locale. Si noti che ci sono variabili shell che non sono variabili di ambiente (ad esempio, ciò che si sta chiamando "locale") e ci sono variabili ambiente che non sono variabili di shell (l'ambiente può contenere nomi che non sono identificatori di shell validi, e quindi non possono essere variabili).
Chepner,

Risposte:


17

Se vuoi vedere se una variabile viene esportata o meno, usa declare:

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

26

Il modo più portatile è export -p.

export -pelenca le variabili esportate. Questo è di solito come declare -x, se la vostra shell ha declare.

Le shell in stile Bourne attualmente in uso dovrebbero supportare export -p, come richiesto da POSIX :

Quando viene specificato -p , export deve scrivere nello standard output i nomi e i valori di tutte le variabili esportate, nel seguente formato:

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

se il nome è impostato e:

"export %s\n", <name>

se il nome non è impostato.

Lo standard prosegue spiegando che il valore della variabile viene visualizzato in modo tale che di solito ne consenta l'uso in un secondo momento sul lato destro di =un compito. Questo per dire che può essere citato. Conchiglie diverse possono visualizzarle in modo diverso ma con lo stesso effetto. export -pfunziona anche con shell che non hanno declarebuiltin, come 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

Ho eseguito il piping dell'output grepper compattezza, ma se non lo filtri, otterrai l'elenco completo delle variabili esportate. Dalla tua domanda, sembra che sia quello che potresti trovare più utile.

Alcune shell, come Bash, utilizzano un formato non standard a meno che non venga esplicitamente indicato di comportarsi in modo conforme a POSIX. In Bash export -pfornisce lo stesso output declare -xdi default.

$ 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 mostra un formato non standard anche quando è abilitata la compatibilità POSIX:

$ 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

In ogni caso, è possibile estrarre rappresentazioni portatili (che possono essere citate) cercando una parola seguita da =. Questo non si basa sulle parole precedenti sulla riga, purché non precedano immediatamente =, cosa che non dovrebbero. Per esempio:

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

Nota che non tutte le voci hanno necessariamente =. Questo perché le variabili possono essere non impostate ma esportate. Tali voci vengono filtrate dal grepcomando sopra, che può essere o meno quello che desideri.

Il più delle volte, si vuole solo controllare l'output e quindi non si cura se le voci sono preceduti da export, declare -x, typeset -x, o qualcos'altro. Quindi corri e basta export -p.

Ho testato quei comandi su Ubuntu 16.04 LTS con versioni ufficialmente impacchettate di ogni shell.


0

Le variabili NON esportate possono essere visualizzate dall'output del declarecomando in bash.

Variabili che vengono esportati può essere visto da output declare -xo exportcomando in bash.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.