【发布时间】:2012-09-24 08:52:25
【问题描述】:
我要写一个脚本,看起来没有区别:
export k=1
和
k=1
我说的对吗?
【问题讨论】:
我要写一个脚本,看起来没有区别:
export k=1
和
k=1
我说的对吗?
【问题讨论】:
export 使变量可用于子进程。
也就是说,如果您从脚本生成一个新进程,则变量 k 将无法用于该子进程,除非您 export 它。请注意,如果您在子流程中更改此变量,那么更改将不会在父流程中可见。
更多详情请参阅this doc 的第 3.2.3 节。
【讨论】:
我创建了一个简单的脚本来显示差异:
$ cat script.sh
echo $answer
让我们在没有export的情况下进行测试
$ answer=42
$ ./script.sh
$ . script.sh
42
只有在使用 same 进程执行脚本(即相同的bash实例,使用source/.)时才知道该值
现在,使用export:
$ export answer=42
$ ./script.sh
42
$ . script.sh
42
子进程知道该值。
因此,如果您希望子进程知道变量的值,那么您应该使用export。
【讨论】:
export answer=42)并且您在没有导出的情况下更改它(例如answer=30)时,子进程可以看到更改(即获取 30 ./script.sh),这让我很困惑。因此,当您在不使用导出的情况下使用现有的导出值时,总有一天您会感到惊讶!每当您需要跨子流程的可见性时,最好使用导出,而不是依赖“它目前有效”。
每个进程,甚至在 Windows 上,都有一个称为 环境块的内存块,其中包含 环境变量。创建新进程时,默认情况下会将父进程的环境块复制到子进程中,因此环境变量是一种将文本数据传递给子进程的简单方法。
export 命令创建环境变量,或者将普通的局部变量转换为环境变量。在 C-shell 中,它为数不多的可取之处之一是它对环境变量 (setenv) 和局部变量 (set) 使用不同的语法。 Bourne shell 衍生品,如 Bash 和 Korn shell,隐藏了所有这些。
目前,只能传递简单的值,因此不支持像数组这样的项目(它只是导出第一个元素)。使用define 设置的变量属性也不会被导出,除非子进程是相同类型的shell,即另一个bash 实例。这也适用于导出的函数,尽管有时可以在不同类型的 shell 之间破解它(使用eval)。
在 Bash(和其他)中,有一个名为 allexport 的 shell 设置,这意味着所有变量都是环境变量——一般来说这可能是个坏主意。您可以使用 execve 提供与 C 等语言不同的环境块,但在 shell 中您需要像 env 这样的程序,有关详细信息,请参阅 man env。
【讨论】: