El problema, revisado
Francamente, el manual es confuso en este punto. El manual de GNU Bash dice:
El entorno para cualquier comando o función simple [tenga en cuenta que esto excluye los elementos internos] puede aumentarse temporalmente con un prefijo con asignaciones de parámetros, como se describe en Parámetros de Shell. Estas declaraciones de asignación afectan solo al entorno visto por ese comando.
Si realmente analiza la oración, lo que está diciendo es que se modifica el entorno para el comando / función, pero no el entorno para el proceso padre. Entonces, esto funcionará:
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
porque el entorno para el comando env se ha modificado antes de su ejecución. Sin embargo, esto no funcionará:
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
debido a cuando el shell realiza la expansión de parámetros.
Pasos del intérprete
Otra parte del problema es que Bash define estos pasos para su intérprete:
- Lee su entrada desde un archivo (consulte Scripts de Shell), desde una cadena proporcionada como argumento a la opción de invocación -c (consulte Invocación de Bash) o desde la terminal del usuario.
- Divide la entrada en palabras y operadores, obedeciendo las reglas de cotización descritas en Cotización. Estos tokens están separados por metacaracteres. La expansión de alias se realiza mediante este paso (ver Alias).
- Analiza los tokens en comandos simples y compuestos (consulte Comandos de Shell).
- Realiza las diversas expansiones de shell (ver Expansiones de Shell), dividiendo los tokens expandidos en listas de nombres de archivo (ver Expansión de nombre de archivo) y comandos y argumentos.
- Realiza las redirecciones necesarias (consulte Redirecciones) y elimina los operadores de redirección y sus operandos de la lista de argumentos.
- Ejecuta el comando (consulte Ejecución de comandos).
- Opcionalmente, espera a que se complete el comando y recopila su estado de salida (consulte Estado de salida).
Lo que está sucediendo aquí es que las incorporaciones no obtienen su propio entorno de ejecución, por lo que nunca ven el entorno modificado. Además, los comandos simples (por ejemplo, / bin / echo) no conseguir una ennvironment modificado (por lo que el ejemplo env trabajó) pero la expansión shell está teniendo lugar en el actual entorno en el paso # 4.
En otras palabras, no está pasando 'aaa $ TESTVAR ccc' a / bin / echo; está pasando la cadena interpolada (como se expandió en el entorno actual) a / bin / echo. En este caso, dado que el entorno actual no tiene TESTVAR , simplemente está pasando 'aaa ccc' al comando.
Resumen
La documentación podría ser mucho más clara. ¡Menos mal que hay Stack Overflow!
Ver también
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment