先从Expect来看,很简单。该set
命令在给定 2 个参数时设置变量的值。这里,变量名是kludge
,值是 . 之间的多行字符串{braces}
。请注意,在 Tcl(和 Expect)中,大括号抑制扩展(变量替换、命令扩展等),与单引号在 shell 中的作用相同。假设kludge
从未使用过该变量,这是一个完全无害的声明。
从外壳上看有点棘手。在这种情况下,shell 的set
命令将设置位置参数。在此命令之后:
$1 = "kludge"
$2 = "{"
$3, $4, ... <= will be the original command line parameters
然后有 2 个shift
命令可以弹出"kludge"
和"{"
退出参数“堆栈”,恢复原始位置参数。然后该exec
命令将启动 expect,替换当前正在运行的 shell 进程。如果exec
未使用,expect 将运行并(可能)终止,然后 shell 将在下一行报告语法错误:}
总体而言,这是启动期望程序的一种过于聪明的方式。将“# rest of script follow”之前的所有内容替换为
#!/usr/bin/expect -f
或者,如果外壳部分发生了更多事情,请使用以下命令:
#!/bin/bash
do whatever shell initialization required
expect -c << 'END_OF_EXPECT'
# rest of expect script follows
# ...
END_OF_EXPECT
在这种情况下传递选项:
expect - "$@" << 'END_OF_EXPECT'
# ...
单曲-
告诉期望命令将出现在标准输入上。