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

Loc*_*ane 8 bash shell scripting

我一直在试图找到这个,但我找不到任何东西.我确信答案很简单.

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

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

Kei*_*son 28

正如理查德彭宁顿所说,正确的方法就是拥有

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

作为脚本的第一行.

但是,如果用户使用sh显式调用它,那将无济于事.例如,如果我输入

sh your-script-name
Run Code Online (Sandbox Code Playgroud)

#!行将被忽略.

你无法真正阻止人们这样做,但你可以通过在脚本顶部添加这样的东西来阻止它:

#!/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
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

#!/bin/bash

if [ ! "$BASH_VERSION" ] ; then
    exec /bin/bash "$0" "$@"
fi
Run Code Online (Sandbox Code Playgroud)

但这很容易变得非常错误; 例如,可能无法保证$0(通常是脚本的名称)实际上是一个可用于调用它的名称.如果你弄错了,或者你的系统稍有错误配置,我可以想象这会进入一个无限循环.

我建议使用错误消息方法.

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