Scripting tk、tcl exec stderr、stdout分别

Scripting tk、tcl exec stderr、stdout分别,scripting,tcl,tk,Scripting,Tcl,Tk,我有一个tcl脚本 问题是我必须调用一个脚本,该脚本可以向stderr写入一些内容(这不是一个严重的失败) 我想在tk/tcl中分别捕获stderr和stdout if { [catch {exec "./script.sh" << $data } result] } { puts "$::errorInfo" } 如果{[catch{exec]/script.sh“使用2>重定向stderr: if { [catch {exec "./script.sh" <<

我有一个tcl脚本

问题是我必须调用一个脚本,该脚本可以向stderr写入一些内容(这不是一个严重的失败)

我想在tk/tcl中分别捕获stderr和stdout

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

如果{[catch{exec]/script.sh“使用2>重定向stderr:

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

如果将命令作为管道打开而不是使用
exec
,则可以分离stdout和stderr。请参阅


我希望在没有临时文件的情况下直接将其放入变量中。我知道这是可能的,但我真的不喜欢临时文件。小问题:在代码示例中包含右方括号。+1是一个很好的问题!
package require Tclx; # Needed for the read_file command
set err [read_file error.txt]
puts "s1: err = $err"
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}"