Unix - 2つのファイルのstderrとstdout

Unix - 2つのファイルのstderrとstdout

いくつかの機能を持つシェルスクリプトがあります。各コマンドの正常な実行をファイルと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どちらがよりきれいかを決定することはあなたの分け前です。

おすすめ記事