2010-09-14 5 views
3

Je veux créer une console simple en Tcl/TkComment diviser une variable en deux arguments avec exec en TCL?

J'ai deux problèmes. En changeant d'abord tous les * avec un [glob *] mais aussi, quand mon entrée contient "ls -a", il ne comprend pas que ls est la commande et -a le premier arg.

Comment puis-je gérer cela?

Merci

proc execute {} { 
    # ajoute le contenu de .add_frame.add_entry 
    set value [.add_frame.add_entry get] 
    if {[string compare "$value" ""] == 1} { 
    .text insert end "\n\n% $value\n" 
     .text insert end [exec $value] 
    .add_frame.add_entry delete 0 end 
    } 
} 

frame .add_frame 

label .add_frame.add_label -text "Nouvel élément : " 
entry .add_frame.add_entry 
button .add_frame.add_button -text "Executer" -command execute 
button .add_frame.exit_button -text "Quitter" -command exit 

bind .add_frame.add_entry <Return> execute 
bind .add_frame.add_entry <KP_Enter> execute 
bind . <Escape> exit 
bind . <Control-q> exit 

pack .add_frame.add_label -side left 
pack .add_frame.exit_button -side right 
pack .add_frame.add_button -side right 
pack .add_frame.add_entry -fill x -expand true 

pack .add_frame -side top -fill x 

text .text 
.text insert end "% Tcl/Tk Console" 

pack .text -side bottom -fill both -expand true 

Répondre

7

La réponse simple à Tcl 8.5 est d'utiliser ceci:

exec {*}$value 

Dans 8.4 et avant que la syntaxe n'existait pas. Cela veut dire que beaucoup de gens ont écrit ceci:

eval exec $value 

Mais en réalité, la version sûre était l'un de ces:

eval exec [lrange $value 0 end] 
eval [linsert $value 0 exec] 

Bien sûr, si le $value vient de l'utilisateur directement alors vous êtes mieux à l'aide d'un shell système pour évaluer depuis plus d'utilisateurs attendent ce genre de syntaxe:

exec /usr/bin/bash -c $value 
+1

+1 pour suggérer « sh -c $ value » - vous ne voulez probablement pas de construire un analyseur shell en Tcl . –

+0

Mais si vous voulez vraiment émuler la syntaxe du shell dans Tcl, vous voudrez peut-être jeter un oeil à mon code lié depuis http://wiki.tcl.tk/gush, en particulier les procédures tokeinise et shellrun. –

Questions connexes