14

我一直在四处寻找这个,但我找不到任何手头的东西。我确信答案很简单。

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

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

4

2 回答 2

35

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

#!/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通常是脚本名称的 ,实际上是您可以用来调用它的名称。我可以想象如果你弄错了或者你的系统配置错误,这会进入一个无限循环。

我推荐错误消息方法。

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

于 2013-07-19T17:41:39.740 回答
0
#! /bin/bash
# The rest of your script.
于 2013-07-19T17:38:20.747 回答