我有以下一行:
if {[catch {exec fgrep E- $log_file} errors]} {
set errors ""
}
这是做什么的?
catch
命令是否将fgrep
中找到的所有行都放入errors
?fgrep
引发的错误,例如,如果该文件不存在?if
什么时候会被采取,什么时候不采取?答案 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找不到文件的问题,我无法发表评论。我不清楚这是错误还是正常情况。