在tcl脚本中,我使用diff命令逐行比较文件
if {[catch {eval exec "diff /tmp/tECSv2_P_HTTP_XHDR_URL_FUNC_12.itcl /tmp/tempReformat"} results]} {
puts "$results"
}
正确获取diff命令的输出,但它捕获错误'子进程异常退出'
输出:
==>tclsh diffUsingScript
992c992
< fail "Redirection is not reflected in css messages"
---
> fail "Redirection is not reflected in css messages"
child process exited abnormally
因此获得此错误导致出错。我希望diff操作在我的tcl脚本中没有错误
答案 0 :(得分:1)
来自我的diff(1)
:“如果输入相同则退出状态为0,如果不同则退出1,如果有麻烦则退出2.”
由于非零返回是报告shell脚本中错误的常用方法,因此tcl和diff不同意返回结果的含义。编写shell脚本以了解两个文件是否与返回值不同可能非常方便,但我没有看到任何从该联机帮助页禁用该文件的机制。 (我宁愿使用cmp -q
来判断两个文件是否不同,不确定为什么差异人做出了他们做出的决定。)
但是你可以通过将; true
附加到你的命令来打击它。
使其更有效的方法是仅在2
退出代码时出错:diff foo bar ; if [ $? -ne 2 ]; then true ; else false; fi;
在每次测试后使用不同的文件名和echo $?
检查结果,看看哪些人正在返回0
(来自true
)以及哪些人正在返回1
(来自{ {1}})。
答案 1 :(得分:0)
在Tcl中处理此问题的方法是:
set rc [catch {exec diff f1 f2} output]
if {$rc == 0} {
puts "no difference"
} else {
if {[lindex $::errorCode 0] eq "CHILDSTATUS"} {
if {[lindex $::errorCode 2] == 1} {
puts "difference"
# show output without "child process exited abnormally" message
puts [string replace $output end-31 end ""]
} else {
puts "diff error: $output"
}
} else {
puts "error calling diff: $output"
}
}
参见有关Tcl Wiki exec page的讨论。