今天同事说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