web-dev-qa-db-ja.com

スクリプトのすべての出力を(スクリプト自体から)ファイルにキャプチャします。

さまざまなコマンドを呼び出していくつかの出力(両方ともgit pullなどの呼び出されたコマンド自体から、およびOperation took XX minutesなどのスクリプト自体によって生成される有益なメッセージ)を出力するbashスクリプトを持っています。

出力全体をファイルにキャプチャしたいスクリプト自体から:基本的に、./myscript.sh > file.txtで呼び出さなくても済むようにしています-relevant-here理由。

基本的に私はこのようなことをしたいと思います:

startCapture

git pull

echo "Text"

other-command

endCapture

さらに、スクリプトの実行中に出力をシェルに出力する必要もあります。

最終的な目標は次のとおりです。

  1. 追加のシェル構成なしで./myscript.shを実行する
  2. 今と同じようにターミナルで出力を確認します
  3. 出力全体を含むディスク上のファイルを取得する

これは可能ですか?

任意のセッションからのすべての出力をキャプチャするために私が見つけた方法は、新しいbashセッションを開始し、ログファイルにティーすることです。スクリプトだけでなく、それ以上の追跡に非常に役立ちます。

 bash | tee〜/ bash.log #bashセッションが終了するまで標準出力を保存します
 bash | tee〜/ bash.log 2>&1 #bashセッションが終了するまで、エラーを含むすべての出力を保存します

または、自分でスクリプトをティーすることもできます

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

2
thebtm

tee を使用します。

例:

echo "Hello World" | tee out.txt

これにより、コマンドからの出力を含むファイルout.txtが作成され、画面に出力されます。ファイルに追加する場合は、「tee -a filename」を使用します。

echo "Hello" | tee -a out.txt
echo "World" | tee -a out.txt

out.txtには、HelloとWorldの2つの行があります(-aがない場合は、worldのみになります)

スクリプト全体を保存してスクリプト全体を出力する場合は、次のようにします。

./script.sh | tee output.txt
2
Mark

スクリプト内でいつでもscriptを呼び出して、すべてをログに記録できます。

すべてを同時にbashスクリプトでlog.txtに出力してログに記録するには:

#!/bin/bash

if [ -z "$SCRIPT" ]
then 
    /usr/bin/script log.txt /bin/bash -c "$0 $*"
    exit 0
fi

echo teste

ログを見るlog.txt

$ ./a.sh
Script started, output file is log.txt
teste

Script done, output file is log.txt
$ cat log.txt
Script started on Fri Feb 16 17:57:26 2018
command: /bin/bash -c ./a.sh 
teste

Script done on Fri Feb 16 17:57:26 2018
1
Rui F Ribeiro