在没有可变扩展的情况下,在bash中打印一条命令



我有一个脚本,我正在为其使用set -x在执行时打印命令的跟踪。

打印一个简单命令,for命令,case命令,select 命令和算术for命令及其参数或 关联的单词列表被扩展和之前 执行。PS4变量的值扩展了,结果 值是在命令及其扩展参数之前打印的。

有没有办法获得这种行为,但是不是打印变量扩展?我正在捕获日志输出并将其发送到集中式记录器,但是我不希望输出某些敏感变量的值。

您可以使用$ bash_command使用陷阱调试

#!/bin/bash
set -T
trap 'echo "$PS4$BASH_COMMAND"' DEBUG
i=1234
echo "$i"
(echo $i)

这将打印

+ i=1234
+ echo "$i"
1234
+ echo $i
1234

bash_command
除非shell是陷阱的结果,否则当前正在执行或即将执行的命令,除非在陷阱时执行命令,否则是在陷阱时执行的命令。

-t
如果设置,调试和返回上的任何陷阱都由Shell功能,命令替换和在子壳环境中执行的命令继承。在这种情况下,调试和返回陷阱通常不会继承。

陷阱
如果SIGSPEC是调试的,则在每个简单命令之前执行命令ARG,for命令,case命令,选择命令,每个命令的每个算法,以及第一个命令在shell函数中执行