使用 bash 和 sh 运行脚本有什么区别?

使用 bash 和 sh 运行脚本有什么区别?

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 调用该脚本,则从技术上讲,该脚本应该由shPATH 中找到的第一个脚本执行。许多 shell 解释器喜欢bash,dashksh认为自己是 POSIX,因此会解释脚本。请注意,SHELL这里没有使用环境变量。

答案2

是的,可以是,但不一定是。这两个 shell 不一样,但基本是兼容的。查看这个帖子更多细节。

您可以在脚本中使用以下行来检查所使用的解释器:

ps h -p $$ -o args='' | cut -f1 -d' '

您可以使用以下行显式指定直接执行脚本时应使用的 shell sheebang

#!/bin/sh

或者

#!/bin/bash

相关内容