美文网首页
source与export

source与export

作者: ThomasYoungK | 来源:发表于2019-02-24 16:54 被阅读3次

    source: 该脚本在当前进程中被执行, 可以用.来替代
    export: 定义一个可以被子进程共享的变量

    比如我创建一个test1.sh

    x=ab
    

    再创建一个test2.sh

    export x=ab
    

    再创建一个exect.sh

    echo $x
    

    如果我在shell中执行./test1.sh, 再执行echo $x, 我将什么都看不到,因为父进程无法看到子进程中定义的变量。同理,执行./test2.sh,再执行echo $x, 也是什么都看不到。然后执行./exect.sh当然也是什么都没有。

    但是如果执行source test1.sh, 再执行echo $x, 输出ab,执行./exect.sh, 什么都不输出。这是因为source的作用等效于在当前进程中执行了x=ab, 但不被子进程看到,因此exect.sh无法得到x的值。
    如果执行source test2.sh, 再执行echo $x, 输出ab,执行./exect.sh, 也会输出ab。这是因为x不仅在当前进程中,而且由于export的关系,可以被子进程看到,因此exect.sh也输出了ab

    顺便讨论一下.zshrc.bashrc的作用:新打开一个终端,会实现执行类似于source ~/.zshrc的动作,因此.zshrc定义的变量会在终端中可见,这就是echo $PATH能看到我们自定义的PATH的原因。但是如果不export, 那么在子进程中就不能再看到这些定义的变量,而如果在.zshrcexport了变量,则这些变量在后续的新进程中都将始终能被看到。

    做个实验验证一下, 在.zshrc的尾部新增2个变量:

    ...
    export xx=10
    yy=20
    

    新打开一个终端,发现2个变量都可见:

    ➜  shell_scripts echo $xx
    10
    ➜  shell_scripts echo $yy
    20
    

    再新建一个脚本test3.sh

    echo $xx
    echo $yy
    

    然后执行该脚本, 发现只打印了xx,没有打印出yy

    ➜  shell_scripts chmod u+x test3.sh
    ➜  shell_scripts ./test3.sh
    10
    
    

    因此在.zshrc中的变量需要export来保证所有子进程都可见。

    相关文章

      网友评论

          本文标题:source与export

          本文链接:https://www.haomeiwen.com/subject/fqlbyqtx.html