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


18

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

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

command | tee -a "$log_file"

そして

command >> logifle.log

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


5
笑、:wq私はvimにいたように '
j0h

1
ほとんどの人が:xの代わりにそれをしているように見えることは私の心を揺るがします
謝罪し、モニカ

回答:


18

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


20

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

scriptターミナルセッションのタイプスクリプトの作成に使用

  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シェルが想定されます。(ほとんどのシェルはこの変数を自動的に設定します)。


4
@ファビー私は私の答えは好きですが、私は小さな灰色のものを見ません;)
AB

私はを使用script logfilenameしているので、それを選択します。
ワルチネーター

シェルプログラムから「スクリプト」を呼び出すことができますか?
-j0h

1
これは意味がありません、私の改善された答えを参照してください。
AB

1
+1。この答えをありがとう:-) scriptfifoを介した監視にも役立ちます。From man script:「-f, --flush各書き込み後の出力をフラッシュします。これは遠隔操作に適しています。1人が実行しmkfifo foo; script -f foo、もう1人が実行中の処理をリアルタイムで監視できますcat foo」。また、たとえばfifoのタイムスタンプを監視することにより、プログラムが入力を待機しているときや完了したときを監視するためにも使用できます。
sudodus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.