如何设置Bash脚本以在执行之前打印每个命令?这对于调试非常有用。
我已经尝试过这种方法:
CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
`$CMD`
它应该先打印这个:
./my-command --params >stdout.txt 2>stderr.txt
然后执行./my-command --params
,并将输出重定向到指定的文件。
如何设置Bash脚本以在执行之前打印每个命令?这对于调试非常有用。
我已经尝试过这种方法:
CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
`$CMD`
它应该先打印这个:
./my-command --params >stdout.txt 2>stderr.txt
然后执行./my-command --params
,并将输出重定向到指定的文件。
set -o xtrace
或。bash -x myscript.sh
如果我没记错的话,这也适用于标准/bin/sh(可能是POSIX的事情)
还要记住,有bashdb(bash Shell Debugger, release 4.0-0.4
)
要恢复正常,请退出子shell或
set +o xtrace
bash -v
/ set -v
,这稍微有些不同,但更加简洁。 - tripleeeOPT=$-
以保存所有键,然后使用 set -$OPT
进行恢复。 - Tomilov Anatoliyset -v
,它会在变量替换之前打印 Bash 的原始行。 - Steve Bennettset -x
是可以的,但如果你做了类似这样的事情:
set -x;
command;
set +x;
这将导致打印
+ command
+ set +x;
你可以使用子shell来防止这种情况,例如:
(set -x; command)
它只会打印该命令。
最简单的方法是让 bash
来完成:
set -x
或者直接运行 bash -x myscript
。
BASH_XTRACEFD=1
打印到标准输出。为了避免 +
前缀,使用 PS4="\000"
。 - MartinBASH_XTRACEFD
仅适用于 bash 4.0 或更高版本(这意味着它不适用于 macOS 默认提供的 bash)。 - victorlinset -x
是可以的。
另一种打印每个执行命令的方法是使用带有 DEBUG
的 trap
。
在您的脚本开头放置此行:
trap 'echo "# $BASH_COMMAND"' DEBUG
你可以在这里找到很多其他的trap
用法here。
trap - DEBUG
。 - JJLL
\
$CMD`改成
"$CMD",我认为你会更幸运。当bash遇到
`$CMD`时,它会用命令替换
$CMD,然后你就会得到
`./my-command --params >stdout.txt 2>stderr.txt``。由于这被包含在反引号中,bash将执行该命令,而不是将输出打印到标准输出,它将用包括反引号的表达式替换为命令的输出。由于这最终出现在命令行的开头,bash将尝试将输出解释为新命令,这不是你想要的。 - HelloGoodbyePS4
变量以定义作为跟踪输出命令前缀显示的提示符。请参考以下链接:https://www.thegeekstuff.com/2008/09/bash-shell-take-control-of-ps1-ps2-ps3-ps4-and-prompt_command/ - 0 _eval
,而是教授数组和函数的使用原因。 - Charles Duffy