Expect

期望 - 如果命令失敗,如何以狀態碼 1 退出?

  • August 23, 2018

我的目標是使用期望重命名 sftp 伺服器上的文件,如果重命名失敗,退出期望返回狀態程式碼 1

我的期望腳本工作正常 - 它成功重命名。

如果重命名失敗,我無法弄清楚如何使用狀態碼退出。

ubuntu@ip-10-0-0-138:~$> cat expect_script.txt
spawn sftp -o "StrictHostKeyChecking no" ubuntu@nginx.localvpc
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 ubuntu@nginx.localvpc
ubuntu@nginx.localvpc'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:~$>

如果重命名失敗,任何人都可以建議我可以做什麼以返回程式碼零退出?

額外的問題……在我的期望腳本結束時退出的正確方法是什麼?是其中之一嗎?

exit
close
expect eof

謝謝!

您需要通過匹配該文本並對其進行操作來檢查重命名失敗。這可以抽象為一個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連接在那時消失。

引用自:https://unix.stackexchange.com/questions/464272