这句话对expect或bash意味着什么



探索预期第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上。

最新更新