因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash.

本文参考:https://www.cnblogs.com/aaronLinux/p/6885288.html和http://www.cnblogs.com/baizhantang/archive/2012/09/11/2680453.html

一:解释

#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是此解释此脚本的shell的路径。

$ cat /etc/shells可以查看系统支持的shell格式

其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。

比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,/bin/python脚本,甚至/bin/echo等等。

** #!/bin/bash **同理。

二:区别

脚本test.sh内容:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
由此可见,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
修改test.sh脚本的第一行,变为#!/bin/bash,再次执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
hello
由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
但是紧接着我又试着运行了一下sh ./test.sh,这次屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。

为什么会有这样的区别呢?

junru同学作了解释

  1. sh一般设成bash的软链
    [work@zjm-testing-app46 cy]$ ll /bin/sh
    lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
  2. 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
  3. 也就是说 /bin/sh 相当于 /bin/bash --posix

所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

so,可以预想的是,如果第一行写成#!/bin/bash --posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)

转载于:https://www.cnblogs.com/jonnyan/p/8798364.html

shell脚本头,#!/bin/sh与#!/bin/bash的区别.相关推荐

  1. shell脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

    一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 一.意思 #!/bin/ ...

  2. Shell脚本中:#!/bin/bash和#!/bin/sh是什么意思以及区别?

    意思:#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径. 其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我 ...

  3. [shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

    一直以为在shell脚本中#都是代表着注释功能,同样在脚本开始的#!/bin/sh也只是告诉用户这是一个shell脚本,而最近顺手查了下,才发现不是这个意思,分享下面的文章. 转自:http://ww ...

  4. Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

    Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别 一.意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的she ...

  5. 关于#!/bin/sh 和 #!/bin/bash 的差别

    在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本. 目前研发送测的shell脚本中主要有以下两种方式: (1) #!/bin/sh (2) #!/bin/bash 在这里求教同福客 ...

  6. #!/bin/sh与#!/bin/bash的区别

    Linux 中的 shell 有很多类型,其中最常用的几种是: Bourne shell (sh).C shell (csh) 和 Korn shell (ksh), 各有优缺点.Bourne she ...

  7. #!/bin/bash和#!/bin/sh是什么意思以及区别

    尊重原著,著明:本帖为优秀的帖子整合 一.意思 #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径. 其实第一句的#!是对脚本的解 ...

  8. Petalinux建立工程时出现WARNING: /bin/sh is not bash!的解决方法

    出现(WARNING: /bin/sh is not bash!)如何解决 在运行命令: @ubuntu$:source /opt/pkg/petalinux/settings.sh` ` 时候出现以 ...

  9. 解决:/system/bin/sh: /system/bin/test-ndk: not executable: magic 7F45报错

    在夜神模拟器运行arm编译器编译出来的可执行文件,结果报错: /system/bin/sh: /system/bin/test-ndk: not executable: magic 7F45查了一下, ...

最新文章

  1. 阿里云新一代关系型数据库 PolarDB 剖析
  2. 【设计和算法分析】3、二进制搜索
  3. 06-CABasicAnimation基础核心动画
  4. html5 填表 表单 input output 与表单验证
  5. mysql变量赋值加冒号_C语言变量声明加冒号的用法(占位符)
  6. shell命令删除昨日的日志_linux定时自动清理日志文件
  7. mac连接ubuntu,tomcat乱码
  8. 怎样能让电脑干干净净的没有各种弹窗广告?
  9. mysql管理数据 并上传至云端_西部数码网站管理助手创建、导入恢复、导出备份mysql数据库...
  10. 分类问题的label为啥必须是 one hot 形式?
  11. Protobuf C++类中成员函数GetCachedSize()与ByteSize()的区别
  12. php swfupload,ThinkPHP+swfupload多图上传实例 经典实用的php多图上传
  13. 第五章:优势策略均衡
  14. 【C语言】 《弹跳的小球》游戏编写过程及思路,清屏函数、Sleep()函数的应用
  15. 三大运营商充话费送手机,里面的套路太深
  16. Magento2.1x常见报错处理
  17. 如何通过结构分析法分析数据?
  18. 憨牛女装旗舰店开业啦!
  19. cad老是弹出命令中发生异常_CAD打开出现向程序发送命令时出现错误该怎么办?...
  20. Vue中使用百度地图做路径分析并根据起终点坐标模拟道路里程桩

热门文章

  1. sass笔记 - 实战中颜色的玩法总结
  2. linux异构内存,Linux内核添加异构内存管理(HMM)将带来加速GPU的新方式,还有可能带来其他类型的机器学习硬件。...
  3. 姿态坐标c语言,判断 AR 中坐标系的姿态和位置的简单方法
  4. cmake mysql 参数_MySQL cmake编译时这些参数是什么意思?-问答-阿里云开发者社区-阿里云...
  5. 用mysql web建立论坛_在web1上搭建Discuz论坛
  6. python中的多态用法_Python面向对象之多态原理与用法案例分析
  7. 手把手教你0基础C语言速通
  8. html form中多个div,在react里最多只能有几个div
  9. uoj#267. 【清华集训2016】魔法小程序(乱搞)
  10. Oracle报错:“ORA-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录