Как разделить переменную на два аргумента с помощью exec в TCL? - PullRequest
3 голосов
/ 14 сентября 2010

Я хочу создать простую консоль в Tcl / Tk

У меня две проблемы. Сначала меняя каждый * с помощью [glob *], но также, когда моя запись содержит «ls -a», он не понимает, что ls - это команда, а -a первый аргумент.

Как мне это сделать?

Спасибо

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

1 Ответ

7 голосов
/ 14 сентября 2010

Простой ответ в Tcl 8.5 - использовать это:

exec {*}$value

В 8.4 и ранее этот синтаксис не существовал. Это означало, что многие люди написали это:

eval exec $value

Но на самом деле безопасная версия была одной из них:

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

Конечно, если $value исходит прямо от пользователя, вам лучше использовать системную оболочку для его оценки, поскольку все больше пользователей ожидают такой синтаксис:

exec /usr/bin/bash -c $value
...