いくつかの機能を持つシェルスクリプトがあります。各コマンドの正常な実行をファイルとstderr / echoステートメントにキャプチャし、エラーメッセージを別のファイルにコピーしようとしています。ただし、エラーの説明はエラーファイルにリダイレクトされず、実際のログファイルにリダイレクトされます。以下は参考用のコードです。
Bash script
***********
#! /bin/sh
Function_1()
{
now=$( date '+%Y%m%d%H%M' )
eval logfile="$1"_"$now".log
exec 2>&1 1>>$logfile
echo " "
echo "############################"
echo "Function execution Begins"
echo "############################"
echo "Log file got created with file name as $1.log"
eval number=$1
eval path=$2
echo "number= $number"
ls -lR $path >> temp.txt
if [ $? -eq 0 ]; then
echo " Above query executed."
else
echo "Query execution failed"
fi
echo "############################"
echo "Function execution Ends"
echo "############################"
echo " "
}
ベストアンサー1
exec 2>&1 1>>$logfile
これはまずstderrを当時stdoutがある場所にリダイレクトし、それから標準出力をログファイルにリダイレクトします。その結果、stderrは端末に移動し、stdoutはログファイルに移動できます。
(実際には1つだけ言及されているので、出力を2つのファイルに生成する方法がわかりません。スクリプトをで実行するのではないとscript.sh > errorfile
奇妙です。)
もちろん、すべてのecho
コマンドは標準出力として印刷されるため、その出力はすべて同じ場所に送信されます。ls
ただし、エラーが発生して端末に移動する可能性があります。
一般出力とエラー出力を2つの異なるファイルにリダイレクトするには、次の手順を実行します。
exec 1>>"$logfile" 2>>"$errorfile"
これで、次のものを使用できます。
echo "Something worked normally"
そして
echo "This is an error message" >&2
ログに定常状態を出力し、エラーファイルにエラーを出力します。 (リダイレクトに注意してください。)
もう一つの点は:
eval logfile="$1"_"$now".log
eval number=$1
eval path=$2
ここのsは役に立ちません。たとえば、スペースが含まれているか悪い場合は、コマンド置換が含まれるとeval
問題が発生します。$1
だから彼らを殺す。シェルでの割り当てはなので、var=value
次のようになります。
logfile="$1"_"$now".log
number=$1
path=$2
最初はちょうどそれを書くことができますが、logfile=$1_$now.log
どちらがよりきれいかを決定することはあなたの分け前です。