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

时间:2014-08-18 07:29:40

标签: 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?closed?没有帮助。有什么想法吗?

注意我被误解了ARGF。请看下面的评论。

3 个答案:

答案 0 :(得分:6)

基本上你会检查#filename。一种方法是:

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

答案 1 :(得分:1)

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

my_executable

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

然后

$ my_executable file1.txt   # passed as argument
#=> true
$ my_executable < file1.txt # redirected to stdin
#=> true
$ my_executable
#=> false

答案 2 :(得分:0)

所以我采用了所有三个当前建议的解决方案:

p (not STDIN.tty? and not STDIN.closed?)
p ARGF.filename
p ARGF.pos

发现它们都没有实际工作:

$ ruby temp.rb 
false
"-"
36471287

$ ruby temp.rb temp.rb 
false
"temp.rb"
0

$ echo 123 | ruby temp.rb 
true
"-"
temp.rb:3:in `pos': Illegal seek @ rb_io_tell - <STDIN> (Errno::ESPIPE)
        from temp.rb:3:in `<main>'

因为假设有能力调用 ARGF.read 你想要得到 false/true/true。

所以我想你必须把它们结合起来:

!STDIN.tty? && !STDIN.closed? || ARGF.filename != ?-