expect 互動時 管道符的問題

2022-09-20 13:27:10 字數 1243 閱讀 3747

今天同事說expect互動出了問題,無法呼叫gzip解壓匯入資料庫,但是手動執行卻沒問題

先來看看問題

#!/usr/bin/expect

set timeout 10000

spawn zcat db_xd_20220208_133003.sql.gz | mysql -u xd -p xd

expect -re ".*password"

send "***x\n"

expect eof

exit

執行後輸出

spawn zcat db_xd_20220208_133003.sql.gz | mysql -u xd -p xd

gzip: invalid option -- 'u'

try `gzip --help' for more information.

send: spawn id exp4 not open

while executing

"send "***x\n""

(file "./c.sh" line 7)

這裡可以看到, 報出gizp --u不存在的錯誤

進行排查

手動執行zcat db_xd_20220208_133003.sql.gz | mysql -u xd -p xd沒問題成功匯入

那麼問題出在**?為什麼會報gzip --u的錯誤

gzip --help檢視 確實沒有 u 的引數

-u是寫在 mysql 後面的 不應該是 zcat 的引數

很明顯 管道符|並沒有生效

手工操作可以成功,那麼說明expect下的管道符|並未生效

好了 有了原因那麼就開始找方案, 找到了這個

expext中要處理管道符需要使用sh -c的模式

修改指令碼即可

#!/usr/bin/expect

set timeout 10000

spawn sh -c

expect -re ".*password"

send "***x\n"

expect eof

exit

shell 使用管道符時變數的問題

使用管道符計算檔案行數指令碼如下 bin sh linenum 0 cat test while read line doecho line content line linenum 1 done echo line number linenum 輸出結果為 line content 1 line ...

expect和shell的互動

今天寫了個指令碼expect指令碼 本以為很簡單一件事 最後因為expect和shell的一些差別導致浪費了不少時間 特此記錄下 兩者互動時 expect中使用shell命令 注意 shell指令碼太常用了,省略 了shell書寫格式 兩者的變數賦值方式不同 expect中是 set variabl...

shell中expect解決互動問題

linux shell指令碼程式設計 expect解決指令碼互動 shell的多程序處理 發布 tanglu2018 7 13 10 53分類 shell 標籤 bash shell 如果在沒有使用金鑰認證的情況下,想通過ssh來傳輸檔案給多個主機會面臨互動的問題,這在指令碼中是非常不友好的。要解決...