【问题标题】:BASH: difference between "export k=1" vs. "k=1"BASH:“导出 k=1”与“k=1”之间的区别
【发布时间】:2012-09-24 08:52:25
【问题描述】:

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

export k=1

k=1

我说的对吗?

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    export 使变量可用于子进程。

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

    更多详情请参阅this doc 的第 3.2.3 节。

    【讨论】:

      【解决方案2】:

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

      $ 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),这让我很困惑。因此,当您在不使用导出的情况下使用现有的导出值时,总有一天您会感到惊讶!每当您需要跨子流程的可见性时,最好使用导出,而不是依赖“它目前有效”。
      【解决方案3】:

      每个进程,甚至在 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

      【讨论】:

        猜你喜欢
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2022-10-01
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多