bash 和 sh 执行脚本的方式不同吗?我使用 bash 和 sh 执行了 shell 脚本,并得到了相同的输出。那么区别是什么呢?
另外,当你刚刚运行时./executable
,它使用bash还是sh?
答案1
这取决于您正在运行的系统。许多操作系统,尤其是基于 Linux 的操作系统,sh
都有一个bash
.
在这种情况下,行为上仍然存在一些差异,bash
在调用时尝试更像传统的 bourne shell sh
,但它仍然接受大多数 bashism。
在其他一些操作系统上,例如基于 Debian 的操作系统,sh
由 提供dash
,而不是bash
。这会产生更大的差异,因为dash
它不支持 bashism,被设计为一个干净的 POSIX shell 实现。
在专有操作系统上,sh
通常由 POSIX 兼容提供,ksh88
例如dash
,不实现 bashisms。在 Solaris 10 及更早版本上,根据您的 PATH 的不同,sh
可能会是 POSIX 之前的旧版 Bourne shell。
无论如何,您可能会得到与测试相同的输出,因为您的脚本没有使用任何bash
特定的命令、选项或语法。
当您运行时./executable
,将运行哪个 shell 本质上取决于 .executable 脚本开头写入的 shebang。bash
如果 shebang 指定了它,那就是:
#!/bin/bash
....
如果没有 shebang 并且您从 POSIX 兼容的 shell 调用该脚本,则从技术上讲,该脚本应该由sh
PATH 中找到的第一个脚本执行。许多 shell 解释器喜欢bash
,dash
并ksh
认为自己是 POSIX,因此会解释脚本。请注意,SHELL
这里没有使用环境变量。
答案2
是的,可以是,但不一定是。这两个 shell 不一样,但基本是兼容的。查看这个帖子更多细节。
您可以在脚本中使用以下行来检查所使用的解释器:
ps h -p $$ -o args='' | cut -f1 -d' '
您可以使用以下行显式指定直接执行脚本时应使用的 shell sheebang
:
#!/bin/sh
或者
#!/bin/bash