Tcl &引用;无效的命令名";在expect脚本中

Tcl &引用;无效的命令名";在expect脚本中,tcl,expect,Tcl,Expect,我有以下用于在串行端口侦听的代码: set timeout -1 log_user 0 set port [lindex $argv 0] spawn /usr/bin/cu -l $port proc receive { str } { set timeout 5 expect { timeout { send_user "\nDone\n"; } } set timeout -1 } expect { "XXXXXX\r" { receive $exp

我有以下用于在串行端口侦听的代码:

set timeout -1
log_user 0

set port [lindex $argv 0]

spawn /usr/bin/cu -l $port

proc receive { str } {
  set timeout 5
  expect
  {
    timeout { send_user "\nDone\n"; }
  }
  set timeout -1
}

expect {
  "XXXXXX\r" { receive $expect_out(0,string); exp_continue; }
}
为什么这会给你一个好印象

无效的命令名“

过程中超过5秒超时后出错?嵌套请求是否正常?

问题在于:

  expect
  {
    timeout { send_user "\nDone\n"; }
  }
换行符在Tcl脚本中很重要!当您单独使用
expect
时,它只会等待超时(并处理您设置的任何后台;在本例中没有)。下一行,以及您等待的内容,被解释为一个具有非常奇怪名称的命令(包括换行符、空格等)这根本不是你想要的

你真正想做的是:

  expect {
    timeout { send_user "\nDone\n"; }
  }
通过将大括号与
expect
放在同一行上,您将获得(大概)预期的行为。

问题在于:

  expect
  {
    timeout { send_user "\nDone\n"; }
  }
换行符在Tcl脚本中很重要!当您单独使用
expect
时,它只会等待超时(并处理您设置的任何后台;在本例中没有)。下一行,以及您等待的内容,被解释为一个具有非常奇怪名称的命令(包括换行符、空格等)这根本不是你想要的

你真正想做的是:

  expect {
    timeout { send_user "\nDone\n"; }
  }
通过将大括号与
expect
放在同一行上,您将获得(大概)预期的行为