欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux 点命令 也就是source 命令 文件 有大用 有大大用

linux 点命令

1 cat a
2 date
3 
4 . a
5 Mon Jun 27 09:49:02 CST 2016
       

linux .(点命令):读取并且在当前的shell中执行文件中的命令       

来自 https://www.cnblogs.com/uangyy/p/5619285.html


linux点命令

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

从上面可以看出,其实点命令相当于c语言里面的#include。另,点命令还有另一个写法:source。下面我们将举例来说明。
我们先写一个简单的shell脚本文件,暂且命名为file1吧:
#! /bin/bash
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
#! /bin/bash
a="hi"
脚本文件file2(与file1在同一个目录下)
#! /bin/bash
./file1
echo $a
记得改一下file1的权限啊,要不./file1就没法执行了。执行一下看看结果。
什么都没有,是吧。我们再改一下file2,这回用一下咱们的点命令
#! /bin/bash
. ./file1
echo $a
怎么样结果不一样了吧。(原谅我实在太懒了,只能举这么简短的例子了,呵呵)

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

废话了这么多,其实好像把点命令想像成C里的#include就OK了,呵呵。不过经过这么折腾,还是学到了一点东西的,至少知道了.不仅有点命令的作用,更有当前目录的意思(冷啊,该补一下linux基础了)。

来自  https://blog.csdn.net/zailushang530839037/article/details/16994951


普通分类: