如何在Ruby中检查ARGF是否为空

如何在Ruby中检查ARGF是否为空,ruby,Ruby,我想这样处理ARGF # file.rb if ARGF.??? puts ARGF.read else puts "no redirect." end $ echo "Hello world" | ruby file.rb Hello world $ ruby file.rb no redirect. 我不需要等待用户输入。我试过eof?还是关门?没用。有什么想法吗 注意我被误解了。请参阅下面的注释。基本上您需要检查文件名。一种方法是: if ARGF.filename != "

我想这样处理ARGF

# file.rb
if ARGF.???
  puts ARGF.read
else
  puts "no redirect."
end

$ echo "Hello world" | ruby file.rb
Hello world

$ ruby file.rb
no redirect.
我不需要等待用户输入。我试过eof?还是关门?没用。有什么想法吗

注意我被误解了。请参阅下面的注释。

基本上您需要检查文件名。一种方法是:

if ARGF.filename != "-"
  puts ARGF.read
else
  puts "no redirect."
end
这是更完整的表格:

#!/usr/bin/env ruby
if ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?)
  puts ARGF.read
else
  puts "No redirect."
end
另一个:

#!/usr/bin/env ruby
if not STDIN.tty? and not STDIN.closed?
  puts STDIN.read
else
  puts "No redirect."
end

可能有更好的方法,但对我来说,我需要读取作为参数传递的文件的内容,以及将文件内容重定向到stdin

我的可执行文件

#!/usr/bin/env ruby
puts ARGF.pos.zero?
然后


echo Hello World | ruby file.rb将返回filename-@fl00r除了检查ARGF之外,还需要检查stdin是否为终端输入。见更新。第二个样本对我有用。但是$ruby file.rb foo返回file.rb:2:in filename':没有这样的文件或目录-foo Errno::enoint from file.rb:2:in'我能避免这个错误吗?foo真的存在吗?您是否还要检查它是否存在,如果不存在,请避免读取?@MarcJ您可能需要自己从ARGV中清除任何不存在的文件。似乎filename只给出了第一个文件的名称,所以如果输入是ruby file.rb existing.txt non-existing.txt,那么使用它是毫无用处的。您可以执行类似ARGV.select的操作!{| file | file.exists?file}在使用ARGF并处理其他参数之前,只保留指向现有文件的参数。
$ my_executable file1.txt   # passed as argument
#=> true
$ my_executable < file1.txt # redirected to stdin
#=> true
$ my_executable
#=> false