我正在编写这个程序来管理dotfiles并且看起来似乎没有像往常一样,我无法通过Google追踪相关信息。
#!/usr/bin/env ruby
@filename = ''
unless $*[0].nil?
# Storing filename (and adding dot)
@filename = "."+$*[0].to_s
else
# No filename given, exit and print to STDERR
abort("No filename specified")
end
@file_path = File.expand_path("~/#{@filename}")
if File.exists?(@file_path)
print "Enter something: "
gets
puts $_
end
但是,该程序在“获取”行崩溃,如此
$ ruby ./link.rb bash_profile
Enter something: /Users/krystah/repos/backpack/dotfiles/link.rb:24:in `gets':
No such file or directory - bash_profile (Errno::ENOENT)
from /Users/krystah/repos/backpack/dotfiles/link.rb:24:in `gets'
from /Users/krystah/repos/backpack/dotfiles/link.rb:24:in `<main>'
答案 0 :(得分:7)
来自fine manual:
获取(sep = $ /)→string或nil
获取(限制)→字符串或零
获取(sep,limit)→string或nil返回(并分配给
$_
)ARGV
(或$*
)中文件列表中的下一行,如果命令行中没有文件,则返回标准输入
ARGV
确实有这些内容,因此gets
会尝试从名为'bash_profile'
的文件中读取,然后抱怨没有此类文件。您可能希望更清楚地了解您的阅读地点:
print "Enter something: "
$stdin.gets
puts $_
这实际上是一个非常有趣的问题。 gets
(以及Kernel
中的许多其他功能)通常用于单行,因此他们的行为以惊人的方式专门化。一旦你理解了他们的预期目的,奇怪的行为就不那么令人惊讶了。