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)
非常感谢
您的代码有多个问题,它也可能会因文件名中的特殊字符或空格而中断,因为您根本没有引用。
但是您对 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尤其是页面底部的讨论。