使用来自tcl脚本的diff命令捕获错误'子进程异常退出'

时间:2011-01-21 09:05:44

标签: diff try-catch tcl

在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脚本中没有错误

2 个答案:

答案 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的讨论。