带有文件参数的 tcl 可执行文件不起作用



我正在TCL/Tk中开发文件浏览器,我想添加一点东西来执行当前选择的命令(使用%l %f)%l执行完整列表和%f执行每个文件的逗号。我唯一的问题是,如果我键入像"gedit"这样的命令,例如它可以工作,但只要我输入带有参数的命令,它就不起作用......我一直在到处寻找,但我不明白...如果有人能帮助我...顺便说一句,getl var Name 是一个函数,它以完整路径 (/home/...) 返回我的文件名,如果我返回应该执行的字符串并将其放在终端中,它可以工作......

这是代码:

proc tl_exec {liste command } {
#lorsqu'il faut effectué la commande avec la liste en param
if { [string first "%l" $command] > 0} {
  foreach v $liste {
     lappend args [getl $v Name]
  } 
    set com [string map [list "%l" [join $args " "] ] $command ]
  puts $com
    set val [exec [split $com " "] ]
} elseif { [string first "%f" $command] > 0} {
#lorsqu'il faut effectué la commande pour chaque fichier        
  foreach v $liste {
            set com [string map list ["%f" [getl $v "Name"] ] $command ]
            lappend val [ exec [split $com " "] ]
    }
} else {
#lorsqu'on a pas de fichiers 
    set val [exec $command]
}
}

多谢

您的代码有多个问题,它也可能在文件名中使用特殊的字符或空格,因为您根本不引用。

但是你对 exec 将所有内容视为单个命令是正确的。

set val [exec [split $com " "] ]

不执行您所期望的操作,split 会返回一个列表,但不会自动将该列表转换为 exec 的额外参数。

如果您使用 Tcl 8.5,您可以尝试:

set val [exec {*}[split $com " "] ]

这会将列表转换为要传递给 exec 的单个参数。

但是你使用的代码通常是脆弱的,因为你不处理任何退出代码或写入stderr的程序,所以需要一个更详细的解决方案来健壮。

看看 http://wiki.tcl.tk/1039 尤其是页面底部的讨论。

最新更新