【问题标题】:Pass input parameters to ruby-written shell?将输入参数传递给 ruby​​ 编写的 shell?
【发布时间】:2019-05-12 20:39:49
【问题描述】:

我正在尝试用 Ruby 编写一个 shell(使用 readline),实现一些自定义命令。为了创建给定输入和在外部模块中定义的方法之间的对应关系,我使用了这样的哈希

hash = {
  'command_1' => method(:method_1),
  'command_2' => method(:method_2)
}

一旦我得到用户输入,我就会将它传递给调用与命令键关联的方法的哈希

hash[input.to_s].()

我的问题是:如何处理同一命令的变体? (例如,对于help 命令,根据是否给出标志给出不同的输出,例如help -command_1
如何将参数传递给哈希中的方法? (例如,将要打开的文件传递给open 命令,如open file_name

在此先感谢大家。

【问题讨论】:

  • 您可以通过.() 方法调用传递参数。
  • 可能想要构建一个真正的 CLI,而不是使用 thorslopcommandermany more 之类的东西
  • 如上所述,在 ruby​​ 中围绕 CLI 编写了完整的框架 - 这可能会让您的生活比尝试重新发明轮子更容易!但是,如果您真的想构建自己的(或完全控制整个应用程序的工作方式),基本方法(包括 ruby​​ 在内的多种语言)是使用ARGV
  • Ruby 还提供了ARGF,它也可以处理流输入。此外,对于一些更高级的开箱即用工具,在 ruby​​ 的标准库中有一个名为 optparse 的库。
  • 我用 ruby​​ 写了一个像这样的简单 shell,使用 readline,它位于 github.com/kontena/kontena-plugin-shell

标签: ruby shell prompt readline


【解决方案1】:

如果你足够努力的话,这可能会奏效,但简单的方法是:

hash = {
  'command_1' => :method_1,
  'command_2' => :method_2
}

send(hash[input.to_s])

send 方法允许动态调度,这比尝试处理method 更容易。

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2012-03-15
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多