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 调用脚本,则该脚本在技术上应该由sh
PATH 中找到的第一个执行。许多 shell 解释器喜欢bash
,dash
并且ksh
认为自己是 POSIX,因此将解释脚本。注意SHELL
这里没有使用环境变量。
是的,可以是,但不一定是。这两个 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)