2009-10-25 14 views
3

J'ai un script tcl.tk, tcl exec stderr, stdout séparément

Le problème est que je dois appeler un script qui peut écrire quelque chose à stderr (ce n'est pas un échec critique).

Je voudrais capturer stderr et stdout séparément dans tk/tcl.

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

Ce code renverra mon résultat mais il contient également stderr.

Aussi je voudrais obtenir le résultat à une variable.

Merci à l'avance ...

+0

Problème mineur: inclure le crochet de fermeture dans votre exemple de code. +1 pour une bonne question! –

Répondre

3

Si vous ouvrez la commande comme un tuyau au lieu d'utiliser exec, vous pouvez séparer stdout et stderr. Voir 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

merci ... ça fonctionne comme ça ... – Egon

1

Utilisez les 2> pour rediriger stderr:

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

Vous pouvez alors lire le contenu de error.txt:

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

J'espérais l'obtenir directement dans une variable sans fichiers temporaires. Je savais que c'était possible de cette façon mais je n'aime vraiment pas les fichiers temporaires. – Egon