Expect 的 "expect -r PATTERN" 命令中的“-r”是什么意思?

What does "-r" mean as in the Expect's "expect -r PATTERN" command?

我查看了 Expect 联机帮助页并用 Google 搜索了它,但我没有找到 expect 的 -r 是什么。我看到这个选项以前是这样使用的

expect -r "\r\n\r\n"

expect 脚本中,但无法弄清楚它的用途。有谁知道我在哪里可以找到这个答案?提前致谢

当我看到有人在使用 expect -regexp PATTERN 时,这也让我有点困惑,因为在手册页中它只提到了 expect -re PATTERN。我试过 expect -regexp PATTERN 确实有效。

有段时间下载了expect的source code看了看才知道原因

在源码中(参见expect.c中的函数parse_expect_args()),expect的选项实际上定义如下:

static char *flags[] = {
  "-glob", "-regexp",  "-exact", "-notransfer", "-nocase",
  "-i",    "-indices", "-iread", "-timestamp",  "-timeout",
  "-nobrace", "--", (char *)0
}

然后在函数中调用TclTcl_GetIndexFromObj(interp, objPtr, tablePtr, msg, flags, indexPtr)来解析命令选项。根据 Tcl_GetIndexFromObj()manual:

... a match occurs if objPtr's string value is identical to one of the strings in tablePtr, or if it is a non-empty unique abbreviation for exactly one of the strings in tablePtr and the TCL_EXACT flag was not specified; ...

此处 Expect 使用 flags = 0 调用 Tcl_GetIndexFromObj()(没有 TCL_EXACT),因此记录的 -gl-re-ex在手册页中实际上分别是-glob-regexp-exact。由于只有一个选项 -regexp-r 开头,所以 -r-regexp(和 -re)的含义相同。

我个人建议仍然使用已记录的选项以避免混淆其他人。