Linux Shell脚本中点号和source命令
来源:互联网 发布:淘宝聊天工具下载 编辑:程序博客网 时间:2024/04/30 14:56
Linux中一个文件是根据其是否具有执行属性来判断他是否可以直接运行的。就像Windows下的exe一样。如果我们要执行某一个文件,可以先将其权限修改为可执行(必须是所有者或者root才能修改)。然后,通过用sh来执行该脚本或者./脚本名。
但有时候我们并不想修改文件权限,可能我们也没有那个权限,所以我们可以使用.(点号)+文件名来临时执行一个脚本而无须修改权限。
在Linux系统中存在大量的脚本,其中你会看到大量这个用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脚本(test.sh)如下:
#!/bin/sh
echo "export monitor=1" >> /etc/profile
source /etc/profile
调用后(./test.sh),执行echo $monitor,没有输出任何值
手动source /etc/profile后,再次执行echo $monitor,输出了预期的值
可见脚本中的source /etc/profile没有成功(提法本身就是错误的),请问这个应该怎么解决?
///////////////////////////////////////////////////////////////////////////////////////
A:在执行test.sh的时候,不用./test.sh
用source test.sh
转自:http://www.linuxidc.com/Linux/2011-09/43353.htm
使用source与点命令执行Linux shell脚本的体会
当一个shell脚本执行的时候,会产生一个新的执行环境。
如在终端中使用#sh ./file.sh会产生一个新的shell环境,在此环境中设置的变量值不会影响父shell中(即终端中)的值。使用source和点命令的目的可以理解为让脚本在父shell中执行,在脚本中设置变量值会影响父shell中的值。
例子:先在终端中设置version变量,脚本dotcommand.sh中改变version变量。然后检查直接./dotcommand.sh执行和使用source或点命令执行区别。
--------------------------------------------------------------------------------------------
先编辑shell脚本dotcommand.sh,改变执行权限#chmod 744 dotcommand.sh 。:
#!/bin/sh
version=”LATEST_VERSION”
echo “version in dotcommand.sh is $version ”
------------------------------------------------------------------------------------------------------
首先在终端中预先定义version变量,然后检查直接./dotcommand.sh执行和使用source执行区别。
#version=”CLASSIC_VERSION”
#echo $version
CLASSIC_VERSION
#./dotcommand
version in dotcommand.sh is LATEST_VERSION
#echo $version
CLASSIC_VERSION //可以看到直接执行dotcommand.sh脚本未改变终端中version值
#source ./dotcommand
version in dotcommand.sh is LATEST_VERSION
#echo $version
LATEST_VERSION //使用source改变了终端中version变量
#
--------------------------------------------------------------------------------------------------------------
在上例子中可以看到使用source命令执行和直接执行间的区别,source命令在父shell环境中执行,改变了父shell的环境变量,如果在脚本中使用exit 0,使用source执行,可以看到直接退出终端的效果。
- LINUX Shell脚本中点号和source命令
- Linux Shell脚本中点号和source命令
- Linux Shell脚本中点号和source命令
- LINUX Shell脚本中点号和source命令
- LINUX Shell脚本中点号和source命令
- Linux Shell脚本中点号和source命令
- shell中的source命令和点号dot/period
- linux shell 中source 命令
- bash 点号(.)和source命令的使用
- Shell脚本中点号+文件名的作
- Shell脚本中点号+文件名的作用
- Shell脚本中点号+文件名的作用
- linux C中调用shell命令和运行shell脚本
- linux C中调用shell命令和运行shell脚本
- linux C中调用shell命令和运行shell脚本
- linux C中调用shell命令和运行shell脚本
- linux C中调用shell命令和运行shell脚本
- linux下shell脚本执行方法及exec和source命令
- perl中的反引号`` system exec
- ActionContextCleanUp的作用
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- ClassLoader in Java
- 旧工程适配iPhone5的4-inch屏幕时发生的奇葩问题
- Linux Shell脚本中点号和source命令
- android 的动画类型
- [Oracle] oracle修改数据文件名称
- STL 容器和ATL智能包裹类的冲突
- dev GridControl笔记
- 13.如何做到要求或禁止在堆中产生你自定义的对象
- 【示例代码】超萌的休闲HTML5小游戏——打地鼠
- 详解jar命令打包生成双击即可运行的Java程序
- 跑通第一个ruby on rails 出现问题及解决方案 参照cloudfoundry docs