探索预期第219页:
#!/bin/bash
set kludge { ${1+"$@"}
shift
shift
exec expect -f $0 ${1+"$@"}
}
# rest of script follows
我能够在这个bash解释器中执行预期的脚本,即使我可以传递命令行参数,如:./scriptname arg1 arg2 arg3
等但是当我尝试的时候sh -x ./scriptname arg1 arg2 arg3
它抛出了一些错误。请澄清以上语句,将expect脚本放入bash
首先从Expect来看,它非常简单。当给定2个参数时,set
命令会设置变量的值。这里,变量名为kludge
,值为{braces}
之间的多行字符串。请注意,在Tcl(和Expect(中,大括号抑制扩展(变量替换、命令扩展等(,就像单引号在shell中的作用一样。假设从未使用过变量kludge
,这是一个完全无害的语句。
从外壳上看有点棘手。shell在此上下文中的set
命令将设置位置参数。此命令之后:
$1 = "kludge"
$2 = "{"
$3, $4, ... <= will be the original command line parameters
然后有两个shift
命令将"kludge"
和"{"
从参数的"堆栈"中弹出,恢复原始位置参数。然后exec
命令将启动expect,替换当前正在运行的shell进程。如果没有使用exec
,expect将运行并(可能(终止,然后shell将在下一行报告语法错误:}
总的来说,这是一个过于聪明的方式来启动一个期望程序。用替换"#rest of script followes"之前的所有内容
#!/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'
# ...
单个-
告诉expect命令将出现在stdin上。