Linux BASH:;出口k=1“;vs.“;k=1“;
我将要写一个脚本,它看起来没有什么区别:Linux BASH:;出口k=1“;vs.“;k=1“;,linux,bash,shell,Linux,Bash,Shell,我将要写一个脚本,它看起来没有什么区别: export k=1 及 我说得对吗?export使变量可用于子流程 也就是说,如果您从脚本生成一个新进程,那么变量k将不可用于该子进程,除非您导出它。请注意,如果在子流程中更改此变量,则该更改在父流程中不可见 有关更多详细信息,请参见的第3.2.3节。我创建了一个简单的脚本来显示差异: $ cat script.sh echo $answer 让我们在不导出的情况下进行测试 $ answer=42 $ ./script.sh $ . scri
export k=1
及
我说得对吗?
export
使变量可用于子流程
也就是说,如果您从脚本生成一个新进程,那么变量k
将不可用于该子进程,除非您导出它。请注意,如果在子流程中更改此变量,则该更改在父流程中不可见
有关更多详细信息,请参见的第3.2.3节。我创建了一个简单的脚本来显示差异:
$ cat script.sh
echo $answer
让我们在不导出的情况下进行测试
$ answer=42
$ ./script.sh
$ . script.sh
42
只有在使用相同的进程执行脚本时(即,使用源代码的相同bash
实例),才知道该值
现在,使用导出:
$ export answer=42
$ ./script.sh
42
$ . script.sh
42
子流程知道该值
因此,如果希望子进程知道变量的值,则应使用export
即使在Windows上,每个进程都有一个称为环境块的内存块,其中包含环境变量。创建新进程时,默认情况下,父进程的环境块复制到子进程,因此环境变量是将文本数据传递给子进程的简单方法
export
命令创建环境变量,或将普通局部变量转换为环境变量。在C-shell中,它为数不多的弥补功能之一是,它对环境变量(setenv
)和局部变量(set
)使用不同的语法。伯恩壳牌公司的衍生品,如Bash和Korn shell,掩盖了这一切
目前,只能传递简单的值,因此不支持数组之类的项(它只导出第一个元素)。使用define
设置的变量属性也不会导出,除非子进程是相同类型的shell,即bash的另一个实例。这也适用于导出的函数,尽管有时可以在不同类型的shell之间对此进行破解(使用eval
)
在Bash(和其他)中,有一个shell设置,名为allexport
,这意味着所有变量都是环境变量——通常使用se可能不是个好主意。您可以使用execve
提供与C等语言不同的环境块,但在shell中,您需要env
等程序,有关详细信息,请参见manenv
。感谢提供简单的示例!我对这个差异有疑问,因为当值已经导出(export-answer=42
)并且您在不导出的情况下更改它(例如answer=30
)时,子流程可以看到更改(即使用/script.sh
)获得30),这就是让我困惑的地方。因此,当您在不导出的情况下处理已存在的导出值时,总有一天您会感到惊讶!无论何时需要子流程的可见性,都最好使用导出,而不是依赖于“它目前可以工作”。
$ export answer=42
$ ./script.sh
42
$ . script.sh
42