2

我有以下行:

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

这是做什么的?

  • 该命令是否将在日志文件中catch找到的所有行放入?fgreperrors
  • 它是否只会放在那里抛出的错误fgrep,例如如果文件不存在?
  • 什么时候if拿,什么时候不拿?
4

2 回答 2

4

让我们从内到外解构您的代码。

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为空字符串。

于 2012-05-24T09:37:07.577 回答
1

你是对的。如果命令exec fgrep E- $log_file返回任何错误,它们将被捕获并且变量errors将被分配错误消息。在这种情况下,exec捕获的是命令的结果。查看手册,您可以看到 exec 如何返回错误的特殊性。您的代码示例会立即覆盖该errors变量。我应该补充一点errors,变量名称的选择有点误导 -results会更好,因为无论是否发生错误都会设置变量。

因此,如果发现错误,if将采取。catch我无法评论有关 fgrep 找不到文件的问题。我不清楚这是错误还是正常情况。

于 2012-05-24T08:44:11.650 回答