Bash:测试原始脚本是否使用“-x”运行

Bash:测试原始脚本是否使用“-x”运行

是否可以测试 bash 脚本是否被执行-x

我正在编写一个也运行一些远程脚本的脚本,我希望能够执行以下操作:

USE_X="$( run_with_x && "-x" || "" )"
ssh $host "bash $USE_X some_script.sh"

答案1

只需查看$-变量即可。

USE_X=`case "$-" in *x*) echo "-x" ;; esac`

(是的,我确实在不调用 grep 的情况下做到了这一点。保存 pid!)

答案2

如果脚本使用 运行-x,则该表达式将为 true,否则为 false:[[ $- =~ x ]] 因此,如果脚本使用-xand “”(空)运行,则该表达式将为“-x”,否则:$([[ $- =~ x ]] && echo "-x")

答案3

可能是最简单的解析方法$-,类似于达格布朗法(也是纯的bash),但不使用case和反引号(子shell):

if  [[ ${-/x} != $- ]] ; then USE_X="-x"; fi

甚至更短:

[[ ${-/x} != $- ]] && USE_X="-x"

请注意,这[[不是内置程序的调用test(如 的情况[),但是 bash 语法构造(根据man bash这个开发者推荐)。所以我声称它是“更纯粹的狂欢”;)

答案4

bash 手册页文档set -o xtrace相当于set -x,这又相当于-x作为 shell 的参数。 (到目前为止,这与 SUSv3 sh 兼容,但-o option需要注意“如果系统支持用户可移植性实用程序选项”。)

此外,set -o如果没有选项,则会打印所有-o选项的当前状态。 (SUSv3 也指定了这一点,但没有用处;格式未指定,因此只有当您知道正在运行的 shell 使用类似于 bash 的格式时,您才能依赖它。)

所以,管道set -o | grep xtrace | grep -q on应该就是您正在寻找的。

相关内容