TL; DR Глобальная область инициализируется из среды при запуске, но не совпадает со средой.
Среда представляет собой набор строк в форме <name>=<value>
, предоставленной родительский процесс. При запуске оболочка берет каждую строку, чья часть <name>
является допустимым идентификатором оболочки, и создает переменную в глобальной области с таким именем.
Например, строка окружения FOO=3
становится переменной оболочки с именем FOO
со значением 3
.
С другой стороны, строка окружения, такая как 10=6
, игнорируется оболочкой, поскольку 10
не является допустимым идентификатором оболочки. Строка остается в среде, однако, для передачи любым дочерним процессам, которые могут ожидать такую строку. [ОБНОВЛЕНИЕ: POSIX spe c не требует, чтобы такие строки игнорировались; соответствующая оболочка может сохранять или отбрасывать их.]
Существуют также локальные переменные, созданные такими командами, как local
и declare
внутри определения функции. Например:
$ foo () { declare x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
2
x=2
создал (или изменил значение) переменную в глобальной области видимости. Внутри функции declare x
создал локальную переменную. Изменения в этой переменной не повлияли на глобальное имя с тем же именем.
Опция -g
для declare
позволяет сделать имя x
внутри функции относящимся к глобальной области, а не создавать локальная переменная.
$ foo () { declare -g x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
3