expect eof語句的理解

寫了一個腳本:
DATE=$(date +%Y%m%d)
/usr/bin/expect <<-EOF
     set timeout -1
     spawn  scp [email protected]:[email protected] [email protected]c7ef714a8b.${DATE}
     expect "password:"
     send "engine4GLY\n"
     expect eof
     spawn  scp [email protected]:[email protected] [email protected]cb22bb003b.${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 ...
一周排行
  • jQuery實現Loading
    1 目的:使用jQuery實現的處理結果出現前的載入效果2 目錄結構:3 images中的 ...
  • i/o通信模型
                          Linux I/O通信模型總結1)阻塞模型2) ...
  • 1.概述    javac.exe: Java編譯器,將Java源代碼轉換成字節碼. 2.用法    javac <選項> <源文件> (使用過程中發現,javac <源文件>&l ...
  • Linux+Apache+Mysql+Perl/PHP/Python一組常用來搭建動態網站或者伺服器的開源軟件,本身都是各自獨立的程序,但是因爲常被放在一起使用,擁有了越來越高的兼容度,共同組成了一個強大的Web應用 ...
  • 操作系統之進程調度
    參考例1.優先權法.輪轉法簡化假設1)進程爲計算型的(無I/O)2)進程狀態:ready. ...
  • //存儲過程DELIMITER $$ DROP PROCEDURE IF EXISTS `fans`.`votecursor`$$ CREATE DEFINER=`fans`@`%` PROCEDURE `votec ...
  • 1. Please accept our thanks for the trouble you have taken. 有勞貴方,不勝感激. 2. We are obliged to thank you for yo ...
  • $("#no"+i).css({"background-image":"url(themes/oppo/images/click/xz.jpg)",&quo ...
  • In your test database: -You are using Recovery Manager (RMAN) to perform incremental backups of your test da ...
  • 腳本:mvn test從命令行運行 mvn test 使 Maven 執行到 test 階段爲止的所有生命周期階段. 測試失敗:當Maven 遇到一個測試失敗,它默認的行爲是停止當前的構建.如想忽略測試失敗,可以在P ...