Bash 全球范围和环境之间的区别是什么?

Bash 全球范围和环境之间的区别是什么?,bash,Bash,全球范围是否与环境相同 具有-g选项: -g选项强制在全局范围内创建或修改变量,即使在shell函数中执行declare时也是如此。在所有其他情况下,它都被忽略 TL;DR全局作用域在启动时从环境中初始化,但与环境不同 环境是父进程提供的一组字符串,其形式为。在启动时,shell获取每个字符串,该字符串的部分是有效的shell标识符,并在全局范围中创建一个具有该名称的变量 例如,环境字符串FOO=3将成为名为FOO的shell变量,其值为3 另一方面,shell会忽略10=6这样的环境字符串,因

全球范围是否与环境相同

具有-g选项:

-g选项强制在全局范围内创建或修改变量,即使在shell函数中执行declare时也是如此。在所有其他情况下,它都被忽略


TL;DR全局作用域在启动时从环境中初始化,但与环境不同

环境是父进程提供的一组字符串,其形式为。在启动时,shell获取每个字符串,该字符串的部分是有效的shell标识符,并在全局范围中创建一个具有该名称的变量

例如,环境字符串FOO=3将成为名为FOO的shell变量,其值为3

另一方面,shell会忽略10=6这样的环境字符串,因为10不是有效的shell标识符。不过,字符串仍保留在环境中,以便传递给可能需要此类字符串的任何子进程。[更新:POSIX规范不要求忽略此类字符串;合格的shell可以保留或丢弃它们。]

还有一些局部变量,由函数定义中的local和declare等命令创建。例如:

$ foo () { declare x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
2
x=2创建或更改了全局范围内变量的值。在函数内部,声明x创建了一个局部变量。对该变量的更改不会影响同名的全局变量

要声明的-g选项允许您使函数中的名称x引用全局范围,而不是创建局部变量

$ foo () { declare -g x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
3

TL;DR全局作用域在启动时从环境中初始化,但与环境不同

环境是父进程提供的一组字符串,其形式为。在启动时,shell获取每个字符串,该字符串的部分是有效的shell标识符,并在全局范围中创建一个具有该名称的变量

例如,环境字符串FOO=3将成为名为FOO的shell变量,其值为3

另一方面,shell会忽略10=6这样的环境字符串,因为10不是有效的shell标识符。不过,字符串仍保留在环境中,以便传递给可能需要此类字符串的任何子进程。[更新:POSIX规范不要求忽略此类字符串;合格的shell可以保留或丢弃它们。]

还有一些局部变量,由函数定义中的local和declare等命令创建。例如:

$ foo () { declare x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
2
x=2创建或更改了全局范围内变量的值。在函数内部,声明x创建了一个局部变量。对该变量的更改不会影响同名的全局变量

要声明的-g选项允许您使函数中的名称x引用全局范围,而不是创建局部变量

$ foo () { declare -g x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
3

具有无效名称的环境变量是否由shell从环境中取消设置而丢弃,而不仅仅是在转换为shell变量时被忽略,这取决于版本,POSIX未指定。我们在知识库中有一个关于它的问题——至少他们中的一些人在后炮击时代的早期就开始被bash弄得不知所措……我们在这里:[…];申请应允许存在此类名称。这似乎是一个非常明确的迹象,表明名称不应该仅仅因为shell或其他POSIX实用程序无法使用而从环境中删除。请继续阅读。未指定在调用shell时传递给shell但由于名称无效而未用于初始化shell变量的环境变量(请参阅shell变量)是否包含在传递给execl的环境中,以及如果execl如上所述失败,是否包含在新shell中。这是来自shell命令语言spec,而不是环境变量spec.Ugh。对于POSIX规范来说,这似乎是不必要的。具有无效名称的环境变量是否被shell从环境中取消设置而丢弃,而不仅仅是在转换为shell变量时被忽略,这取决于版本,POSIX未指定。我们在知识库中有一个关于它的问题——至少他们中的一些人在后炮击时代的早期就开始被bash弄得不知所措……我们在这里:[…];申请应允许存在此类名称。这似乎是一个非常明确的迹象,表明名称不应该仅仅因为shell或其他POSIX实用程序无法使用而从环境中删除。请继续阅读。未指定在调用shell时传递给shell但由于名称无效而未用于初始化shell变量的环境变量(请参阅shell变量)是否包含在传递给execl的环境中,以及如果execl如上所述失败,是否包含在新shell中。这是来自shell命令语言spec,而不是环境变量spec.Ugh。对于POSIX规范来说,这似乎是不必要的软弱。这几乎是.T的复制品 他的书几乎是他的翻版。