いくつかの機能を持つシェルスクリプトがあります。各コマンドの正常な実行をファイルと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
どちらがよりきれいかを決定することはあなたの分け前です。
答え2
echo "Query execution failed"
これは単なる意味論的なエラーメッセージです。
exec 2>&1 1>>$logfile
これは言葉になります。最初の部分は何もしません。私は最近bobdylanでテストしました。しかし、言及したエラーファイルはどこにありますか?
コメントを理解します。このスクリプトは説明が簡単ではありません。
以下はいくつかの基本的な例です。ユーザーbodylanが見つかりません。
]# ls . NOsuch
ls: cannot access 'NOsuch': No such file or directory
.:
foo
どちらも標準出力デバイス「ターミナル」STDOUT 1
に移動します。STDERR 2
それでは、2つを分けましょう。 /dev/nullの代わりに任意のファイル名を入力できます。
]# ls . NOsuch >/dev/null
ls: cannot access 'NOsuch': No such file or directory
]# ls . NOsuch 2>/dev/null
.:
foo
]# ls . NOsuch >/dev/null 2>&1
(EMPTY)
]# ls . NOsuch 2>&1 >/dev/null
ls: cannot access 'NOsuch': No such file or directory
(2>&1 has no effect)
そして
ls ... >ls.out 2>ls.ERRORS
...出力は生成されませんが、2つの「ストリーム」を別々に保存する必要があります。
スクリプトを単純に保ち、呼び出すときに違いを作ります。
答え3
前述のように、STDERRとSTDOUTを同じファイルにリダイレクトします。
... exec 2>&1 1>>$logfile
この行はSTDERRをSTDOUTにリダイレクトし、STDOUT(またはSTDERR)をファイル記述子$ logfileにリダイレクトします。リダイレクトとファイル記述子は混乱する可能性があります。ただし、いくつかの有用な情報については、以下を確認してください。
https://likegeeks.com/shell-scripting-awesome-guide-part4/
また、Linux リダイレクトと Linux ファイル記述子をインターネットで検索することも役に立ちます。
乾杯、
ジョホール