我要编写一个脚本,它看起来没有区别:
export k=1
和
k=1
我是对的吗?
答案 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
。