这句话对期望或bash意味着什么?

时间:2013-03-04 11:55:32

标签: bash expect

探索期待第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

1 个答案:

答案 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上。