SHELLOPTS 相当于 /bin/dash

SHELLOPTS 相当于 /bin/dash

我必须运行许多由第三方定义的 shell 脚本。所以我不能(或者不想)更改他们的内容或他们正在使用的 shell(bash 与 dash)。他们可能会也可能不会通过 shebang 指定这一点。

但是,我想将所有执行的命令打印到标准输出。对于 bash,我可以使用env SHELLOPTS=xtrace ./script.sh.然而,这只有在#!/bin/bash使用shebang 时才有效。如果#!/bin/dash使用或不使用 shebang,则不会产生任何效果。

我可以使用 dash 的等效环境变量吗?我知道我可以添加set -x到脚本的顶部,这对两个 shell 都适用,但如果可能的话,我想避免这种情况。

答案1

没有一般的替代品。

xtrace对于仅顶层脚本的特殊情况,您可以使用

dash -x ./script.sh

如果您不想编辑脚本。您可以做的另一件事是创建一个包装脚本,例如

#!/bin/dash
set -x
. ./script.sh

在评论中,您说您不想将事物与破折号联系起来。你可以写一个程序,例如这个叫做 xtrace

#!/bin/bash
where=$(command -v "$1")
read line1 < "$where"
case "$line1" in
    (*"dash")
          # Assume if it mention dash on first line then it is a dash script
          exec /bin/dash -x "$@" ;;
    (*)
          SHELLOPTS=xtrace exec "$@" ;;
esac

然后使用它xtrace ./script.sh来运行它。

相关内容