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

时间:2022-10-20 12:36:47

因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/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的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)