【问题标题】:Present editable input to a user with ruby使用 ruby​​ 向用户呈现可编辑的输入
【发布时间】:2015-12-06 08:53:08
【问题描述】:

我在 Ubuntu 14.04 和 Ruby 1.9.3 上。我正在尝试向用户呈现可编辑的输入。 我碰巧找到的唯一解决方案是使用 bash-shell 中的读取命令: 读取 -e -i "默认值" -p "提示>" ;回声 $REPLY 从命令行执行它运行良好,编辑后的输入在 REPLY 变量中。 但是如果我定义

def edits
  `read -e -i "Default Value" -p "Prompt> ; echo $REPLY" ` 
end

并在 ruby​​ 中运行它我得到一个错误:

sh: 1: read: Illegal option -e

我现在的问题是:

  1. 我的解决方案出了什么问题?
  2. 在 ruby​​ 中有更好的解决方案吗?

【问题讨论】:

  • 我自然而然地在 ruby​​ 定义中的操作系统命令周围使用了反引号。

标签: ruby bash


【解决方案1】:

用于读取的-e 标志是bash 扩展。您正在使用sh shell(或模拟sh 的东西),它具有读取命令但没有该标志。

Readline 模块在 Ruby 中提供终端输入和编辑功能:

require "readline"
while buf = Readline.readline("> ", true)
  p buf
end

它还具有历史记录和完成功能。

【讨论】:

  • 我的重点不是提示,它是 readline 给出的,而是用户可以编辑的“默认值”字符串。 readline 可以显示这样的字符串来编辑吗?
  • 如果我定义 def shell echo $SHELL end,我得到 /bin/bash,所以 ruby​​ 总是调用一个 bash-shell,read -e 应该在其中运行???
  • 您可以在 Readline 的预输入挂钩中插入您的默认文本(参见 here)。
  • $SHELL 变量包含您的默认 shell,而不是当前运行的 shell(请参阅here)。
  • 你在 Ubuntu 上,这意味着 /bin/sh 指向 dash,而不是 bash,这是 Ruby 将使用的。
猜你喜欢
  • 2019-10-27
  • 2022-12-04
  • 1970-01-01
  • 2011-05-09
  • 2016-11-02
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多