web-dev-qa-db-ja.com

シェルスクリプトが行うすべてのアクティビティを記録する簡単な方法はありますか?

シェルスクリプトから発生するすべてのアクティビティをファイルに記録する簡単な方法はありますか?

スクリプトがあります。エコーの「命令」などの出力や、他のプログラム出力を出力します。私はコマンドを知っています:

command | tee -a "$log_file"

そして

command >> logifle.log

私が求めているのは、ロギング用のシェルパラメータがあるのか​​、私が使用できるsetコマンドなどがあるのか​​ということです。必要がなければ、ファイルに何十ものリダイレクトやTシャツを追加する必要はありません。私はまだ標準出力を取得したい-私はそれもログに記録したい:

17
j0h

通常foo.shを使用してスクリプトを実行する場合は、bash -x foo.shを使用して実行してみてください(bashスクリプトであると想定)。すべてをファイルにリダイレクトする場合は、bash -x foo.sh > file.log 2>&1を試してください(stderrもリダイレクトしていることに注意してください。これが必要ない場合は、2>&1を削除してください)。何が起こっているのかを確認したい場合は、bash -x foo.sh 2>&1 | tee log.file

17
roadmr

非常に簡単で便利な方法があります。

scriptを使用して、ターミナルセッションのTypeScriptを作成する

  1. コマンドscriptを開始します

    引数fileが指定されている場合、たとえばscript ~/tmp/outputscriptはダイアログをこのファイルに保存します。ファイル名が指定されていない場合、ダイアログはファイルTypeScriptに保存されます

  2. スクリプトを開始します

  3. スクリプトが終了したら、scriptを経由して停止します Ctrl-D

  4. デフォルトの出力ファイルTypeScriptの出力を確認します


scriptを使用してコマンドを1ステップで開始するには、パラメーター-cを使用します

-c COMMAND
    Run the COMMAND rather than an interactive 
    Shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

scriptはシェルをフォークするか、新しいシェルを起動するため、スクリプト内でscriptを使用しても意味がありません。

変数Shellが存在する場合、「スクリプト」によって分岐されたシェルはそのシェルになります。 Shellが設定されていない場合、Bourne Shellが想定されます。 (ほとんどのシェルはこの変数を自動的に設定します)。

19
A.B.