Переменная раскрывается в текущей среде.
$ set -x # turn on tracing
$ var1=123
+ var1=123
$ echo "Hello [$var1]"
+ echo 'Hello [123]'
Hello [123]
$ set +x
Как вы можете видеть из трассы (строки, начинающиеся с «+»), echo
видит «Hello [123]». Он никогда не получает переменную.
Как вы увидели из ответа Гогеля на ваш другой вопрос, экспортированные переменные окружения влияют на окружение ребенка:
$ 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
доступен только внутри скрипта, когда он передается в командной строке при вызове скрипта. Если он установлен в интерактивной среде, а затем вызывается сценарий, он доступен только в интерактивной среде.
echo
. Поэтомуecho
никогда не видит переменную, только ее значение.echo "Hello [$var1]"
и следующая строка (которая начинается с «+») показывает, что на самом деле происходит. Оболочка (Bash) говоритecho
выводить «123». Оболочка заменяет имя переменной на ее значение до того, как оно ему передается,echo
поэтомуecho
никогда не видит переменную, а видит только значение, переданное в качестве параметра. Я собираюсь добавить небольшой сценарий к моему ответу, который покажет, что происходит, позволяя вам увидеть внутри процесса. Это займет у меня несколько минут, так что вернитесь, если это еще не сделано.mkdir
является потомком любой среды, из которой он вызывается - например, интерактивной оболочки или скрипта. Обычно на такие исполняемые файлы влияют только экспортированные переменные среды, которые задокументированы на ихman
страницах. Единственный тип переменной среды, который часто эффективен, даже если он не задокументирован на отдельныхman
страницах, - это набор переменных, связанных с локалью, какLANG
показано в некоторых из приведенных выше примеров.file="/etc/passwd"; ls -l "$file"
Вотls
получает значение переменной из родительской оболочки. Значение не сама переменная .