如何在TCL中用exec拆分两个args中的变量?

Nat*_*tim 3 bash tcl exec

我想在Tcl/Tk中创建一个简单的控制台

我有两个问题.首先用[glob*]更改每个*但是,当我的条目包含"ls -a"时,它不理解ls是命令和-a第一个arg.

我怎么能设法做到这一点?

谢谢

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
Run Code Online (Sandbox Code Playgroud)

Don*_*ows 7

Tcl 8.5中的简单答案是使用:

exec {*}$value
Run Code Online (Sandbox Code Playgroud)

在8.4及之前,该语法不存在.这意味着许多人写道:

eval exec $value
Run Code Online (Sandbox Code Playgroud)

但实际上,安全版本就是其中之一:

eval exec [lrange $value 0 end]
eval [linsert $value 0 exec]
Run Code Online (Sandbox Code Playgroud)

当然,如果$value直接来自用户,那么最好使用系统shell来评估它,因为更多用户期望这种语法:

exec /usr/bin/bash -c $value
Run Code Online (Sandbox Code Playgroud)