期待開始自己的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