我有以下行:
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 找不到文件的问题。我不清楚这是错误还是正常情况。