今天同事說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來傳輸檔案給多個主機會面臨互動的問題,這在指令碼中是非常不友好的。要解決...