当将文件名作为参数传递给 Ruby 脚本时,为什么 OptionParser 会读取文件的内容而不是名称?

When passing a filename as an argument to Ruby script, why does OptionParser read the contents of the file instead of the name?

提问人:DoctorMarmalade 提问时间:11/8/2023 更新时间:11/8/2023 访问量:37

问:

我正在编写一个脚本来与 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”存储在变量中,但我实际存储的是列表 [ “user1”, “user2”, “user3” ]。user_file

ruby arguments 选项解析器

评论

0赞 rna 11/8/2023
这似乎不是问题,我也运行了你的代码,它对我来说工作正常。

答:

0赞 rna 11/8/2023 #1

这与您提到的代码相同,对我有用。

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)

评论

0赞 DoctorMarmalade 11/8/2023
当您运行它时,您是否传递了存在并包含换行符分隔列表的文件的文件名?我问是因为几分钟前我还发现,如果文件不存在,脚本将采用传入的文件名作为字符串(所需的结果)。当文件确实存在时,会特别出现此问题。如果文件存在,则脚本将查找该文件并读取其内容。我还尝试打印 user_file 和 options.user_file 的.class,输出显示它们都是字符串。
0赞 rna 11/8/2023
是的,正如你提到的,我也这样做了。也许您可以在单独的文件中尝试代码的显式部分,并检查您的最终。
0赞 DoctorMarmalade 11/8/2023
在您的答案中运行该片段时仍然存在相同的问题......有趣的是,我们得到了不同的结果。我运行的是 Ruby 3.2.2,您使用的是哪个版本?
0赞 DoctorMarmalade 11/8/2023
嘿@rna,我想通了我的问题。问题来自我的脚本的包装脚本,该脚本主要有助于在SSH上运行。在将我的文件传递给我的脚本之前,它正在评估我的文件(这会带来自己的问题,因为我不希望远程主机上的列表文件)。谢谢你的回复......如果不知道其他人成功运行了该代码,我就会被困在错误的地方更长时间。
0赞 rna 11/11/2023
很高兴知道。很高兴你找到了它。另一双眼睛总是有帮助的。
-1赞 DoctorMarmalade 11/8/2023 #2

经过更多的挖掘,我发现我的问题与 OptionParser 无关,也与 Ruby 无关。问题实际上出在包装脚本评估文件上。