在调用Ruby gets的Bash脚本中等待输入

5

我有一个Bash脚本,使用了一些Heroku客户端命令,例如heroku create。这些命令是用Ruby编写的,并且包含调用 IO::gets 来收集用户的用户名和密码。但是,如果它们从Bash脚本中调用,似乎会直接跳到最后一个gets。例如,在Heroku客户端要求输入电子邮件和密码的情况下,第一个将被跳过,用户只能输入他们的密码:

Enter your Heroku credentials.
Email: Password: _

有没有办法修复或临时修补Bash脚本,以防止发生这种情况(当完全相同的命令从命令行手动运行时不会发生这种情况)。还是必须更改Ruby中的某些内容?

[更新-解决方案]

我无法解决上述问题,但@geekosaur's answer对另一个问题的回答让我找到了让终端“可用”的方法,使得在Bash内运行的Ruby脚本能够正常运行。我将所有内容都进行了更改:

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

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

成为

bash <(curl -s http://example.com/bash.sh)
1个回答

2

尝试在控制终端设备/dev/tty上重新打开stdin

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; )

"reopen"? 你能解释一下这是什么意思,或者为什么需要这样做吗?谢谢。 - noli
我认为这应该可以工作,因为问题在于缺少终端/标准输入。但是,由于这种解决方案需要更改Ruby以尝试某种方式获取stdin(如果没有终端可能根本不可能),它将不太灵活。相反,我解决了根本原因,即没有终端 - 请参见我的问题更新。 - Yuri Gadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接