我想这样做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
。请看下面的评论。
答案 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 != ?-