2011-07-26 124 views
4

我有一个Bash脚本,使用一些Heroku客户端命令,例如,heroku创建。这些命令以Ruby和include callsIO::gets编写,以收集用户的名称和密码。但是,如果它们是从Bash脚本中调用的,它似乎会推进到最后的获取。例如,在Heroku的客户端要问电子邮件和密码的情况下,第一个被跳过,用户只能输入自己的密码:等待输入在Bash脚本中调用Ruby得到

Enter your Heroku credentials. 
Email: Password: _ 

有没有办法解决或陪审团钻机Bash脚本来防止这种情况发生(当命令行中手动运行完全相同的命令时,不会发生这种情况)。或者在Ruby中必须更改的东西?

[更新 - 解决方案]

我是不是能够解决上述问题,但@geekosaur's answer另一个问题使我在正确的轨道上,以使“可用”终端到Ruby脚本内运行Bash。我改变所有:

curl -s http://example.com/bash.sh | bash 

bash < <(curl -s http://example.com/bash.sh) 

bash <(curl -s http://example.com/bash.sh) 
+0

我遇到同样的问题 – noli

回答

2

尝试重新打开该控制终端装置上/dev/ttystdin

exec 0</dev/tty # Bash 

$stdin.reopen(File.open("/dev/tty", "r")) # Ruby 

# Bash examples 
: | (read var; echo $var;) 
: | (read var </dev/tty; echo $var;) 
: | (exec 0</dev/tty; read var; echo $var;) 
+0

“重新打开”?你能解释一下这意味着什么,或者为什么需要这样做?谢谢 – noli

+0

我希望这会工作,因为问题是缺乏一个终端/标准输入读取。但是,由于这种解决方案需要改变Ruby试图以某种方式获取stdin(如果没有*终端,甚至可能不可能),它不会很灵活。相反,我解决了没有终端的根本原因 - 请参阅我对Q.的更新。 –