проблема переменной среды в оболочке

Я использую Red Hat Linux Enterprise 5. Я знаю теорию, что - использующий экспорт для установки переменную среды переменная среды будет относиться к текущей и дочерней среде, но не используя экспорт для установки переменной среды переменная среды будет только относиться к текущей среде.

Мой беспорядок, каково точное определение "дочерней среды" и "текущей среды"? Например,

$ var1=123
$ echo "Hello [$var1]"

значение var1 (который равняется 123) печатается в оболочке, но я думаю, что эхо является командой, вызванной текущей оболочкой, и это (команда эха) должна быть дочерняя среда текущей оболочки, и значение var1 не должно (потому что, не используя экспорт var1=123), влияют на эхо. Какие-либо комментарии?

Заранее спасибо!

1
задан 22.05.2010, 13:48

1 ответ

Переменная расширена в текущей среде.

$ set -x    # turn on tracing
$ var1=123
+ var1=123
$ echo "Hello [$var1]"
+ echo 'Hello [123]'
Hello [123]
$ set +x

Поскольку Вы видите от трассировки (начало строк "+"), echo видит "Привет [123]". Это никогда не получает переменную.

Как Вы видели от ответа gogiel до Вашего другого вопроса, экспортируемые переменные среды действительно влияют на среду ребенка:

$ echo $LANG
en_US.UTF-8
$ declare -p LANG   # the response includes "-x" which shows the variable is already marked for export
declare -x LANG="en_US.UTF-8"
$ ls --help | head -n 4
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
$ LANG=es_MX.utf8 ls --help | head -n 4
Uso: ls [OPCIÓN]... [FICHERO]...
Muestra información acerca de los ARCHIVOS (del directorio actual por defecto).
Ordena las entradas alfabéticamente si no se especifica ninguna de las opciones -cftuSUX ni --sort.

Или я, возможно, установил значение LANG в текущей среде и так как это экспортировало его, был бы наследован дочерней средой:

$ LANG=es_MX.utf8
$ grep --help | head -n 4
Modo de empleo: grep [OPCIÓN]... PATRÓN [FICHERO]...
Busca un PATRÓN en algún ARCHIVO o entrada estándar.
PATTERN es, por omisión, una expresión regular básica (BRE).
Ejemplo: grep -i '¡Hola, mundo!' menu.h main.c
$ sed --help | head -n 4
Uso: sed [OPCIÓN]... {guión-sólo-si-no-hay-otro-guión} [fichero-entrada]...

  -n, --quiet, --silent
                 suprime la muestra automática del espacio de patrones
$ while [[ = 4 ]]    # create an error on purpose to show Spanish error message
bash: se esperaba un operador binario condicional
bash: error sintáctico cerca de `4'

Править:

Вот простой сценарий (давайте назовем его showvars) таким образом, Вы видите то, что продолжается как внутри, так и снаружи.

#!/bin/bash
arguments="$@"
printf "The script has started.\n"
printf "These are the parameters passed to the script: [$arguments]\n"
scriptvar=100
printf "This is the value of scriptvar: [$scriptvar]\n"
printf "This is the value of exportvar: [$exportvar]\n"
printf "This is the value of shellvar: [$shellvar]\n"
printf "This is the value of commandvar: [$commandvar]\n"
printf "The script has ended.\n"

Теперь мы делаем эти шаги при приглашении оболочки:

$ shellvar=200
$ export exportvar=300
$ ./showvars 400 $shellvar 500
The script has started.
These are the parameters passed to the script: [400 200 500]
This is the value of scriptvar: [100]
This is the value of exportvar: [300]
This is the value of shellvar: []
This is the value of commandvar: []
The script has ended.
$ commandvar=600 ./showvars 400 $shellvar 500
The script has started.
These are the parameters passed to the script: [400 200 500]
This is the value of scriptvar: [100]
This is the value of exportvar: [300]
This is the value of shellvar: []
This is the value of commandvar: [600]
The script has ended.
$ printf "This is the value of commandvar: [$commandvar]\n"
This is the value of commandvar: []
$ commandvar=600
$ ./showvars 400 $shellvar 500
The script has started.
These are the parameters passed to the script: [400 200 500]
This is the value of scriptvar: [100]
This is the value of exportvar: [300]
This is the value of shellvar: []
This is the value of commandvar: []
The script has ended.
$ printf "This is the value of scriptvar: [$scriptvar]\n"
This is the value of scriptvar: []
$ printf "This is the value of exportvar: [$exportvar]\n"
This is the value of exportvar: [300]
$ printf "This is the value of shellvar: [$shellvar]\n"
This is the value of shellvar: [200]
$ printf "This is the value of commandvar: [$commandvar]\n"
This is the value of commandvar: [600]

Как видете shellvar не доступно в сценарии и scriptvar не доступно снаружи. С тех пор exportvar экспортируется, это доступно как внутри, так и снаружи сценария. И commandvar только доступно в сценарии, когда он передал командную строку при вызове сценария. Если это установлено в интерактивной среде, и затем сценарий называют, это доступно только в интерактивной среде.

3
ответ дан 12.12.2019, 10:43

Теги

Похожие вопросы