【问题标题】:In bash, when creating Variables. When to export and when not to export?在 bash 中,创建变量时。什么时候出口,什么时候不出口?
【发布时间】:2016-04-27 17:01:07
【问题描述】:

根据我的阅读,假设 export 所做的唯一事情是使变量对子进程可见是否正确?

您希望使变量仅在其初始化的范围内可见的情况是什么,以及您希望变量可用于所有子范围的情况是什么?

【问题讨论】:

  • 范围 != 进程。同一进程中的任何子作用域都可以使用 shell 变量,而无需导出它。
  • @chepner 明白了。那么我猜想出口是如何发挥作用的呢?

标签: bash shell terminal command-line-interface


【解决方案1】:

一般来说,您只需要导出一个另一个进程将在其环境中查找的变量。你怎么知道这些是哪些变量?你必须阅读他们的文档。

变量是否被标记为导出对于当前的shell来说没有区别。

让我们构建一个演示。

$ printf 'echo "foo=$foo"\n' > script
$ bash script
foo=
$ foo=3
$ bash script
foo=
$ export foo
bash script
foo=3

第一次第二次运行scriptfoo 在它的环境中是未定义的,因为它的父进程(当前shell)没有导出foo。第三次调用时,父级将foo 添加到脚本的初始环境中,因为foo 已导出。


针对您的评论,“环境”一词在这里具有非常精确的含义。 所有进程,不仅仅是shell,在启动时从它的父进程接收一个字符串数组,称为它的环境。这些字符串没有特定的语义;如何解释它们取决于接收程序。

例如,shell 会忽略其环境中不具有name=value 形式的字符串,其中name 是有效的shell 标识符。对于每个这样的字符串,shell 定义一个具有给定名称和值的 shell 变量,并标记其导出属性。这就是我们所说的环境变量。您也可以随时使用export 命令将常规shell 变量“提升”为环境变量,但这不会影响当前进程中变量的含义。

当任何进程创建一个新进程时,它的环境副本都会被提供给新进程。 shell 还会创建 name=value 字符串以从其每个环境变量中传递。

【讨论】:

  • 谢谢!这开始变得更有意义了。我仍然很难掌握外壳和环境之间的区别。当我在 osx 上打开终端时,我是在打开一个新环境吗?
  • 我不会说“另一个程序”,因为只有子进程可以访问导出的变量,而其他任意程序当然不能。
  • @Harald 谢谢。我发现自己多次输入“程序”,而我的意思是说“过程”;那个溜过去了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2015-10-16
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多