如何判断当前执行的 bash 脚本是否已使用 -x 调用进行调试?

如何判断当前执行的 bash 脚本是否已使用 -x 调用进行调试?

我有一个脚本launch.sh,它以另一个用户的身份执行自身,以便创建具有正确所有者的文件。如果最初传递给脚本,我想将 -x 传递给此调用

if [ `whoami` == "deployuser" ]; then
  ... bunch of commands that need files to be created as deployuser
else
  echo "Respawning myself as the deployment user... #Inception"
  echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
  sudo -u deployuser -H bash $0 "$@"  # How to pass -x here if it was passed to the script initially?
fi

我读过bash 调试页面但似乎没有明确的选项可以告诉您原始脚本是否是使用 启动的-x

答案1

bash许多可以在命令行上传递的标志都是set标志。set是内置的 shell,可以在运行时切换这些标志。例如,调用脚本 as与在脚本顶部bash -x foo.sh执行的操作基本相同。set -x

知道这set是内置的 shell 负责的,让我们知道去哪里寻找。现在我们可以这样做help set并得到以下结果:

$ help set
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
...
      -x  Print commands and their arguments as they are executed.
...
    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.
...

所以从这里我们看到$-应该告诉我们启用了哪些标志。

$ bash -c 'echo $-'
hBc

$ bash -x -c 'echo $-'
+ echo hxBc
hxBc

所以基本上你只需要这样做:

if [[ "$-" = *"x"* ]]; then
  echo '`-x` is set'
else
  echo '`-x` is not set'
fi

作为奖励,如果您想复制所有标志,您也可以这样做

bash -$- /other/script.sh

答案2

set -oxtrace on如果-x使用则输出 ,否则输出xtrace off

答案3

尽管 @Patrick 的答案是“正确”的,但您也可以将参数或导出的变量传递到子脚本中,告诉它要做什么 - 例如打开跟踪。

这样做的缺点是(我相信)您必须将其重新导出到您即将输入的每个脚本级别。

它的优点是能够有选择地跟踪(或以其他方式影响)您需要输出/修改行为的脚本 - 以减少无关的输出等。例如,可以关闭调用脚本的跟踪,并且仍然在被调用的脚本中打开。这不是一个全有或全无的命题。

不是您问题的一部分,但相关:

我有时会定义一个变量,比如

E=""
E="echo "

或者

E=""
E=": "

并使用它(在多个语句中),例如

"${E}" rsync ...

或者,仅对于第二种变化,

"${E}" echo "this is a debugging message"

然后,当我想要运行命令时,我只需注释掉第二个定义。您还可以将此技术与参数或导出变量结合使用。

对于其中任何一个,您都必须注意复合语句,因为该方法只能保证对复合列表中的第一个语句起作用。

答案4

您可以获取进程的 PID,然后使用 ps 检查进程表以查看其参数是什么。

相关内容