1

在我的可执行 Ruby 文件中,我有以下内容:

#!/usr/bin/env ruby

require 'thor'

include Thor::Actions

class UI < Thor
  # def self.source_root
  #   File.dirname(__FILE__)
  # end

  desc "makecal", "Generates postscript calendar to your desktop"
  def makecal
    # puts `ls ~`
    puts run('ls ~')
    # puts run "pcalmakecal -B -b all -d Helvetica/8 -t Helvetica/16 -S #{Time.now.month} #{Time.now.year} > ~/Desktop/#{Time.now.month}-#{Time.now.year}"
  end
end

UI.start

在终端中,当我按原样运行文件时,我得到一个空行,因为 Thor 的运行命令返回一个 NilClass。

但是,当我取消注释 puts `ls ~` 并注释掉 Thor 的 run 方法时,我会按预期得到我的主目录的输出。

我无法弄清楚为什么我不能让 Thor 的 run 方法像 Ruby 的滴答声一样工作。

有什么我可能出错的想法吗?

感谢您的关注

4

2 回答 2

1

我没有把 include 语句放在我的班级里,这把事情搞砸了。代码应该是:

#!/usr/bin/env ruby

require 'makecal'


class UI < Thor
  include Thor::Actions
  # def self.source_root
  #   File.dirname(__FILE__)
  # end
  #

  desc "makecal", "Generates postscript calendar to your desktop"
  def makecal
    # puts `ls ~`
    puts run('ls ~')
    # puts run "pcal -B -b all -d Helvetica/8 -t Helvetica/16 -S #{Time.now.month} #{Time.now.year} > ~/Desktop/#{Time.now.month}-#{Time.now.year}"
  end
end

UI.start
于 2012-11-05T03:15:24.373 回答
1

Thor 关于这种方法的文档实际上是错误且不完整的。它记录了它返回“命令的内容”(我假设它是指标准输出),但默认情况下它什么也不做。

但是,显然,您可以使用该:capture选项来获得您想要的东西:

unless options[:pretend]
  config[:capture] ? `#{command}` : system("#{command}")
end

所以,尝试做

puts run("ls ~", :capture => true)

看看能不能做到。

于 2012-11-05T15:19:29.317 回答