expect 交互时 管道符的问题
Posted Z_DK
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了expect 交互时 管道符的问题相关的知识,希望对你有一定的参考价值。
今天同事说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 "xxxx\\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 "xxxx\\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
下的管道符|
并未生效
好了 有了原因那么就开始找方案, 找到了这个
https://unix.stackexchange.com/questions/448053/expect-command-pipes-and-gzip
在expext
中要处理管道符
需要使用 sh -c shell
的模式
修改脚本即可
#!/usr/bin/expect
set timeout 10000
spawn sh -c zcat db_xd_20220208_133003.sql.gz | mysql -u xd -p xd
expect -re ".*password"
send "xxxx\\n"
expect eof
exit
以上是关于expect 交互时 管道符的问题的主要内容,如果未能解决你的问题,请参考以下文章