我的目标是使用期望重命名 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:~$>
如果重命名失败,任何人都可以建议我可以做什么以返回代码零退出?
额外的问题......在我的期望脚本结束时退出的正确方法是什么?是其中之一吗?
exit
close
expect eof
谢谢!
您需要通过匹配该文本并对其进行操作来检查重命名失败。这可以抽象为一个
proc
(TCL 称之为子程序或函数)。我会使用
expect eof
,因为我希望sftp
连接在那时消失。我的手册页
expect
说:所以你只是想要
exit 1
.至于您的三个替代方案,
expect eof
将等待expect
正在与之交谈的命令到达 EOF。之后您可以继续执行该expect
脚本。expect eof
在这只是选项之一的情况下很有用,或者当遥控器可能检测到断开连接并将其视为错误时。(当然,如果对话双方都等待对方停止,那么他们就卡住了。)close
将关闭与另一个进程的连接,因此在某种意义上充当expect eof
. 同样,您的脚本可以在此之后继续。在退出脚本之前使用close
并没有多大作用,因为exit
will 也隐含close
.然后
exit
就是退出你的脚本。在三者之间进行选择取决于您想要做什么。如果你想退出,我会说只是exit
,让遥控器处理 EOF。