从Tcl执行shell脚本

从Tcl执行shell脚本,tcl,Tcl,我正在尝试从TCL运行shell脚本。我有一点麻烦,因为它不工作或给我一个错误进行故障排除。我很确定我的问题是因为没有正确格式化“run”。感谢您的帮助 set run "sshpass -p 'password' ssh user@ip 'bash -s' <" set sh "test.sh" set cmd [list $run $sh $arg1 $arg2] if {[catch {eval [linsert $cmd 0 "exec"]} status]} { forea

我正在尝试从TCL运行shell脚本。我有一点麻烦,因为它不工作或给我一个错误进行故障排除。我很确定我的问题是因为没有正确格式化“run”。感谢您的帮助

set run "sshpass -p 'password' ssh user@ip 'bash -s' <"
set sh "test.sh"
set cmd [list $run $sh $arg1 $arg2]

if {[catch {eval [linsert $cmd 0 "exec"]} status]} {
  foreach line [split $status "\n"] {
    if {[string match *text* $line]} {
       //do something
    }
  }
}

set run“sshpass-p‘password’sshuser@ip“bash-s”最后删除了run变量并直接添加了它。现在可以正常工作了

set sh "test.sh"
set cmd [list sshpass -p 'password' ssh user@ip 'bash -s' \< $sh $arg1 $arg2]

if {[catch {eval [linsert $cmd 0 "exec"]} status]} {
  foreach line [split $status "\n"] {
    if {[string match *text* $line]} {
       //do something
    }
  }
}
设置sh“test.sh”
set cmd[列出sshpass-p'password'sshuser@ip“bash-s”\<$sh$arg1$arg2]
如果{[catch{eval[linsert$cmd 0“exec”]}状态]}{
foreach行[拆分$status“\n”]{
如果{[string match*text*$line]}{
//做点什么
}
}
}

我在另一个平台上,因此无法正确测试(特别是因为
arg1
arg2
未知),但请尝试
exec$run$sh$arg1$arg2
而不是
eval[linsert$cmd 0“exec”]
。也共享错误消息。正确。这是因为与bash或其他语言不同,tcl中的exec是在列表(或参数)上操作的因此,原始命令尝试执行名为
sshpass-p'password'ssh的程序user@ip“bash-s”这些单引号…它们会引起混淆。
对bash来说是一个特殊字符,但对Tcl来说根本不是(Tcl使用
{
..
}
来完成相同的作业,除了它们是可嵌套的)。