当前位置:  开发笔记 > 编程语言 > 正文

为什么可以在Bash函数中设置环境变量,但不在脚本本身中设置

如何解决《为什么可以在Bash函数中设置环境变量,但不在脚本本身中设置》经验,为你挑选了2个好方法。

为什么这样做:

# a.sh
setEnv() {
    export TEST_A='Set'
}

当这不是:

# b.sh
export TEST_B='Set'

例如:

> source a.sh
> setEnv
> env | grep TEST_A
TEST_A=Set
> b.sh
> env | grep TEST_B

我理解为什么运行脚本不起作用以及如何使它工作(source b.sh等),但我很好奇为什么功能工作.如果重要的话,这是在OS X上.



1> Inian..:

您需要了解采购执行脚本之间的区别.

Sourcing从调用脚本的父shell运行脚本; 保留所有环境变量,直到父shell终止(终端关闭,或者重置或重置变量),而

执行从父shell分叉新shell,包含export变量的变量仅保留在子shell的环境中,并在脚本终止时终止.

即,在第一种情况下创建的用于保存变量的子shell(想象它是一个环境)不是在单独的子环境的范围内分配,而是仅在父项中添加(例如,想象一个额外的存储单元,由parent)环境,直到你打开会话为止.但是,执行一个脚本,想象一个简单的类比,调用一个函数,其变量存储在堆栈中,在函数调用结束时松散范围.同样,分叉shell的环境在终止时会失去范围.

所以,归结到这一点,即使你有一个功能,以export您的变量,如果你没有source它目前的外壳,只是说白execute了,变量没有保留; 即

# a.sh
setEnv() {
    export TEST_A='Set'
}

如果你在shell中运行它

bash script.sh    # unlike/NOT source script.sh
env | grep TEST_A
                  # empty



2> chepner..:

执行一个函数本身并不会像启动一个新进程那样b.sh

在手册页中(强调最后一句话):

FUNCTIONS
       A shell function, defined  as  described  above  under  SHELL  GRAMMAR,
       stores  a  series  of commands for later execution.  When the name of a
       shell function is used as a simple command name, the list  of  commands
       associated with that function name is executed.  **Functions are executed
       in the context of the current shell;  no  new  process  is  created  to
       interpret  them  (contrast  this with the execution of a shell script).**

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有