我有一个小 ruby 脚本,它以mysql
方式进行导入:mysql -u <user> -p<pass> -h <host> <db> < file.sql
,但Open3.popen3
用于这样做。这就是我到目前为止所拥有的:
mysqlimp = "mysql -u #{mysqllocal['user']} "
mysqlimp << "-h #{mysqllocal['host']} "
mysqlimp << "-p#{mysqllocal['pass']} "
mysqlimp << "#{mysqllocal['db']}"
Open3.popen3(mysqlimp) do |stdin, stdout, stderr, wthr|
stdin.write "DROP DATABASE IF EXISTS #{mysqllocal['db']};\n"
stdin.write "CREATE DATABASE #{mysqllocal['db']};\n"
stdin.write "USE #{mysqllocal['db']};\n"
stdin.write mysqldump #a string containing the database data
stdin.close
stdout.each_line { |line| puts line }
stdout.close
stderr.each_line { |line| puts line }
stderr.close
end
那实际上是在做这项工作,但有一件事情让我感到困扰,与我想看到的输出有关。
如果我将第一行更改为:
mysqlimp = "mysql -v -u #{mysqllocal['user']} " #note the -v
然后整个脚本永远挂起。
我想,这是因为读写流相互阻塞,而且我还猜想stdout
需要定期刷新,以便stdin
继续消耗。换句话说,只要缓冲区stdout
已满,进程就会等到它被刷新,但由于这是首先在最底层完成的,所以这永远不会发生。
我希望有人可以验证我的理论?我怎么能写出打印出所有内容的代码,stdout
并将所有内容都写入其中stdin
?
提前谢谢!