私は次の行を持っています:
if {[catch {exec fgrep E- $log_file} errors]} {
set errors ""
}
これは何をしますか?
catchコマンドは、ログファイルで見つかったすべての行をfgrepログファイルに入れerrorsますか?fgrepたとえば、ファイルが存在しない場合などにスローされたエラーのみが表示されますか?- いつ
if服用し、いつ服用しないのですか?
私は次の行を持っています:
if {[catch {exec fgrep E- $log_file} errors]} {
set errors ""
}
これは何をしますか?
catchコマンドは、ログファイルで見つかったすべての行をfgrepログファイルに入れerrorsますか?fgrepたとえば、ファイルが存在しない場合などにスローされたエラーのみが表示されますか?if服用し、いつ服用しないのですか?コードを裏返しに分解してみましょう。
exec fgrep E- $log_file
これはfgrep E-、名前が変数に格納されているファイルに対して実行されますlog_file。exec(ありがたいことに)構文上の問題がある場合、fgrepプログラムに構文上の問題がある場合(私には問題ないように見えます)、$log_file存在しない場合、または一致するものがなかった場合、Tclエラーが生成されます。エラーがなかった場合は、grepping、warts、およびすべての出力を返します。
catch {exec fgrep E- $log_file} errors
これは、エラーをトラップする環境で上記のコードを実行し、エラーが発生したかどうかを返します(正式には、エラーがなかった場合は0を返し、エラーがあった場合は1を返し、その他のあまり一般的でないタイプの例外的な戻り値を返します。この場合は発生しません)。エラーが発生しなかった場合、の通常の結果が変数execに格納され、エラーが発生した場合errors、エラーメッセージがに格納されます。グローバル変数を使用してエラーのタイプを区別することは可能ですが、そうしないことに注意してください(多くの場合、これは必要ありません)。errorserrorCode
if {[catch {exec fgrep E- $log_file} errors]} {
set errors ""
}
これは、catch上記の結果をブール値として使用します。エラーが発生した場合は、本体(errors変数を空の文字列に設定します)を評価し、それ以外の場合は追加の処理を行いません。
全体として、コードはerrorsのファイルにある改行で区切られた行にlog_file設定errorsされ、それ以外の場合は空の文字列に設定されます。
はい、あなたが正しい。コマンドexec fgrep E- $log_fileがエラーを返すと、エラーがキャッチされ、変数errorsにエラーメッセージが割り当てられます。この場合、execキャッチされているのはコマンドの結果です。マニュアルを見ると、execがエラーを返す方法の詳細を確認できます。コード例は、errors変数をすぐに上書きします。errorsこれは、変数名の少し誤解を招く選択であると付け加えておきresultsます。エラーが発生するかどうかに関係なく変数が設定されるため、より良いでしょう。
したがって、がエラーを検出したif場合に実行されます。catchfgrepがファイルを見つけられないという質問にはコメントできませんでした。それがエラーなのか通常の状況なのかは私にはわかりません。