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

发布于 2024-11-26 04:08:18 字数 1011 浏览 0 评论 0原文

我有一个使用一些 Heroku 客户端命令的 Bash 脚本,例如,heroku create。这些命令是用 Ruby 编写的,包含调用IO::gets 收集用户名和密码。但是,如果从 Bash 脚本内调用它们,则似乎会前进到最后一次获取。例如,在 Heroku 客户端要求提供电子邮件和密码的情况下,第一个被跳过,用户只能输入密码:

Enter your Heroku credentials.
Email: Password: _

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

[更新 - 解决方案]

我无法解决上述问题,但是@geekosaur 对另一个问题的回答 让我走上了正确的道路,让终端对 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)

I've a Bash script using some Heroku client commands, e.g., heroku create. Those commands are written in Ruby and include calls to IO::gets to gather the user's name and password. But, if they are called from within a Bash script, it seems to advance to the last gets. For example, in the case where the Heroku client is going to ask for email and password, the first is skipped and the user can only enter their password:

Enter your Heroku credentials.
Email: Password: _

Is there a way to fix or jury-rig the Bash script to prevent this from happening (it does not happen when the exact same command is run by hand from the command line.) Or something that must be changed in the Ruby?

[UPDATE - Solution]

I wasn't able to solve the problem above, but @geekosaur's answer to another question put me on the right track to making the terminal "available" to the Ruby script running inside the Bash. I changed all:

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

and

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

to be

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水晶透心 2024-12-03 04:08:18

尝试在控制终端设备 /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; )

Try to reopen stdin on the controlling terminal device /dev/tty.

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; )
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文