expect eof語句的理解

寫了一個腳本:
DATE=$(date +%Y%m%d)
/usr/bin/expect <<-EOF
     set timeout -1
     spawn  scp root@172.17.9.54:/home/var/lib/libvirt/images/b388a4c5-7097-4fd1-b184-f3c7ef714a8b /home/clouder/backup/mfsPoint/vmBackup/b388a4c5-7097-4fd1-b184-f3c7ef714a8b.${DATE}
     expect "password:"
     send "engine4GLY\n"
     expect eof
     spawn  scp root@172.17.9.54:/home/var/lib/libvirt/images/cdadc1d1-3ee5-4e16-a8e5-d9cb22bb003b /home/clouder/backup/mfsPoint/vmBackup/cdadc1d1-3ee5-4e16-a8e5-d9cb22bb003b.${DATE}
     expect "password:"
     send "engine4GLY\n"
     expect eof
EOF
find /home/clouder/backup/mfsPoint/vmBackup/ -type f -mtime +5 -exec rm -f {} \;
執行的時候發現傳第一個文件的時候一閃而過,而第一個文件有將近500G,所以肯定沒傳完,百度後加上紅色部分後問題解決。
官方手冊解釋:
expect patlist1 action1 patlist2 action2.....
該命令一直等到當前進程的輸出和以上的某一個模式相匹配,或者等到時間超過一個特定的時間長度,或者等到遇到了文件的結束爲止。
如果最後一個action是空的,就可以省略它。
每一個patlist都由一個模式或者模式的表(lists)組成。如果有一個模式匹配成功,相應的action就被執行。執行的結果從expect返回。
被精確匹配的字符串(或者當超時發生時,已經讀取但未進行匹配的字符串)被存貯在變量expect_match裏面。
如果patlist是eof 或者timeout,則發生文件結束或者超時時才執行相應的action.
一般超時的時值是10秒,但可以用類似"set timeout 30"之類的命令把超時時值設定爲30秒
但是我還是覺得這個解釋比較通俗易懂:
如果你不 expect eof,那腳本立即就結束了,可能得不到正確結果。
spawn執行的命令結果才會被expect捕捉到,因爲spawn會啓動一個進程,只有這個進程的相關信息才會被捕捉到,主要包括:標准輸入的提示信息,eof和timeout。
這裏,eof是必須去匹配的,在spawn進程結束後會向expect發送eof;如果不去匹配,有時也能運行,比如sleep多少秒後再去spawn下一個命令,但是不要依賴這種行爲,很有可能今天還可以,明天就不能用了。
更多相關文章
  • 1.break n 循環控制語句 2.do-while 循環語句 3.for 循環語句 1.break n 循環控制語句 也可以理解爲循環中斷語句,跳出循環語句break:跳出一層循環break N:跳出n條循環.2.do-while 循環語句 do{}while(exp)先執行一次循環再判斷條件w ...
  •  第二課:學習C++的基本語句引子:上節課給大家介紹了如何在Windows環境下安裝開發環境,如果您還沒有開發環境,即先看看第一節.這裏在開課前給初學者說幾句課外話:題外話1: 初學者初學,最好不用VC的集成開發環境(IDE),IDE有它的優點,但初學這個優點您還用不上.如果您不是初學者,請飄過.題 ...
  • 最近在看<鳥哥的Linux私房菜>學習shell script,寫if語句怎麽寫也有錯,所以從網上找了一篇文章供自己還有大家參考: 寫 bash 腳本的日子也不短了,但是每次用到 if 語句時大腦還是會卡殼一下,要翻教程和看以前的代碼,因爲條件部分語法神出鬼沒,捉摸不定,于是我還是花點時 ...
  • 下列語句部分是Mssql語句,不可以在access中使用.SQL分類: DDL-數據定義語言(Create,Alter,Drop,DECLARE) DML-數據操縱語言(Select,Delete,Update,Insert) DCL-數據控制語言(GRANT,REVOKE,COMMIT,ROLLB ...
  • SELECT --從數據庫表中檢索數據行和列INSERT --向數據庫表添加新數據行DELETE --從數據庫表中刪除數據行UPDATE --更新數據庫表中的數據--數據定義CREATE TABLE --創建一個數據庫表DROP TABLE --從數據庫中刪除表ALTER TABLE --修改數據庫 ...
  • 先看看手冊是怎麽說的:declare 結構用來設定一段代碼的執行指令.declare 的語法和其它流程控制結構相似:declare (directive) statementdirective 部分允許設定 declare 代碼段的行爲.目前只認識兩個指令:ticks(更多信息見下面 ticks 指 ...
  • 雖然文章標題是『語句與表達式』,在這篇文章中,我將陳述一個觀點 每個表達式都有一個值. 在此之外,也會繼續表述這個『代碼之謎』系列的主題--數學與計算機之間被經常忽略的矛盾. 簡單的講 "表達式"(expression)是一個單純的運算過程,總是有返回值: "語句&qu ...
  • 粗粗看了一下erLang的語言介紹.發現其真正做到了改善的其實只有錯誤與隔離.通過以進程爲單位進行錯誤隔離及在語言中加入更方便的錯誤處理元素,它的確提供了比java更好的錯誤機制.至少,從系統整體上說,它已經建立起這樣的概念.比起java作爲一門語言還只停留在錯誤表示卻把錯誤處理丟給程序員不同,er ...
一周排行
  • valgrind 不能用簡單的重定向,它自己有它自己的日記輸出-- valgrind --tool=memcheck --leak-check=yes --show-reachable=yes 其中 tool 的類型 ...
  • 原文地址:http://www.warski.org/blog/2013/06/akka-vs-storm/Akka 對比 Storm最近在工作中用到Twitter的Storm框架,于是將他與另外一個高效能,數據並行 ...
  • 用最笨的辦法保持領先
    用最笨的辦法保持領先Posted by jeff on 01 Jun 2012 / 0 C ...
  •  鏈結點     在鏈表中,每個數據項都被包含在'點"中,一個點是某個類的對象,這個類可認叫做    LINK.因爲一個鏈表中有許多類似的鏈結點,所以有必要用一個不同于鏈表的類來表達    鏈結點.每個 L ...
  • virtualbox 裏面安裝linux虛擬機,NAT連接模式,相互ping通
    環境: 本機 IP地址10.88.58.79 linux虛擬機ip地址:10.0.2.15 ...
  • 下列代碼中人爲的規定了是20個人. RandomTest.java import java.util.Random; import java.util.Scanner; public class RandomTest ...
  • AMD 規範在這裏:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 規範在這裏:https://github.com/seajs/seajs/issues/242 AM ...
  • 創建一個定時器:int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)     進 程可以通過調用timer_crea ...
  • 熟練掌握開發工具 做爲一名程序員至少熟練掌握兩到三種開發工具的使用,這是程序員的立身之本,其中C/C++和JAVA是重點推薦的開發工具,C/C++以其高效率和高度的靈活性成爲開發工具中的利器,很多系統級的軟件還是用C ...
  • 文章來源:http://www.iteye.com/problems/99260什麽是數據表的複合主鍵 所謂的複合主鍵 就是指你表的主鍵含有一個以上的字段組成 比如 create table test (    na ...