2

私は次の行を持っています:

if {[catch {exec fgrep E- $log_file} errors]} {
    set errors ""
}

これは何をしますか?

  • catchコマンドは、ログファイルで見つかったすべての行をfgrepログファイルに入れerrorsますか?
  • fgrepたとえば、ファイルが存在しない場合などにスローされたエラーのみが表示されますか?
  • いつif服用し、いつ服用しないのですか?
4

2 に答える 2

4

コードを裏返しに分解してみましょう。

exec fgrep E- $log_file

これはfgrep E-、名前が変数に格納されているファイルに対して実行されますlog_fileexec(ありがたいことに)構文上の問題がある場合、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され、それ以外の場合は空の文字列に設定されます。

于 2012-05-24T09:37:07.577 に答える
1

はい、あなたが正しい。コマンドexec fgrep E- $log_fileがエラーを返すと、エラーがキャッチされ、変数errorsにエラーメッセージが割り当てられます。この場合、execキャッチされているのはコマンドの結果です。マニュアルを見ると、execがエラーを返す方法の詳細を確認できます。コード例は、errors変数をすぐに上書きします。errorsこれは、変数名の少し誤解を招く選択であると付け加えておきresultsます。エラーが発生するかどうかに関係なく変数が設定されるため、より良いでしょう。

したがって、がエラーを検出したif場合に実行されます。catchfgrepがファイルを見つけられないという質問にはコメントできませんでした。それがエラーなのか通常の状況なのかは私にはわかりません。

于 2012-05-24T08:44:11.650 に答える