以下tcl代码将做什么?

时间:2012-05-24 08:20:06

标签: if-statement try-catch tcl

我有以下一行:

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

这是做什么的?

  • catch命令是否将fgrep中找到的所有行都放入errors
  • 它是否仅存在fgrep引发的错误,例如,如果该文件不存在?
  • if什么时候会被采取,什么时候不采取?

2 个答案:

答案 0 :(得分:4)

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

exec fgrep E- $log_file

针对名称存储在变量fgrep E-中的文件运行log_file。如果exec存在语法问题(谢天谢地),fgrep程序的语法问题(对我来说看起来不错),如果{{1},则会产生Tcl错误}不存在,或者没有匹配。如果没有错误,则返回grepping,warts和all的输出。

$log_file

它在一个捕获错误的环境中运行上面的代码,并返回是否发生错误(正式地,它在没有错误时返回0,在发生错误时返回1,以及其他不常见类型的其他代码)在这种情况下不会发生的特殊回报)。如果没有错误发生,则catch {exec fgrep E- $log_file} errors 的正常结果存储在exec变量中,如果 错误,则错误消息存储在errors中。请注意,可以通过全局errors变量区分错误类型,但您不这样做(而且通常不需要)。

errorCode

这使用上面if {[catch {exec fgrep E- $log_file} errors]} { set errors "" } 的结果作为布尔值:如果发生错误,它会评估正文(将catch变量设置为空字符串),否则它不会做任何额外的操作

摘要

总体,您的代码将errors设置为errors中文件中找到的以换行符分隔的行,否则将log_file设置为空字符串。

答案 1 :(得分:1)

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

如果if发现错误,则会catch。关于fgrep找不到文件的问题,我无法发表评论。我不清楚这是错误还是正常情况。