【问题标题】:Bad substitution [duplicate]替换错误[重复]
【发布时间】:2017-01-18 16:17:11
【问题描述】:

我有一个包含这一行的 bash 脚本:

dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

这在 OSX 上运行良好。

但是,当我移动它时,将脚本移动到运行 Debian 的 Docker 容器上,它在上面的行中失败并显示以下消息:

Bad substitution

知道为什么会这样吗?

【问题讨论】:

  • 剧本上的shebang是什么? #!/bin/sh 不是 bash。 (即使/bin/sh 被实现为 bash 的符号链接,它也会在 POSIX 模式下运行,从而禁用标准的许多扩展)。如果你想要完整的 bash 语法,你的 shebang 必须#!/bin/bash.
  • (同样,使用sh yourscript 运行脚本将使用仅保证提供POSIX 基线功能的shell 来解释它,即使该脚本以#!/bin/bash 开头)。

标签: bash docker debian


【解决方案1】:

您使用的是dash shell,而不是bash

检查:ls -la /proc/$$/exe

【讨论】:

  • ls -la /proc/$$/exe 的结果是lrwxrwxrwx 1 root root 0 Jan 16 17:20 /proc/6/exe -> /bin/bash,所以我没有使用dash
  • 如果使用 bash,那么最安全的做法是检查脚本是独立调用的还是来源的:
  • 如果 [ -z "${BASH_SOURCE}" ];然后 SCRIPTPATH=$0 否则 SCRIPTPATH=${BASH_SOURCE[0]} fi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2018-12-22
  • 2018-04-22
  • 2019-06-13
  • 1970-01-01
  • 2021-03-26
  • 2011-11-01
相关资源
最近更新 更多