How can I print each command before executing?
建立一个在执行每个命令之前打印每个命令的bash脚本的最佳方法是什么?
这对于调试很有用。
我已经试过了:
1 2 3
| CMD="./my-command --params >stdout.txt 2>stderr.txt"
echo $CMD
`$CMD` |
应该先打印这个:
1
| ./my-command --params >stdout.txt 2>stderr.txt |
然后执行./my-command --params,输出重定向到指定的文件。
- 我想如果你把`$CMD`改成"$CMD",你会更幸运的。当bash遇到`$CMD`时,它用命令代替$CMD,你就只剩下`./my-command --params >stdout.txt 2>stderr.txt`了。因为它被包装在backticks中,所以bash将执行该命令,而不是将输出打印到stdout,而是将表达式(包括backticks)替换为命令的输出,并且由于该结果出现在命令行的开头,bash将尝试将输出解释为一个新的命令,这不是您想要的。
- @事实上,不要使用引号。使用引号,bash会尝试将整个字符串解释为命令的名称;如果不使用引号,bash会正确地扩展它,并将其视为一个命令,后跟参数、重定向等,就像直接键入命令时通常会解释它一样。
或
这与标准/bin/sh以及iirc一起工作(那时它可能是posix的东西)
记住,这里有bashdb(bash Shell Debugger, release 4.0-0.4)
要恢复正常,请退出子外壳或
- 很好,这里有更多关于这个的信息(在一个页面上,您也可以找到更多有用的信息):bash hacker wiki:bash调试提示-shell调试输出
- 也请注意bash -v/set -v,这两者略有不同,并且稍微不那么冗长。
- 这是POSIX。
- 另外,这种"逻辑括号"可能很有用:OPT=$-保存所有键,set -$OPT恢复。
- xtrace选项工作得很好,但是在我的环境中,点击自动完成选项卡会导致完成文件内容的转储。有没有一种方法可以在没有这种副作用的情况下打开?
- 它不会转储内容。它跟踪执行到完成的操作。您可以在跟踪时禁用bash_completion.d(您仍然可以在bash中内置文件名完成)@user1330734
- 为了详细介绍set -v,它在变量替换之前打印bash的原始行。
最简单的方法是让bash这样做:
或者以bash -x myscript的形式显式运行它。
- 值得注意的是,回显的命令被发送到stderr而不是stdout。
set -x很好,但是如果你做了如下的事情:
1 2 3
| set -x;
command;
set +x; |
它会导致打印
您可以使用子shell来防止这种情况,例如:
只打印命令。
set -x很好。
打印每个已执行命令的另一种方法是使用trap和DEBUG。将此行放在脚本开头:
1
| trap 'echo"# $BASH_COMMAND"' DEBUG |
你可以在这里找到很多其他的trap用法。