5 Stimmen

tk, tcl exec stderr, stdout getrennt

Ich habe ein tcl-Skript.

Das Problem ist, dass ich ein Skript aufrufen muss, das etwas in stderr schreiben kann (es ist kein kritischer Fehler).

Ich möchte stderr und stdout separat in tk/tcl erfassen.

if { [catch {exec "./script.sh" << $data } result] } {
   puts "$::errorInfo"
}

Dieser Code liefert mein Ergebnis, aber er enthält auch stderr.

Außerdem möchte ich das Ergebnis in eine Variable übertragen.

Vielen Dank im Voraus...

5voto

glenn jackman Punkte 221248

Wenn Sie den Befehl als Pipe öffnen, anstatt die exec können Sie stdout und stderr trennen. Siehe http://wiki.tcl.tk/close

set data {here is some data}
set command {sh -c {
    echo "to stdout"
    read line
    echo "$line"
    echo >&2 "to stderr"
    exit 42
}}
set pipe [open "| $command" w+]
puts $pipe $data
flush $pipe
set standard_output [read -nonewline $pipe]
set exit_status 0
if {[catch {close $pipe} standard_error] != 0} {
    global errorCode
    if {"CHILDSTATUS" == [lindex $errorCode 0]} {
        set exit_status [lindex $errorCode 2]
    }
}
puts "exit status is $exit_status"
puts "captured standard output: {$standard_output}"
puts "captured standard error: {$standard_error}"

2voto

Hai Vu Punkte 33787

Verwenden Sie die 2>, um stderr umzuleiten:

if { [catch {exec "./script.sh" << $data 2> error.txt} result } {
   puts "$::errorInfo"
}

Sie können dann den Inhalt der Datei error.txt lesen:

package require Tclx; # Needed for the read_file command
set err [read_file error.txt]
puts "s1: err = $err"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X