【问题标题】:Is there a way to force a shell script to run under bash instead of sh? [closed]有没有办法强制 shell 脚本在 bash 而不是 sh 下运行? [关闭]
【发布时间】:2013-07-19 17:34:02
【问题描述】:

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

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

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

【问题讨论】:

  • @shellter:我想你的意思是/usr/bin/env,而不是/bin/env;例如,我的系统没有/bin/env。另见this questionmy answer
  • 我相信这个问题很有用,并且可能仍然遵守规则,例如不是离题,如果它被改写为“如何更改我的脚本以强制它在 bash 而不是 sh 下执行?” (和标题差不多)

标签: bash shell scripting


【解决方案1】:

As Richard Pennington says,正确的做法是拥有

#!/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)也可以工作。您可能还想检查它们。
【解决方案2】:
#! /bin/bash
# The rest of your script.

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2011-08-12
    • 2012-02-05
    • 2016-03-01
    • 2020-08-11
    • 2010-12-01
    相关资源
    最近更新 更多