有没有办法强制shell脚本在bash而不是sh下运行?

有没有办法强制shell脚本在bash而不是sh下运行?,bash,shell,scripting,Bash,Shell,Scripting,我一直在四处张望,想找到这个,但手头什么也找不到。我相信答案是直截了当的 我正在编写一些shell脚本,用于不同的目的,由不同的人运行,其中一些脚本可能使用“sh”而不是“bash”来调用脚本 脚本包含不在常规shell环境中运行且需要bash的工具-有没有办法强制脚本在bash下运行,即使它是用“sh”调用的?,正确的方法是 #!/bin/bash 作为脚本的第一行 但是如果用户显式地使用sh调用它,那就没有什么帮助了。例如,如果我键入 sh your-script-name #行将被忽略

我一直在四处张望,想找到这个,但手头什么也找不到。我相信答案是直截了当的

我正在编写一些shell脚本,用于不同的目的,由不同的人运行,其中一些脚本可能使用“sh”而不是“bash”来调用脚本

脚本包含不在常规shell环境中运行且需要bash的工具-有没有办法强制脚本在bash下运行,即使它是用“sh”调用的?

,正确的方法是

#!/bin/bash
作为脚本的第一行

但是如果用户显式地使用
sh
调用它,那就没有什么帮助了。例如,如果我键入

sh your-script-name
#行将被忽略

您不能真正阻止人们这样做,但可以通过在脚本顶部添加类似的内容来阻止这种行为:

#!/bin/bash

if [ ! "$BASH_VERSION" ] ; then
    echo "Please do not use sh to run this script ($0), just execute it directly" 1>&2
    exit 1
fi
或者你可以这样做:

#!/bin/bash

if [ ! "$BASH_VERSION" ] ; then
    exec /bin/bash "$0" "$@"
fi
但这很容易出错;例如,可能无法保证
$0
(通常是脚本的名称)实际上是可以用来调用它的名称。我可以想象,如果你弄错了,或者你的系统配置有点错误,这将进入一个无限循环

我建议使用错误消息方法


(注意:我刚刚编辑了此答案,因此错误消息中包含脚本名称,这可能对用户有所帮助。)

感谢您的回复。我在顶部指定了行,我不知道我可以检查bash版本以抛出错误。这很好,谢谢!通常,其他shell(如ksh或zsh)也可以工作。你可能也想检查一下。@Sheller:我想你是说
/usr/bin/env
,而不是
/bin/env
;例如,我的系统没有
/bin/env
。另请参见和。我认为此问题很有用,并且可能仍然遵守规则,例如,如果将其改写为“如何更改脚本以强制其在bash而不是sh下执行?”(与标题大致相同),则不会偏离主题
#!/bin/bash

if [ ! "$BASH_VERSION" ] ; then
    exec /bin/bash "$0" "$@"
fi