我必须运行许多由第三方定义的 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
来运行它。