期待开始自己的TCL外壳,所以你不能使用你的bash环境中定义的别名。
Expect确实有变量$env(YOURBASHVARIABLE)
,它允许Expect获取您的环境变量,但Expect只能在脚本内部修改它们。但是,一旦期望脚本完成,您对该变量所做的任何修改都将不会保留。
如果标志将是一个数字,您可以使用退出状态(例如,exit 5
),然后在脚本中使用$?
以获取退出状态。
根据您的更新 期望脚本不会返回任何内容,它只是设置退出代码。
你可以做的是简单的:
$(expect -c '
spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB [email protected]$REMOTE_HOST_IP"'
expect "*?assword:*"
send "'"$REMOTE_HOST_PASSWD"'\r";
expect {
"Permission denied, please try again."{
send user "Wrong pass"
exit 5
}
}
'); var=$?
这样,var
将被设置为你的退出状态。
此外,你应该注意这:
按照惯例,环境变量(PATH,编辑,SHELL,...)和 内部shell变量(BASH_VERSION,随机,...)是大写 大写。所有其他变量名称至少应包含一个小写字母 。由于变量名称区分大小写,因此这种约定避免了意外覆盖环境变量和内部变量。
EDIT(mpapis):还有其他使用案例:
if output="$(expect ...)"
then
echo "it worked: $output"
else
result=$?
echo "it failed($result): $output"
fi
EDIT(twmb)
有了上次的使用情况下,你必须要小心你是什么返回。它会将所有输出发送给用户。除非您关闭日志记录(使用log_user 0
),并且您准确控制期望脚本中输出的内容,否则您可能会获得比所需内容更多的信息。
下面的评论中指出了与此有关的另一个拖动;
returned="$(expect -c '
log_user 1 ;# turn to 0 and use send_user to control the exact output
spawn bash
expect "\\$"
send "echo hello\r"
send_user "this will be returned"
expect "\\$" ;# without this line, the script would exit too fast
;# for the "echo hello" to be sent to stdout by bash
;# and thus wont be recorded
exit 6
'
)"; var=$?
echo "var: $var"
echo "returned: $returned"
谢谢env设置标志。它只是“简单地思考” – barp 2012-08-16 05:42:07