4

すべてのコマンドがteeログ ファイルに記録されるスクリプトが必要です。

現在、スクリプト内のすべてのコマンドを次のように実行しています。

<command> | tee -a $LOGFILE

シェルスクリプトのすべてのコマンドを強制的にパイプする方法はありteeますか?

scriptteeの実行時にユーザーに適切な ingを追加するように強制することはできません。また、呼び出し元のユーザーが独自のログ呼び出しを追加しなくても、スクリプトが適切にログに記録されるようにしたいと考えています。

4

4 に答える 4

18

スクリプト内でラッパーを実行できます。

#!/bin/bash
{
echo 'hello'
some_more_commands
echo 'goodbye'
} | tee -a /path/to/logfile

編集:

別の方法は次のとおりです。

#!/bin/bash
exec > >(tee -a /path/to/logfile)
echo 'hello'
some_more_commands
echo 'goodbye'
于 2010-10-27T20:20:22.187 に答える
2

単純なラッパーを公開しない理由:

/path/to/yourOriginalScript.sh | tee -a $LOGFILE

あなたのユーザーは実行すべきではありません (また、知っていることさえありません) yourOriginalScript.sh

于 2010-10-27T20:02:35.633 に答える
2

スクリプトが引数を取らないと仮定すると、--teeこれを行うことができます (その引数を使用する場合は、--tee以下を使用しない引数に置き換えてください)。

#!/bin/bash

if [ -z "$1" ] || [ "$1" != --tee ]; then
  $0 --tee "$@" | tee $LOGFILE
  exit $?
else
  shift
fi
# rest of script follows

--teeこれは、特別な引数を使用して無限再帰を防ぎ、その出力を にパイプして、スクリプト自体を再実行するだけteeです。

于 2010-10-27T20:42:34.423 に答える
1

いくつかのアプローチは、すべてのユーザーが独自のスクリプトを呼び出すランナー スクリプト「run_it」の作成です。

run_it my_script

すべての魔法は内部で行われます。たとえば、次のようになります。

LOG_DIR=/var/log/
$@ | tee -a  $LOG_DIR/
于 2010-10-27T20:17:57.087 に答える