私は次の行を持っています:
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
、エラーメッセージがに格納されます。グローバル変数を使用してエラーのタイプを区別することは可能ですが、そうしないことに注意してください(多くの場合、これは必要ありません)。errors
errorCode
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
場合に実行されます。catch
fgrepがファイルを見つけられないという質問にはコメントできませんでした。それがエラーなのか通常の状況なのかは私にはわかりません。