使用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 ...
随机推荐
- java方法名的重载
方法的重载:方法名相同,参数不同,按照参数类型进行匹配 创建一个Simple 类,然后定义了两个方法 package cuteSnow; public class Simple { // 方法的重载, ...
- 机器学习关于AUC的理解整理
AUC 几何意义:ROC曲线与X轴的面积 https://blog.csdn.net/luo3300612/article/details/80367901 AUC物理意义:随机给定一个正样本和一个负 ...
- 洛谷 P3420 [POI2005]SKA-Piggy Banks
P3420 [POI2005]SKA-Piggy Banks 题目描述 Byteazar the Dragon has NN piggy banks. Each piggy bank can eith ...
- Android开发之AlarmManager具体解释
AlarmManager实质是一个全局的定时器,是Android中经常使用的一种系统级别的提示服务,在指定时间或周期性启动其他组件(包含Activity,Service,BroadcastReceiv ...
- 百度地图 key申请以及基础地图的演示
之前做过一个拼车的项目,用到了百度地图,如今做电商项目,也遇到了要使用地图,可是刚来这公司不久项目不是自己做的,今天一个同事说定位那边有点问题,所以如今不忙,好好搞下地图,为了以后业务扩展或者出现故障 ...
- STM32IAP升级-----编写IAP升级遇到的问题总结
IAP的源代码等资料我上传了,压缩包内有12个文件.,http://download.csdn.net/detail/f907279313/7524849(要积分的辛苦收集的你们就给点积分吧) 还有还 ...
- 用自定义的函数将gps转换为高德坐标
<?php echo<<<_END <!doctype html> <html> <head> <meta charset=" ...
- (一)Eureka 服务的注册与发现
(一)服务的注册于发现(eureka); Eureka Server: 服务注册中心,负责服务列表的注册.维护和查询等功能 在Idea里,新建项目,选择Spring initializer. 下面的p ...
- Android 数据存取
Android提供了Preference(配置),File(文件),SQLite数据和网络几种数据存取方式 SharedPreference提供了一种轻量级的数据存取方法,应用场合主要是比较少的配置信 ...
- 接口测试工具篇--postman
上面是postman的主页面,可以输入接口url,设置请求方式(get或post) 下面主要讲一些其他接口测试需要用到的设置Authorization用来设置权限验证的,可以选择权限验证的方式 hea ...