关于#!/bin/bash和#!/bin/sh详细解析

本文详细介绍了#!/bin/bash的含义,即使用/bin/bash解释执行脚本。通过多个脚本示例,阐述了#!/bin/bash的使用规则,如只能放首行、路径要正确等。还对比了sh和bash的执行差异,指出sh相当于bash --posix,强调脚本首行加#!+shell路径的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,…
我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。
除第一行外,脚本中所有以“#”开头的行都是注释。
1)#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。
这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来获得可执行权限):
tbash1.sh:
#!/bin/sh
source abc
echo “hello abc”

tbash2.sh:
#!/bin/bash
source abc
echo “hello abc”

tbash3.sh:
source abc
echo “hello abc”

三个脚本执行的结果:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh不再往下面执行。
[nsvc@localhost other]$ ./tbash2.sh
./tbash2.sh: line 2: abc: No such file or directory
hello abc
注:当source命令执行有问题时,bash继续执行下面命令。
[nsvc@localhost other]$ ./tbash3.sh
./tbash3.sh: line 1: abc: No such file or directory
hello abc
注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。

如果将tbash1.sh改成:
echo “abc”
#!/bin/sh
source abc
echo “hello abc”
那么,执行结果是:
[nsvc@localhost other]$ ./tbash1.sh
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。

当把tbash1.sh改成:
#!/bin/sh
#!/bin/bash
source abc
echo “hello abc”
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,除第一行外,脚本中所有以“#”开头的行都是注释。

2)#!后面的路径一定要正确,不正确会报错。
假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:
#!/home/sh
source abc
echo “hello abc”
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory
系统会提示/home/sh的路径不存在。

3)如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:
-sh-3.2$ ./tbash3.sh
./tbash3.sh: line 1: abc: 没有那个文件或目录
与1)中的执行结果是不一样的。
因此,大家应该养成脚本首行加上#!+shell路径的习惯。

4)/bin/sh相当于/bin/bash --posix
我们将脚本tbash1.sh改为:
#!/bin/bash --posix
source abc
echo “hello abc”
执行结果:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果一样。

我们还可以以tbash3.sh为示例。
用以下命令来执行该脚本:
[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
"bash tbash3.sh"表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh脚本名“这样的命令,来用sh作为脚本解释器。
从结果可以看出,/bin/bash–posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“

最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。

### 差异分析 当编写Shell脚本时,`#!/bin/sh` `#!/bin/bash` 是两种常见的解释器声明方式。这两种声明会影响脚本的行为兼容性。 #### 解释器路径不同 通常情况下,`/bin/sh` 提供的是SH shell,这是一个功能较少的BASH版本[^2]。而 `/bin/bash` 则指向完整的Bash Shell环境。这意味着使用 `#!/bin/sh` 的脚本应该只依赖POSIX标准定义的功能集,而不应假设存在特定于Bash的功能特性。 #### 功能差异 由于 `/bin/sh` 实际上可能是其他shell的一个简化版或者是严格遵循POSIX规范实现的结果,在某些发行版中它可能并不完全等同于Bash。因此: - **命令解析**:一些高级语法结构如数组、更复杂的条件表达式以及部分内置函数仅能在Bash下正常工作。 -word}` 这样的参数替换形式虽然被广泛接受,但在严格的 POSIX 模式的sh里可能会有不同的行为或不被支持。 - **字符串处理**:双引号内的特殊字符转义规则也有所不同;在Bash中可以更好地保留字面意义传递给调用命令[^3]。 为了确保最大范围内的可移植性最小化意外错误的风险,如果确实需要利用到更多特性的场合,则应当显式指定为 `#!/bin/bash` 来运行整个程序逻辑。 ```bash #!/bin/bash echo "This script uses bash specific features." array=(one two three) # Array declaration which works only in bash for element in "${array[@]}"; do echo "$element" done ``` 相反地,对于那些只需要基本操作且希望保持高度兼容性的场景来说,采用 `#!/bin/sh` 可能是一个更好的选择。 ```bash #!/bin/sh echo "This script aims for maximum portability across Unix-like systems." if test -f "/path/to/file"; then cat /path/to/file fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值