我正在尝试在 Ruby 脚本中执行 shell 命令。有问题的 shell 命令 ( pg_dump
) 提示用户输入密码。我想做的是在子进程中执行 shell 命令,并让我的父进程以交互方式输入密码。
我希望所有人都stdout
被stderr
父进程捕获,这样它就不会显示给用户。
这是一些代码。它应该证明的是 Open4 能够stdout
从 shell 命令中捕获。不幸的是,它没有这样做。
puts "Executing \"#{pg_dump_command}\""
stdin = ''
stdout = ''
stderr = ''
thread = Open4::background(pg_dump_command, 0 => stdin, 1 => stdout, 2 => stderr)
while(status = thread.status)
puts '.'
sleep 1
end
puts "STDOUT: #{stdout}"
puts "STDERR: #{stderr}"
这是输出。请注意,它会打印“密码:”,尽管 Open4 传递了一个用于stdout
.
Executing "pg_dump -U myuser -Fc mydb > /tmp/db.dump"
.
Password: .
.
(the dots continue for as long as a password is not entered)
STDOUT:
STDERR: pg_dump: [archiver (db)] connection to database "mydb" failed: FATAL: password authentication failed for user "myuser"
我错过了什么?谢谢你的帮助。