В чем разница между глобальным охватом и средой? - PullRequest
1 голос
/ 10 марта 2020

Является ли глобальная область действия такой же, как у среды?

Встроенная функция объявить имеет параметр -g:

Параметр -g принудительно вызывает переменные быть созданным или измененным в глобальной области видимости, даже когда объявление выполняется в функции оболочки. Во всех остальных случаях игнорируется.

1 Ответ

4 голосов
/ 10 марта 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...