Expectは独自のtclシェルを開始するため、bash環境で定義されたエイリアスを使用することはできません。
Expectには変数があります$env(YOURBASHVARIABLE)
。これにより、Expectは環境変数を取得できますが、Expectはスクリプトの内部でのみそれらを変更できます。ただし、expectスクリプトが終了すると、変数に加えた変更は保持されません。
フラグが数値になる場合は、終了ステータス(たとえばexit 5
)を使用$?
してから、スクリプトで使用して終了ステータスを取得できます。
更新ごとに
expectスクリプトは何も返しません。終了コードを設定するだけです。
あなたができることは単純です:
$(expect -c '
spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$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、EDITOR、SHELL、...)および内部シェル変数(BASH_VERSION、RANDOM、...)は完全に大文字になります。他のすべての変数名には、少なくとも1つの小文字が必要です。変数名では大文字と小文字が区別されるため、この規則により、環境変数と内部変数が誤ってオーバーライドされることを回避できます。
EDIT(mpapis):他のユースケースもあります:
if output="$(expect ...)"
then
echo "it worked: $output"
else
result=$?
echo "it failed($result): $output"
fi
編集(twmb)
最後のユースケースでは、何を返すかについて注意する必要があります。ユーザーに送信されたすべての出力を受け取ります。ロギングをオフにして(でlog_user 0
)、expectスクリプトで出力される内容を正確に制御していない限り、必要以上の情報が得られる可能性があります。
これを伴う別のドラッグは、以下のコメントに示されています。
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"