如何在 TCL 中使用 exec 将变量拆分为两个参数?

发布于 2024-09-19 09:25:54 字数 1138 浏览 8 评论 0原文

我想在 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

I want to create a simple Console in Tcl/Tk

I have two problems. First changing every * with a [glob *] but also, when my entry contains "ls -a" it doesn't understand that ls is the command and -a the first arg.

How can I manage to do that ?

Thanks

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你又不是我 2024-09-26 09:25:54

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

exec {*}$value

在 8.4 及之前的版本中,该语法不存在。这意味着很多人这样写:

eval exec $value

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

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

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

exec /usr/bin/bash -c $value

The simple answer in Tcl 8.5 is to use this:

exec {*}$value

In 8.4 and before, that syntax didn't exist. That meant that many people wrote this:

eval exec $value

But in reality, the safe version was one of these:

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

Of course, if the $value is coming straight from the user then you're better off using a system shell to evaluate it since more users expect that sort of syntax:

exec /usr/bin/bash -c $value
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文