2009-10-25 3 views
3

У меня есть сценарий tcl.tk, tcl exec stderr, stdout отдельно

Проблема в том, что я должен вызвать скрипт, который может написать что-то в stderr (это не критический сбой).

Я хотел бы снять stderr и stdout отдельно в tk/tcl.

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

Этот код вернет мой результат, но также содержит stderr.

Также я хотел бы получить результат для переменной.

Заранее спасибо ...

+0

Незначительная проблема: включить замыкающий квадратный кронштейн в пример кода. +1 за отличный вопрос! –

ответ

3

Если вы откроете команда как трубка вместо использования exec, вы можете разделить stdout и 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}" 
+0

спасибо ... заработал так ... – Egon

1

Используйте 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" 
+0

Я надеялся получить его прямо в переменную без временных файлов. Я знал, что это возможно, но мне действительно не нравятся временные файлы. – Egon

Смежные вопросы