Tcl передает аргументы как есть для обработки

Я хочу отправить команду

exp_send -i $sid -- "yes\r"

к функции, которая будет выполнять команду и проверять ошибки. должно быть :

catch {exp_send -i $sid -- "yes\r"}

куда :

[catch {$cmd [join $args]}

что не так в этом коде:

package require Expect

proc ErrorDetector {cmd args} {

    global res

    if { [catch {$cmd [join $args]} results] } {
       puts "Connection Could not open for exp_send\n $results"
       return -level 0 0
     }

    puts sion.
}


global spawn_id
set sid [spawn cmd.exe]
exp_send {ssh [email protected]}


ErrorDetector exp_send -i $sid -- "yes\r"

команда:

$cmd [join $args]

не работает как:

$cmd [join $args]

person Sion C    schedule 13.11.2014    source источник


Ответы (1)


Если у вас достаточно свежая версия Tcl для Expect, вы можете сделать:

$cmd {*}$args

В противном случае в более старых версиях Tcl (8.4 и ранее) правильный способ сделать это — один из следующих:

eval [list $cmd] $args
# Paranoid version: eval [list $cmd] [lrange $args 0 end]
eval [linsert $args 0 $cmd]

Все вышеперечисленное точно сохранит слова, которые вы дали в качестве аргументов вашей процедуре. Вещи с join не будут; эта команда предназначена, в частности, для создания таких вещей, как удобочитаемые списки вещей, а также для работы с записями «базы данных» старого стиля, которые вы найдете в базе данных паролей Unix.

person Donal Fellows    schedule 13.11.2014