浅析shell中source命令和.逗号命令对当前父shell的影响

来源:互联网 发布:淘宝代购店铺名字 编辑:程序博客网 时间:2024/05/16 14:45
 

lu1() {
    echo 'aaaaaaaaa'
}

lu2() {
    echo 'bbbbbbbbb'
}
上面就是,run.sh的源码了,可以看到只有2个函数定义没有任何地方来调用这两个函数,那么我们如果这样执行:
luther@gliethttp:~$ ./run.sh
luther@gliethttp:~$
可以看到什么都没有,因为没有地方调用这2个函数,我们希望在我们的luther@gliethttp:~$ 提示符后面调用这2个函数,来试试,
luther@gliethttp:~$ lu1
bash: lu1: command not found
luther@gliethttp:~$ lu2
bash: lu2: command not found
luther@gliethttp:~$
结果都提示找不到命令,是不是我们的这个需求shell还不提供支持呢,当然不是,这样有用的需求shell早就为我们做好解决方案了,来看看怎么实现,
shell中有2个命令可以完成我们的工作,一个是source另一个就是和source等效的.逗号运算符:
luther@gliethttp:~$ . run.sh或者luther@gliethttp:~$source run.sh
这样我们run.sh脚本中创建的变量和函数就添加到了执行.或source的shell,直到关闭该shell窗口,否则run.sh中创建的变量和函数将一直有效,
如果我们只是执行./run.sh启动一个subshell来运行我们的run.sh脚本,那么run.sh脚本中的变量和函数将紧紧影响到由shell启动的subshell,当./run.sh脚本退出之后,run.sh变量和函数的影响寿命也到了尽头。
来看看现在的现象:
luther@gliethttp:~$ ./run.sh
luther@gliethttp:~$ lu1
bash: lu1: command not found
luther@gliethttp:~$ lu2
bash: lu2: command not found
luther@gliethttp:~$ . run.sh
luther@gliethttp:~$ lu1
aaaaaaaaa
luther@gliethttp:~$ lu2
bbbbbbbbb
luther@gliethttp:~$
重新启动一个新shell:
luther@gliethttp:~$ ./run.sh
luther@gliethttp:~$ lu1
bash: lu1: command not found
luther@gliethttp:~$ lu2
bash: lu2: command not found
luther@gliethttp:~$ source run.sh
luther@gliethttp:~$ lu1
aaaaaaaaa
luther@gliethttp:~$ lu2
bbbbbbbbb
luther@gliethttp:~$

原创粉丝点击