予想 - コマンドが失敗した場合、ステータスコード1で終了する方法は?

予想 - コマンドが失敗した場合、ステータスコード1で終了する方法は?

私の目標は、SFTPサーバーでファイルの名前を変更するために使用し、名前の変更に失敗した場合はステータスコード1で予想を終了することです。

私の予想されるスクリプトはうまくいきます。名前が正常に変更されました。

名前の変更に失敗した場合、ステータスコードで終了する方法はわかりません。

ubuntu@ip-10-0-0-138:~$> cat expect_script.txt
spawn sftp -o "StrictHostKeyChecking no" [email protected]
expect "password:"
send "somesupersecretpassword\n"
expect "sftp>"
send "rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4\n"
expect "sftp>"
send "rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4\n"
expect "sftp>"
send "bye\n"
expect "#"
exit

スクリプト実行時の出力は次のとおりです。

ubuntu@ip-10-0-0-138:~$> expect -f expect_script.txt
spawn sftp -o StrictHostKeyChecking no [email protected]
[email protected]'s password:
Connected to nginx.localvpc.
sftp> rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4
rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4
sftp> rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4
rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4
sftp> bye
bye
ubuntu@ip-10-0-0-138:~$>

名前の変更が失敗した場合、戻りコード0で終了するために私ができる方法を提案できる人はいますか?

追加の質問...予想されるスクリプトの最後で終了する正しい方法は何ですか?そのうちの一つですか?

exit
close
expect eof

ありがとうございます!

答え1

そのテキストを一致させ、それを操作して名前変更の失敗を確認する必要があります。これは抽象化できますproc(TCLではこれをサブルーチンまたは関数と呼びます)。

spawn ...
set ret 0
expect "sftp>"
proc sftp_rename {from to} {
    global ret
    send "rename $from $to\n"
    expect {
        -ex "Couldn't" { set ret 42; exp_continue }
        "sftp>"
    }
}
sftp_rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4
sftp_rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4
send "bye\n"
expect eof
exit $ret

その頃は接続が消えるとexpect eof予想しているので使用します。sftp

答え2

私のマニュアルページは次のようにexpect言います。

exit [-opts] [status]

[...]ステータス(指定されていない場合は0)はExpectの終了ステータスとして返されます。

だからあなたはただexit 1


3つのオプションは、EOFに到達するためにexpect eofコマンドがexpect渡されるのを待ちます。expect後でスクリプトを続行できます。expect eofこれはオプションの1つだけであるか、リモコンが切断を検出してエラーとして扱うことができる状況で役立ちます。 (もちろん、会話を交わす両側とも相手が止まるまで待つと問題が発生します。)

close他のプロセスへの接続を閉じるので、ある意味ではexpect eofcloseスクリプトを終了する前にこれを使用すると、exitwillも暗黙的に使用されるため、多くのことは行われませんclose

exitその後、スクリプトを終了します。 3つの選択肢は、実行したい操作によって異なります。終了したい場合は、単に話し、exitリモコンにEOFを処理させるようにしてください。

関連情報