1

探索期望第 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它时会抛出一些错误。请澄清上述陈述,将期望脚本放入 bash 中是否真的有帮助

4

1 回答 1

1

先从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'
# ...

单曲-告诉期望命令将出现在标准输入上。

于 2013-03-04T17:20:52.780 回答