shell . 点命令(source)

“.” 符号在路径中一般表示当前目录的意思。如果是“ . filename.sh”的话,‘.’表示点命令,点命令相当于c语言里面的#include。点命令还有另一个写法:source

下面我们将举例来说明。我们先写一个简单的shell脚本文件,暂且命名为file1吧:
a=”hi”
echo $a
我们先来执行一下这个shell脚本,打开终端,敲入:
./file1
结果是什么,你应该也看到了吧:
bash: ./file1: Permission denied
为什么呢。我们先不管这个吧,先看一下,另一个结果:
. ./file1(注意啊,两个点之间有个空格的哦,要不就成了上一级目录了,如果你不嫌麻烦的话,也可以写source ./file1)
这个的结果呢,跟前面就不一样了,正如我们所愿的,输出了hi。
试比较这两个执行使命吧:
./file1,直接执行,需要另起shell进程,而你似乎还没有这个权限(这个改一下就OK了,后面再说),而用点命令就不一样了(注意啊,./file这里的点可不是点命令里的点啊,我就被这个问题困扰了很久,汗死,竟然忘了点还有当前目录的意思,大家b4我吧),点命令会在当前的shell下执行。
补充说一下怎么改一下file1的权限,让我们可以在按shell脚本来执行:
chmod +x file1
再执行一下./file1,是不是OK了?

再来看另一个例子吧。
首先脚本文件file1
a=”hi”
脚本文件file2(与file1在同一个目录下)
./file1
echo $a

记得改一下file1的权限啊,要不./file1就没法执行了。执行一下看看结果。
什么都没有,是吧。我们再改一下file2,这回用一下咱们的点命令
. ./file1
echo $a
怎么样结果不一样了吧。(原谅我实在太懒了,只能举这么简短的例子了,呵呵)

这个例子应该还是能说明点问题的吧。如果不用点命令的话,会另起shell进程,而启动这个进行的时候,它会建立自己的进程环境(暂且这么叫它吧),然后在这个进行结束的时候,它所建立的环境也随之被销毁。而且点命令就不一样了,它会把点命令所带的shell脚本里的所以内容带到当前的shell进程里。

“.”点命令是shell的一个内部命令,它从指定的shell 文件中读入所有命令语句并在当前进程中执行。 因此当多个shell进程(父子进程或无关进程均可)共享一组变量值时,就可以将这些变量赋值语句定义到一个shell文件里,并在需要这些变量值的程序中使用点语句来引用这个shell文件,从而实现变量值共享(对这些变量值的修改仅涉及到这个shell文件)。但要注意的是,这个shell文件不能包括含有位置参数的语句,即不能接受$1、$2等命令行参数。

猜你喜欢

转载自blog.csdn.net/w_manhong/article/details/79453461
今日推荐