Techioz Blog

ファイル名を引数として Ruby スクリプトに渡すとき、OptionParser は名前ではなくファイルの内容を読み取るのはなぜですか?

概要

GitHub 環境と対話するためのスクリプトを作成しています。特定の使用例では、スクリプトのスコープをユーザーのリストに制限する必要があり、改行区切りのファイルに保存します。ユーザー リストのファイル名を引数としてスクリプトに渡し、そのファイル名の文字列を変数に保存し、スクリプトの後半でその変数を使用してファイル名によってユーザー リスト ファイルを開いたり処理したりしたいと考えています。

私の問題は、厳密にはファイル名を正しく入力して保存することです。ユーザー リストが「user-list」というファイル内にあり、次のテキストが含まれているとします。

user1
user2
user3

ファイル名 (“user-list”) を変数に保存したいのですが、実際に保存しているのはユーザーのリスト ([ “user1”、“user2”、“user3” ]) です。

ここで非常に明白な何かが欠けているように感じますが、OptionParser のドキュメントやその他の Ruby ドキュメントには関連するものが何も見つかりませんでした。私は Ruby の初心者でもあり、既存のコードベースを使って作業しているため、これを行うためのより良い方法があるかどうかはまだわかりません。

私が作業しているコードのスニペットは次のとおりです。

# Initialize options OpenStruct
options = OpenStruct.new

...

# Parse arguments
option_parser = OptionParser.new do |opts|

...

    opts.on("-u", "--user-file USER_FILE", String,
        "Read users from a file. File should be newline separated.") do |user_file|
        # FIXME: This doesn't work
        # Check if the file exists
        #unless File.exist?(user_file)
        #    puts "File not found: #{user_file}"
        #    exit
        #end
        options.user_file = user_file
        
        # FIXME: Testing what was stored
        puts options.user_file
    end

...

option_parser.parse!(ARGV)

スクリプトに渡すものは次のとおりです。

./my_script -u user-file

ファイル「user-file」は次の内容で存在します。

user1
user2
user3

文字列「user-file」を変数 user_file に保存しようとしていますが、実際に保存しているのはリスト [ “user1”, “user2”, “user3” ] です。

解決策

これはあなたが言及したのと同じコードであり、私にとってはうまくいきました。

require 'optparse'
require 'ostruct'

options = OpenStruct.new

option_parser = OptionParser.new do |opts|
  opts.on('-u', '--user-file USER_FILE', String,
          'Read users from a file. File should be newline separated.') do |user_file|
    options.user_file = user_file
    puts options.user_file
  end
end
option_parser.parse!(ARGV)