BASH:“出口k = 1”与“k = 1”之间的差异

时间:2012-09-24 08:52:26

标签: linux bash shell

我要编写一个脚本,它看起来没有区别:

export k=1

k=1

我是对的吗?

3 个答案:

答案 0 :(得分:37)

export使变量可用于子进程。

也就是说,如果您从脚本中生成一个新进程,那么除非k,否则该子进程将无法使用变量export。请注意,如果在子流程中更改此变量,则更改将不会在父流程中显示

有关详细信息,请参阅this doc的第3.2.3节。

答案 1 :(得分:21)

我创建了一个简单的脚本来显示差异:

$ cat script.sh 
echo $answer

让我们在没有export

的情况下进行测试
$ answer=42
$ ./script.sh 

$ . script.sh 
42

只有使用相同的进程执行脚本(即同一个bash实例,使用source / .)时,才知道该值

现在,使用export

$ export answer=42
$ ./script.sh 
42
$ . script.sh 
42

该子过程已知该值。

因此,如果您希望子进程知道变量的值,那么您应该使用export

答案 2 :(得分:14)

每个进程,即使在Windows上,都有一块称为环境块的内存块,其中包含环境变量。创建新进程时,默认情况下,父进程的环境块将复制到子进程,因此环境变量是将文本数据传递给子进程的简单方法。

export命令创建环境变量,或将普通的局部变量转换为环境变量。在C-shell中,其少有的兑换功能之一是它对环境变量(setenv)使用不同的语法来表示局部变量(set)。 Bourne shell派生词,比如Bash和Korn shell,隐藏了所有这些。

目前,只能传递简单的值,因此不支持像数组这样的项目(它只导出第一个元素)。除非子进程是相同类型的shell,即另一个bash实例,否则也不会导出使用define设置的变量属性。这也适用于导出的函数,尽管有时可能会在不同类型的shell之间进行破解(使用eval)。

在Bash(和其他人)中有一个名为allexport的shell设置,这意味着所有变量都是环境变量 - 一般来说可能是一个坏主意。您可以使用execve从C语言提供不同的environemnt块,但是从shell中您需要env这样的程序,有关详细信息,请参阅man env