Il problema, rivisitato
Francamente, il manuale è confuso su questo punto. Il manuale GNU Bash dice:
L'ambiente per qualsiasi comando o funzione semplice [nota che questo esclude i comandi incorporati] può essere temporaneamente ampliato aggiungendo un prefisso con assegnazioni di parametri, come descritto in Parametri della shell. Queste istruzioni di assegnazione influenzano solo l'ambiente visto da quel comando.
Se analizzi davvero la frase, ciò che sta dicendo è che l' ambiente per il comando / funzione viene modificato, ma non l'ambiente per il processo genitore. Quindi, questo funzionerà:
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
perché l'ambiente per il comando env è stato modificato prima dell'esecuzione. Tuttavia, questo non funzionerà:
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
a causa di quando l'espansione dei parametri viene eseguita dalla shell.
Fasi dell'interprete
Un'altra parte del problema è che Bash definisce questi passaggi per il suo interprete:
- Legge il suo input da un file (vedi Shell Scripts), da una stringa fornita come argomento all'opzione di invocazione -c (vedi Invoking Bash), o dal terminale dell'utente.
- Divide l'input in parole e operatori, obbedendo alle regole di citazione descritte in Quoting. Questi token sono separati da metacaratteri. L'espansione degli alias viene eseguita in questo passaggio (vedere Alias).
- Analizza i token in comandi semplici e composti (vedere Comandi della shell).
- Esegue le varie espansioni della shell (vedi Espansioni della shell), suddividendo i token espansi in elenchi di nomi di file (vedi Espansione del nome di file) e comandi e argomenti.
- Esegue tutti i reindirizzamenti necessari (vedere Reindirizzamenti) e rimuove gli operatori di reindirizzamento ei loro operandi dall'elenco degli argomenti.
- Esegue il comando (vedere Esecuzione di comandi).
- Facoltativamente, attende il completamento del comando e raccoglie il suo stato di uscita (vedere Stato di uscita).
Quello che sta succedendo qui è che i builtin non hanno un proprio ambiente di esecuzione, quindi non vedono mai l'ambiente modificato. Inoltre, i comandi semplici (es / bin / echo) do ottenere un ennvironment modificato (che è il motivo per cui l'esempio env lavorate) ma l'espansione shell si svolge nel corrente ambiente al punto # 4.
In altre parole, non stai passando "aaa $ TESTVAR ccc" a / bin / echo; stai passando la stringa interpolata (come espansa nell'ambiente corrente) a / bin / echo. In questo caso, poiché l'ambiente corrente non ha TESTVAR , stai semplicemente passando "aaa ccc" al comando.
Sommario
La documentazione potrebbe essere molto più chiara. Meno male che c'è Stack Overflow!
Guarda anche
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment