我有一个脚本,我使用set -x
在执行命令时打印这些命令的痕迹。
打印一系列简单命令,
for
命令,case
命令,select
命令和算术for
命令及其参数或 关联的单词列表在扩展之后和它们之前 执行。PS4
变量的值被扩展并得到结果 在命令及其扩展参数之前打印值。
有没有办法让这种行为,但不打印变量扩展?我正在捕获日志输出并将其发送到集中式记录器,但我不希望输出某些敏感变量的值。
答案 0 :(得分:8)
您可以像使用$ BASH_COMMAND一样使用陷阱DEBUG
#!/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 强>
如果设置,则DEBUG和RETURN上的任何陷阱都由shell函数,命令替换和子shell环境中执行的命令继承。在这种情况下,DEBUG和RETURN陷阱通常不会被继承。<强>阱强>
如果sigspec是DEBUG,则命令arg在每个简单命令之前执行,用于命令,case命令,select命令,命令的每个算术,以及在shell函数中执行第一个命令之前