tcl exec 与参数中的文件不起作用

cha*_*rly 1 arguments file tcl exec

我正在使用 TCL/Tk 中的文件浏览器,我想添加一些东西来执行当前选择的命令(使用 %l %f) %l 执行完整列表, %f 执行每个文件的命令。我唯一的问题是,如果我输入一个像“gedit”这样的命令,例如它可以工作,但是一旦我输入一个带参数的命令,它就不起作用......我到处找,但我没有得到它。 .. 如果有人可以帮助我... btw getl var Name 是一个函数,它在完整路径 (/home/...) 中返回一个 FileName,如果我返回应该执行的字符串并将其放入终端它工作...

这是代码:

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

非常感谢

sch*_*enk 5

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

但是您对 exec 将所有内容都视为一个命令是正确的。

set val [exec [split $com " "] ]
Run Code Online (Sandbox Code Playgroud)

没有按照您的预期执行,split 返回一个列表,但不会自动将该列表转换为 exec 的额外参数。

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

set val [exec {*}[split $com " "] ]
Run Code Online (Sandbox Code Playgroud)

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

但是您使用的代码通常很脆弱,因为您不处理任何退出代码或写入 stderr 的程序,因此需要一个更复杂的解决方案才能健壮。

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