Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux BASH:;出口k=1“;vs.“;k=1“;_Linux_Bash_Shell - Fatal编程技术网

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