Использование команды diff из сценария tcl фиксирует ошибку «дочерний процесс завершен ненормально» - PullRequest
1 голос
/ 21 января 2011

В сценарии 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 ]

1 голос
/ 21 января 2011

Из моего diff(1): «Состояние выхода равно 0, если входные данные одинаковы, 1, если отличаются, 2, если возникли проблемы.»

Поскольку ненулевые возвраты являются обычным способом сообщения об ошибках в сценариях оболочки, tcl и diff не согласны со значением возвращаемого результата.Вероятно, для написания сценариев оболочки очень удобно знать, отличаются ли два файла от возвращаемого значения, но я не вижу какого-либо механизма, который бы отключал это на странице руководства.(Я бы предпочел использовать cmp -q только для того, чтобы узнать, отличаются ли два файла, не знаю, почему разные люди приняли решение, которое они приняли.)

Но вы можете забить это на работу, добавив ; true к вашей команде.

Более хитрым способом заставить его работать будет ошибка только при коде выхода 2: diff foo bar ; if [ $? -ne 2 ]; then true ; else false; fi;

Проверьте результаты с разными именами файлов и echo $? после каждого теста, чтобы увидеть, какие из них возвращают 0 (из true), а какие возвращают 1 (из false).

0 голосов
/ 21 января 2011

Способ справиться с этим в 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 .

...