ダッシュ シェルの DEBUG 信号をトラップしますか?

ダッシュ シェルの DEBUG 信号をトラップしますか?

bash シェルを使用すると、合成信号にトラップをインストールできますDEBUG。これは便利で、すべてのシェル コマンドで関数またはコードの一部を実行します。例:

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG

ここでのアイデアは、例えばドロップインされたファイルにトラップをインストールし、/etc/profile.d/bash-loggerユーザーのシェルセッションコマンドが発生するたびに自動的にsyslogに記録することです。これは、リモートコマンドを簡単に追跡

dash シェルのソース コードを見ると、そのようなシグナルは利用できないようですDEBUG

ダッシュ シェルで同じ結果を達成するための回避策または代替手段はありますか?

答え1

最も徹底的なアプローチは、syslog サポートを有効にしてシェルを再コンパイルすることです。これにより、(何らかの理由で) ~/ をロードしないシェルも回避できます。何でも-profile または ~/.何でも-rc.

これは Bash の標準ソースにオプションとして含まれていますが、他のシェルの場合はパッチを見つけるか作成する必要がある場合があります。

コマンドは複数行にまたがることがあり、コマンドの半分は失敗するか、間違った動作をするため、1eval行ずつ読んで ing することをお勧めするのはためらわれます。影響を受けるコマンドの種類には、パイプラインと条件付きコマンド (各行が、またはで終わる)、複合コマンド (括弧で囲まれたグループを含む)、バックスラッシュで継続される行、複数行の引用符付き文字列、およびhere-docs が含まれます。(おそらく、私が考えていないものもたくさんあるでしょう。)eval&&|||<<

限られたケースでは、 または を stderr をパイプにリダイレクトして logger と組み合わせると便利かもしれませんset -v。ただし、実行するプログラムからも stderr がリダイレクトされるため、不完全です。(Bash では、書き込み先に の別のファイル記述子を選択できるため、その問題は解決します。)set -xset -x

ssh host some_command 実行する場合は、対話型シェルやログイン シェルは使用されないため、rc ファイルは読み込まれず、ログ記録がバイパスされることを指摘しておきます 。

関連情報