tcl exec с файлом в параметре не работает - PullRequest
1 голос
/ 10 мая 2011

Я работаю над проводником файлов inTCL / Tk и хочу добавить кое-что для выполнения команд с текущим выбором (используя% l% f),% l, выполняющих с полным списком, и% f, выполняющих команду скаждый файл.Моя единственная проблема заключается в том, что если я набираю команду типа "gedit", например, она работает, но как только я набираю команду с аргументом, она не работает ... Я искал везде и не получаю ее... Если кто-то может мне помочь ... кстати getl var Name - это функция, которая возвращает мне FileName по полному пути (/ 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]
}
}

Большое спасибо

1 Ответ

4 голосов
/ 10 мая 2011

В вашем коде более одной проблемы, он, вероятно, будет также содержать специальные символы или пробелы в именах файлов, поскольку вы вообще не заключаете в кавычки.

Но вы правы в том, что exec рассматривает все как одну команду.

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

не делает то, что вы ожидаете, split возвращает список, но не превращает этот список автоматически в дополнительные аргументы для exec.

Если вы используете Tcl 8.5, вы можете попробовать:

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

, который превращает список в отдельные аргументы для передачи в exec.

Но код, который вы используете, в целом хрупок, так как вы не обрабатываете какие-либо коды выхода или программы, пишущие в stderr, поэтому для обеспечения надежности потребуется более сложное решение.

Взгляните на http://wiki.tcl.tk/1039, особенно на обсуждения внизу страницы.

...