使用sh运行bash脚本

18

我有一个bash脚本,它需要bash程序。

另一个人试图运行它,使用的是

sh script_name.sh

它失败了,因为在他的发行版中,sh是指向dash的符号链接。

$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Aug 25 16:06 /bin/sh -> dash

我有一个使用包装脚本的想法:

#!/bin/sh
bash script_name.sh

该目标是通过bash在系统上运行.sh脚本,该系统具有指向dash的符号链接。


2
还是让另一个用户使用 bash script_name.sh 运行?- 一个包装器也可以。你有什么问题? - John3136
它真的非常庞大,对bash有很强的依赖性(数组、函数等)。 - user1032985
2
然后您应该明确说明需要 bash,脚本应该使用 /bin/bash script_name.sh 运行,并以 #!/bin/bash 开始该脚本... - Basile Starynkevitch
是的,它已经安装了。例如干净的 Debian 安装有符号链接 /bin/sh -> dash。但当然,它也有 bash。 - user1032985
大多数系统现在都没有单独的/bin/sh/bin/sh是一个“虚拟”shell,可以由支持POSIX标准的任何shell实现。 - chepner
显示剩余6条评论
2个回答

35

通常,你使用shebang来告诉shell使用正确的解释器:

#!/bin/bash

# your script here

您需要将脚本设置为可执行:

chmod +x my_script.sh

让用户通过以下方式开始:

./my_script.sh

使用包装脚本似乎比较简单。

即使用户使用sh/dash或任何类似的解释器,您也可以使用jbr test在bash中运行您的脚本:

#!/bin/bash

if [ -z "$BASH_VERSION" ]
then
    exec bash "$0" "$@"
fi

# Your script here

这样它就能正确地与以下任一方式配合使用:

sh ./my_script.sh

# or

bash ./my_script.sh

# or

./my_script.sh

但这并不能阻止用户执行 sh script.sh - jbr
@neuro,我修改了你的示例,包括传递给脚本的参数。 - devnull
@neuro 是的,你可以摆脱它。 - devnull
@柠檬树:不用谢,那是团队合作的结果。也要感谢jbr和devnull ^^ - neuro

4
在你的脚本开头,你可以先执行一些类似于以下代码的操作:
if [ "$BASH" != "/bin/bash" ]; then
  echo "Please do ./$0"
  exit 1
fi

或者更一般的方法是使用$BASH_VERSION

if [ -z "$BASH_VERSION" ]; then
  echo "Please do ./$0"
  exit 1
fi

我猜 if [ ! "$BASH" ]; 可能是更好的方法。 - devnull
不行,因为如果使用bash兼容性来作为sh,则$BASH可能是/bin/sh - jbr
如果bash/usr/bin中可用,那该怎么办? - devnull
然后您可以将脚本更改为 if [ "$BASH" != $( which bash ) ],或者使用 $BASH_VERSION - jbr
@jbr:加上更多代码,你就可以用你的测试运行脚本了。 - neuro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接