我有一个脚本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 -o
xtrace on
如果-x
使用则输出 ,否则输出xtrace off
。
答案3
尽管 @Patrick 的答案是“正确”的,但您也可以将参数或导出的变量传递到子脚本中,告诉它要做什么 - 例如打开跟踪。
这样做的缺点是(我相信)您必须将其重新导出到您即将输入的每个脚本级别。
它的优点是能够有选择地跟踪(或以其他方式影响)您需要输出/修改行为的脚本 - 以减少无关的输出等。例如,可以关闭调用脚本的跟踪,并且仍然在被调用的脚本中打开。这不是一个全有或全无的命题。
不是您问题的一部分,但相关:
我有时会定义一个变量,比如
E=""
E="echo "
或者
E=""
E=": "
并使用它(在多个语句中),例如
"${E}" rsync ...
或者,仅对于第二种变化,
"${E}" echo "this is a debugging message"
然后,当我想要运行命令时,我只需注释掉第二个定义。您还可以将此技术与参数或导出变量结合使用。
对于其中任何一个,您都必须注意复合语句,因为该方法只能保证对复合列表中的第一个语句起作用。
答案4
您可以获取进程的 PID,然后使用 ps 检查进程表以查看其参数是什么。