引用:https://www.cnblogs.com/general001/articles/2420089.html

source 命令是 bash shell 的内置命令,从 C Shell 而来。
source 命令的另一种写法是点符号,用法和 source 相同,从Bourne Shell而来。
source 命令可以强行让一个脚本去立即影响当前的环境。
source 命令会强制执行脚本中的全部命令,而忽略文件的权限。
source 命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。
source 命令可以影响执行脚本的父shell的环境,而 export 则只能影响其子shell的环境。

使用方法举例:
$source ~/.bashrc
或者:
$. ~/.bashrc
执行后 ~/.bashrc 中的内容立即生效。
一个典型的用处是,在使用 Android 的 mm 等相关命令时,需要先执行以下命令:
$cd <android source path>
$source ./build/envsetup.sh   或者  $. ./build/envsetup.sh

source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是个点符号,(从Bourne Shell而来)是source的另一名称。同样的,当前脚本中设置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。例如,如果在登录后对 .bash_profile 中的 EDITER 和 TERM 变量做了修改,则能用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。
source命令的作用就是用来执行一个脚本,那么:
source a.sh 同直接执行 ./a.sh 有什么不同呢,比如你在一个脚本里export $KKK=111 ,如果你用./a.sh执行该脚本,执行完毕后,你运行 echo $KKK ,发现没有值,如果你用source来执行 ,然后再echo ,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结果并没有反应到父shell里,不过source不同,他就是在本shell中执行的,所以能看到结果。
“.”点命令是shell的一个内部命令,它从指定的shell 文件中读入所有命令语句并在当前进程中执行。 因此当多个shell进程(父子进程或无关进程均可)共享一组变量值时,就可以将这些变量赋值语句定义到一个shell文件里,并在需要这些变量值的程序中使用点语句来引用这个shell文件,从而实现变量值共享(对这些变量值的修改仅涉及到这个shell文件)。但要注意的是,这个shell文件不能包括含有位置参数的语句,即不能接受$1、$2等命令行参数。
从上面可以看出,其实点命令相当于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基础了)。

为什么在shell脚本里面export的环境变量,在set里面竟然看不到。
为什么在shell脚本里面用export设置环境变量之后,当shell执行完了,用set命令看不到呢?但是你如果直接在终端里export 环境变量用set是看到的。

一个shell脚本test.sh的内容为:
#!/bin/bash
      export AA=123
当我们执行test.sh的时候,是当前终端所在的shell fork一个子shell然后执行test.sh的,执行完了再返回终端所在的shell。明白这点,就容易理解了,我们在test.sh设置了AA环境变量,它只在fork出来的这个子shell中生效,子shell只能继承父shell的环境变量,而不能修改父shell的环境变量,所以test.sh结束后,父进程的环境就覆盖回去。所以在test.sh之后完之后,我们用set命令是看不了AA这个环境变量的值的。
那有什么办法可以让脚本的环境变量在脚本执行之后仍然对当前终端存在呢?用sorcue 或者.(dot) 。明确告诉shell不要fork执行脚本,而是在当前的shell执行,这样环境变量就可以保存下来了。
source命令用法:
source Filename (通常用“.”来代替)
source test.sh 与 .test.sh是等效的。
【补充】
source命令与shell scripts的区别是,
source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。

不积跬步,无以至千里;不积小流,无以成江海! 千里之行,始于足下。改变现在,就是改变未来。改变未来,从现在开始。

source 命令与./命令相关推荐

  1. 关于source /etc/profile命令

    在linux下安装海思交叉编译工具的时候,碰到个问题,本来提示安装成功了,但是在用makefile编译库的时候,仍然提示找不到交叉编译工具链: make:arm-vfp-uclibc-linux-gn ...

  2. macOS和Linux下source和export命令

    source命令用法 //两种用法 source filename . filename source作用 和sh.bash相似但不一样,下面看一下他们的区别: 1.sh filename重新建立一个 ...

  3. CentOS 执行 source /etc/profile命令时,报错:-bash: #: 未找到命令

    问题描述: CentOS 执行 source /etc/profile命令时,报错:-bash: #: 未找到命令 如下所示: [root@localhost ~]# source /etc/prof ...

  4. Linux is执行程序命令,linux命令执行过程详解

    1.执行命令 输入命令后回车 提请shell程序找到键入命令所对应的可执行程序或者代码,并且由其分期后,提交给内核分配资源将其运行起来. 在shell中可执行的命令有俩类: 内部命令:由shell自带 ...

  5. Jupyter Notebook基础(6)Jupyter Notebook命令行命令帮助

    Jupyter Notebook当前版本为6.3.0. Jupyter命令行命令 jupyter命令是整个Jupyter项目命令的命名空间,单独执行jupyter命令无任何意义. jupyter命令的 ...

  6. Linux命令 常见命令 详细分类

    内容来自网络,很久之前保存到本地的,不知道出处如有版权要求请联我删除 操作命令编辑 2 模式切换编辑 3获得帮助编辑 4基础命令编辑 列出目录中的文件(LS) 目录切换(CD) 创建.移动.复制.删除 ...

  7. Linux系统中常用命令行命令、快捷键、创建长路径的快捷键

    Linux系统中常用命令行命令.快捷键.创建长路径的快捷键 1.常用Linux命令: 1.1 文件和目录: cd /home 进入 '/home' 目录 cd - 返回上一级目录 cd -/- 返回上 ...

  8. 2K和XP的CMD命令教程(命令篇)

    2K和XP的CMD命令教程(命令篇) accwiz.exe > 辅助工具向导 acsetups.exe > ACS setup DCOM server executable actmovi ...

  9. Linux执行命令常用命令4.0

    目录 1.账号和权限管理 2.添加用户账号 1.账号和权限管理 (1)管理用户账号和组账号 用户账号和组账号概述 ■Linux基于用户身份对资源访问进行控制 用户账号 ●超级用户.普通用户.程序用户 ...

最新文章

  1. python学习手册中文版免费下载-Python学习手册(第3版)
  2. Android Studio 小技巧/快捷键 合集
  3. object detection
  4. mybatis中的xml中拼接sql中参数与字符串的方法
  5. 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析
  6. Codeforces 814C - An impassioned circulation of affection
  7. 2018年计算机二级MySQL真题_2018年3月计算机二级考试MySQL真题及答案2
  8. 【转】你有这么一个人么
  9. CTeX书写规范、WinEdt编写XeLaTeX、数模格式编写总结
  10. Ubuntu 18.04双系统卸载教程,不借助第三方软件(UEFI)
  11. 在投射和录制时显示敏感信息时,免root授权确认框
  12. 用VUE实现注册页(短信验证码登录)
  13. TI-RTOS---TI-RTOS简介
  14. Adobe Dreamweaver 的基础知识
  15. 【AD封装】RJ45座子(带3D)
  16. DELPHI 7 仿QQ好友列表(RZ控件)
  17. 大学计算机思维编程题及答案,学编程必看:10道逻辑思维测试题(附答案)
  18. Kali2020 安装中文输入法
  19. 仿真软件测试基尔霍夫定律,硬件工程师常见笔试题汇总
  20. 华为OLT设备EPON/GPON混插管理

热门文章

  1. php 去掉图片背景透明背景图片,php 处理透明背景的图片时的问题
  2. 将销售订单号 + 行号 带到销售出库单上
  3. 销售订单发票计划导入
  4. Python   pip安装selenium安装不了报错原因
  5. 如何让 Eclipse Java EE 版安装 CDT 以同时支持 Java 和 C/C++ 开发
  6. Java-POI读取excel(null的cell也读取输出)
  7. 基于GIS+BIM技术助力城市地下综合管廊绿色建设发展
  8. 江西计算机专业考公务员,江西省考16万考生,专业人才却能避开竞争,盘点最容易公考岗位...
  9. 谷歌浏览器打不开网址解决办法
  10. 简单vsftpd安装配置和 ftp客户端操作笔记