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

端末でファイルをそのまま実行すると、トールの実行コマンドが NilClass を返すため、空の行が表示されます。

しかし、puts `ls ~` のコメントを外し、Thor の run メソッドをコメント アウトすると、期待どおりにホーム ディレクトリの出力が得られます。

Thor の run メソッドを Ruby の tick のように動作させられない理由がわかりません。

私が間違っていたかもしれないアイデアはありますか?

ご覧いただきありがとうございます

4

2 に答える 2

1

この方法に関する Thor のドキュメントは、実際には間違っており、不完全です。「コマンドの内容」(標準出力を意味すると思います)を返すことを文書化していますが、デフォルトでは何もしません。

しかし、明らかに、:captureオプションを使用して必要なものを取得できます。

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

だから、やってみてください

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

そして、それがうまくいくかどうかを確認してください。

于 2012-11-05T15:19:29.317 に答える
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 に答える