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

Roh*_*han 8 shell bash

bash 和 sh 执行脚本的方式不同吗?我用 bash 和 sh 执行了一个 shell 脚本,并得到了相同的输出。那么区别是什么呢?

另外,当您运行时./executable,它使用 bash 还是 sh?

jll*_*gre 10

这取决于您运行的系统。许多操作系统,尤其是基于 Linux 的操作系统,是sh指向bash.

在这种情况下,在被bash调用时尝试更像传统的 bourne shell 的行为仍然存在一些差异sh,但它仍然接受大多数 bashisms。

在其他一些操作系统上,例如基于 Debian 的操作系统,sh由 提供dash,而不是bash. 这会产生更大的差异,因为dash它不支持 bashisms,它被设计为一个干净的 POSIX shell 实现。

专有的操作系统,sh往往是要么由POSIX兼容提供ksh88其喜欢的dash,没有实现bash化。在 Solaris 10 及更早版本上,根据您的 PATH 是什么,sh可能是旧的 Bourne shell,早于 POSIX。

在任何情况下,您的测试很可能会得到相同的输出,因为您的脚本没有使用任何bash特定的命令、选项或语法。

当你运行时./executable,将运行什么shell本质上取决于.executable脚本开头写的shebang。bash如果shebang指定它,那将是:

#!/bin/bash
....
Run Code Online (Sandbox Code Playgroud)

如果没有 shebang 并且您从符合 POSIX 的 shell 调用脚本,则该脚本在技术上应该由shPATH 中找到的第一个执行。许多 shell 解释器喜欢bashdash并且ksh认为自己是 POSIX,因此将解释脚本。注意SHELL这里没有使用环境变量。


rda*_*rda 5

是的,可以是,但不一定是。这两个 shell 不一样,但基本是兼容的。查看这篇文章了解更多详细信息。

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

ps h -p $$ -o args='' | cut -f1 -d' '
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

或者

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)