2016-06-16 12 views
1

私はset -xを使って実行されたコマンドのトレースをプリントするスクリプトを持っています。変数の展開をせずにbashでコマンドのトレースを出力する

印刷単純なコマンド、forコマンド、caseコマンド、select コマンド、および算術forコマンドとその引数または 関連する単語リストの跡それらが展開された後、それらが を実行される前に。 PS4変数の値が展開され、結果の の値がコマンドと展開された引数の前に出力されます。

この現象が発生する方法はありますか?は変数の拡張を出力しますか?ログの出力をキャプチャして集中型ロガーに送信していますが、特定の機密変数の値を出力しないようにしています。

+1

脇に:重要な値がコマンドラインに含まれている場合、同じマシンにログインしているすべてのユーザーがそれらを見ることができます。ちょうどあなたが知っているので:) – Thomas

+0

これらのマシンは非常にロックダウンされているので、誰かが同じホストにログインしているのは、私が守ろうとしているものではありません。代わりに、私はちょうどログにこの値が表示されないようにしたい。事実上、ログを 'grep -v'することでこれを行うことができますが、出力を完全に停止することができればそれが望ましいでしょう。 – obeattie

+0

@obeattieそして 'grep -v'は展開と固定値の違いを知る方法がないので面倒です:' bash -xc 'a = "hello"; echo "$ a" "hello" '' – andlrc

答えて

7

あなたがそう

#!/bin/bash 

set -T 

trap 'echo "$PS4$BASH_COMMAND"' DEBUG 

i=1234 

echo "$i" 

(echo $i) 

これが印刷されますように$ BASH_COMMANDでトラップDEBUGを使用することができます

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

BASH_COMMAND
コマンドは、現在実行されているかについてのない限り、実行されますシェルはトラップの結果としてコマンドを実行しています。この場合、トラップ時に実行されているコマンドです。

-T
セットした場合、DEBUGとRETURN上の任意のトラップがサブシェル環境で実行シェル関数、コマンド置換、およびコマンドによって継承されています。 DEBUGおよびRETURNトラップは、通常このような場合継承されません。

トラップ
のsigspecがDEBUG、コマンド引数は、コマンド、ケースコマンド、選択コマンド、コマンド毎の演算のために、すべての単純なコマンドの前に実行されている場合は最初のコマンドは、シェル関数

に実行される前に
関連する問題