【问题标题】:Run bash script with sh使用 sh 运行 bash 脚本
【发布时间】:2013-11-01 13:13:40
【问题描述】:

我有 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

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

【问题讨论】:

  • 如果你只做./script_name.sh呢?
  • 或者让其他用户使用bash script_name.sh 运行? - 包装器也可以。你有什么问题?
  • 你应该展示你的脚本。您想要的是更改您的脚本,使其严格符合 Posix sh 标准。
  • 奇怪,如果/bin/sh 指向破折号,那么这个系统上可能没有真正的/bin/sh
  • 那么你应该声明bash是明确需要的,脚本应该以/bin/bash script_name.sh运行,并以#!/bin/bash启动该脚本......

标签: linux bash shell sh dash-shell


【解决方案1】:

在你之前的脚本中,你可以执行以下操作:

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" ]; 可能是更好的方法。
  • 不,因为如果 bash 用于 sh 兼容性,$BASH 可能是 /bin/sh
  • 如果bash/usr/bin 中可用呢?
  • 那你把脚本改成if [ "$BASH" != $( which bash ) ],或者改用$BASH_VERSION
  • @jbr: 使用更多代码,您可以在测试中运行脚本
【解决方案2】:

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

#!/bin/bash

# your script here

您必须将脚本设置为可执行:

chmod +x my_script.sh

并让用户开始:

./my_script.sh

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

即使用户使用 sh/dash 或任何类似 sh 的解释器,您也可以使用 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
  • @neuro 我修改了您的示例以包含传递给脚本的参数。
  • @neuro 是的,你可以摆脱它。
  • @lemon tree:不客气。那是团队合作。也感谢 jbr 和 devnull ^^
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 2014-07-07
相关资源
最近更新 更多