探索期待第219页:
#!/bin/bash
set kludge { ${1+"$@"}
shift
shift
exec expect -f $0 ${1+"$@"}
}
# rest of script follows
我能够在这个bash解释器中执行我的expect脚本,即使我可以
传递命令行参数,如:
./scriptname arg1 arg2 arg3
等等
但是当我试着
sh -x ./scriptname arg1 arg2 arg3
它犯了一些错误。
请澄清上述陈述,并确实有助于将期望脚本放入bash
答案 0 :(得分:1)
首先从Expect看,它非常简单。给定2个参数时,set
命令设置变量的值。这里,变量名称为kludge
,值为{braces}
之间的多行字符串。请注意,在Tcl(和Expect)中,大括号禁止扩展(变量替换,命令扩展等),就像单引号在shell中一样。假设从未使用过变量kludge
,这是一个完全无害的陈述。
shell有点棘手。在此上下文中,shell的set
命令将设置位置参数。执行此命令后:
$1 = "kludge"
$2 = "{"
$3, $4, ... <= will be the original command line parameters
然后有2 shift
个命令弹出"kludge"
和"{"
关闭参数的“堆栈”,恢复原始位置参数。然后exec
命令将启动expect,替换当前运行的shell进程。
如果未使用exec
,则会运行并且(可能)终止,然后shell将在下一行报告语法错误:}
总的来说,这是推出预期计划的一种过于聪明的方式。使用
替换“脚本的其余部分”之前的所有内容#!/usr/bin/expect -f
或者如果在shell部分发生了更多 更多的事情,请使用:
#!/bin/bash
do whatever shell initialization required
expect -c << 'END_OF_EXPECT'
# rest of expect script follows
# ...
END_OF_EXPECT
在这种情况下传递选项:
expect - "$@" << 'END_OF_EXPECT'
# ...
单个-
告诉我们命令会出现在stdin上。