使用sh运行bash脚本的奇怪问题
在同一个文件夹下有两个脚本。a.sh和b.sh,脚本内容例如以下:
a.sh:
echo "test for a"
source b.sh
b.sh:
echo "test for b"
使用bash a.sh 返回正确结果。
而使用sh a.sh返回结果例如以下:
test for a
a.sh: line 2: source: b.sh: file not found
明显脚本运行过程中。没有找到文件b.sh,将a.sh脚本内容改动为例如以下:
echo "test for a"
source ./b.sh
再次使用sh a.sh 又能够正常运行了,这是为什么呢?
问题就出在sh与bash运行脚本的差别。
首先要明白重要的一点:/bin/sh 尽管是/bin/bash的软连接,但这个软连接非常特殊,它并不仅仅仅仅是一个链接,sh不等于bash。假设你在CentOS下使用man sh能够找到这句话:
Bash can be configured to be POSIX-conformant by default.
这说明sh 等于 bash -posix 也就是说使用sh来运行一个脚本,所以使用sh a.sh的效果等同于bash -posix a.sh,尽管大部分情况下等于使用bash来运行脚本,但启用了bash的posix模式,也能够理解为posix标准。
那么就要遵循这个标准下的要求。
如今来man bash在关于source命令的文档中找到这么一句话:
When bash is not in posix mode, the current directory is searched if no file is found in PATH.
假设bash不是运行在posix模式下,当文件名称最为source的參数系统假设在PATH中,也就是系统变量中找不到这个文件时会在当前文件夹下查找这个文件。
所以在不使用posix模式的情况下 a.sh脚本中的source b.sh不会出错,由于即使在PATH中找不到。也会在当前文件夹中进行查找。但假设使用了posix模式,能够在google中找到关于bash posix mode的内容。当中有一条:
The . and source builtins do not search the current directory for the filename argument if it is not found by searching PATH.
.也就是source这样的内建命令在使用文件名称作为參数时,假设在PATH中无法找到。将不会在当前文件夹自己主动进行查找。
这就是问题的关键。使用了sh 运行a.sh,脚本中source b.sh中的b.sh既不会在PATH中被找到也不会在当前文件夹下被找到,那么bash仅仅会返回
b.sh: file not found
但假设a.sh写成这样 source ./b.sh
这就不一样了,这等于给source提供了一个该文件的路径,尽管是相对路径,但bash是能够依据脚本本身运行的位置来找到b.sh的,所以就不会出错了。
总结:所以普通情况下。在Linux中运行一个bash的脚本。我们都会使用bash去运行。就是为了避免这样的奇怪问题的产生。
关于bash posix mode的相关信息你能够在这里找到:
http://structure.usc.edu/bash/bashref_6.html#SEC83
使用sh运行bash脚本的奇怪问题的更多相关文章
- Linux下运行bash脚本显示“: /usr/bin/env: "bash\r": 没有那个文件或目录
用 ./ 运行bash脚本文件出现 报错信息 /usr/bin/env: "bash\r": 没有那个文件或目录 错误原因:这主要是因为bash后面多了\r这个字符的原因.在lin ...
- 实验楼-高级Bash脚本编程指南
实验1.Bash介绍与入门 1.简介:Bash是一个为GNU计划编写的Unix shell,它是许多Linux平台默认使用的shell shell是一个命令解释器,是介于操作系统内核与用户之间的一个绝 ...
- source、sh、bash、./执行脚本的区别
1.source命令用法: source FileName 作用:在当前bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限" 注:该命令通常用 ...
- linux 下source、sh、bash、./执行脚本的区别
原文地址:http://blog.csdn.net/caesarzou/article/details/7310201 source命令用法: source FileName 作用:在当前bash环境 ...
- (转)source、sh、bash、./执行脚本的区别
source.sh.bash../执行脚本的区别 原文:https://www.cnblogs.com/sparkbj/p/5976100.html 1.source命令用法: source Fil ...
- source sh运行脚本的差别
主要有两种方式运行shell脚本 1)source test.bsh 2)sh test.bsh 1)souce运行脚本文件会在父程序中运行.各项动作都会在原本的bash内生效.运行过程不另开进程.脚 ...
- Bash脚本15分钟进阶指导
首先声明这是网上摘来的.这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT).这里是一个修订和扩增版本. 脚本安全 我的所有bash脚本都以下面几句为开场白: # ...
- 编写运行R脚本
1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),... ...
- 【转】如何调试bash脚本
本文转自:http://coolshell.cn/articles/1379.html Bash 是Linux操作系统的默认Shell脚本.Shell是用来处理操作系统和用户交互的一个程序.Shell ...
随机推荐
- Linux 网络属性管理
Linux网络基础管理-1:IPv4 地址分类: 点分十进制:0.0.0.0-255.255.255.255 A类: 0 0000000 - 0 1111111: 1-127 网络数:126, 1 ...
- 《你又怎么了我错了行了吧》第九次团队作业:Beta冲刺与验收准备
项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十三 团队作业9 团队名称 你又怎么了我错了行了吧 作业学习目标 (1)掌握软件黑盒测试技术: (2)学会编制软件项目总结PPT. ...
- VUE:渐进式JavaScript框架(小白自学)
VUE:渐进式JavaScript框架 一.官网 英文 https://vuejs.org/ 中文 https://cn.vuejs.org/ 二:渐进式 即有一个核心库,在需要的时候再逐渐添加插件的 ...
- tp框架 验证码的应用注意事项
1如何点击更换二维码 二维码是img标签的src访问生成二维码的方法.绑定点击事件,ajax的get方式请求生成二维码的函数.在U函数后面加上任意不重复的参数 如 ?rand=’+math.rand ...
- mysql5.7官网直译SQL语句优化--分组优化
1.14Group By Optimization 分组优化 大多数方法为了满足分组查询需要扫描整个表并且创建一个临时表,其中每组中的值都是连续的,如果可以使用聚合函数和临时表获取各个分组.在某些情况 ...
- 电子签章盖章之jQuery插件jquery.zsign
简介: 使用jquery.zsign可以实现电子签章盖章效果,使用方便,只需提供自己的章图片.效果图如下: 页面引用: <link href=&quo ...
- HDU 2686 Matrix(最大费用最大流+拆点)
题目链接:pid=2686">http://acm.hdu.edu.cn/showproblem.php?pid=2686 和POJ3422一样 删掉K把汇点与源点的容量改为2(由于有 ...
- 海尔公布首套智能套装SmartCare,主打智能、简单
2014CIE智能硬件首发会于11月6-8日在上海国际展览中心举行.吸引了海尔.英特尔.百度等知名企业的积极參与. 作为国内智能家居领域的先驱者,海尔在本次大会上首发了轻量智能套装SmartC ...
- sap abap 对字符串的操作
替换字段内容 REPLACE [FIRST /ALL OCCURRENCES OF]<STR1>INTO <STR> WITH <STR2> DATA STR ...
- perl getopt 用法
我们在linux经常常使用到一个程序须要增加參数,如今了解一下perl中的有关控制參数的函数.getopt.在linux有的參数有二种形式.一种是--help,还有一种是-h.也就是-和--的分别.- ...