5

私はtclスクリプトを持っています。

問題は、stderr に何かを書き込むことができるスクリプトを呼び出さなければならないことです (これは重大な失敗ではありません)。

tk/tcl で stderr と stdout を別々にキャプチャしたいと考えています。

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

このコードは結果を返しますが、stderr も含まれています。

また、結果を変数に取得したいと思います。

前もって感謝します...

4

2 に答える 2

5

を使用する代わりにコマンドをパイプとして開くと、execstdout と stderr を分離できます。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}"
于 2009-10-26T10:55:29.080 に答える
2

2>を使用してstderrをリダイレクトします。

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

その後、error.txtの内容を読むことができます。

package require Tclx; # Needed for the read_file command
set err [read_file error.txt]
puts "s1: err = $err"
于 2009-10-26T03:00:46.457 に答える