我想在Ruby中处理命令行输入:
> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...
最好的方法是什么?我特别想处理空白的STDIN,我希望有一个优雅的解决方案。
#!/usr/bin/env ruby
STDIN.read.split("\n").each do |a|
puts a
end
ARGV.each do |b|
puts b
end
我想在Ruby中处理命令行输入:
> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...
最好的方法是什么?我特别想处理空白的STDIN,我希望有一个优雅的解决方案。
#!/usr/bin/env ruby
STDIN.read.split("\n").each do |a|
puts a
end
ARGV.each do |b|
puts b
end
当前回答
似乎大多数答案都假设参数是包含要添加到stdin的内容的文件名。以下的一切都被视为只是论点。如果STDIN来自TTY,那么它将被忽略。
$ cat tstarg.rb
while a=(ARGV.shift or (!STDIN.tty? and STDIN.gets) )
puts a
end
参数或stdin都可以为空或有数据。
$ cat numbers
1
2
3
4
5
$ ./tstarg.rb a b c < numbers
a
b
c
1
2
3
4
5
其他回答
我是这样做的:
all_lines = ""
ARGV.each do |line|
all_lines << line + "\n"
end
puts all_lines
我不太清楚你需要什么,但我会用这样的东西:
#!/usr/bin/env ruby
until ARGV.empty? do
puts "From arguments: #{ARGV.shift}"
end
while a = gets
puts "From stdin: #{a}"
end
注意,因为ARGV数组在第一次获取之前是空的,Ruby不会尝试将参数解释为要读取的文本文件(行为继承自Perl)。
如果stdin为空或没有参数,则不打印任何内容。
很少的测试用例:
$ cat input.txt | ./myprog.rb
From stdin: line 1
From stdin: line 2
$ ./myprog.rb arg1 arg2 arg3
From arguments: arg1
From arguments: arg2
From arguments: arg3
hi!
From stdin: hi!
似乎大多数答案都假设参数是包含要添加到stdin的内容的文件名。以下的一切都被视为只是论点。如果STDIN来自TTY,那么它将被忽略。
$ cat tstarg.rb
while a=(ARGV.shift or (!STDIN.tty? and STDIN.gets) )
puts a
end
参数或stdin都可以为空或有数据。
$ cat numbers
1
2
3
4
5
$ ./tstarg.rb a b c < numbers
a
b
c
1
2
3
4
5
以下是我在收藏的一些不知名的Ruby代码中发现的一些东西。
因此,在Ruby中,Unix命令的简单无铃实现 猫会是: # !/usr/bin/env红宝石 把ARGF.read ——https://web.archive.org/web/20080725055721/http: / / www.oreillynet.com/ruby/blog/2007/04/trivial_scripting_with_ruby.html评论- 565558
ARGF在输入方面是你的朋友;它是一个虚拟文件,从命名文件或STDIN中获取所有输入。
ARGF.each_with_index do |line, idx|
print ARGF.filename, ":", idx, ";", line
end
# print all the lines in every file passed via command line that contains login
ARGF.each do |line|
puts line if line =~ /login/
end
Thank goodness we didn’t get the diamond operator in Ruby, but we did get ARGF as a replacement. Though obscure, it actually turns out to be useful. Consider this program, which prepends copyright headers in-place (thanks to another Perlism, -i) to every file mentioned on the command-line: #!/usr/bin/env ruby -i Header = DATA.read ARGF.each_line do |e| puts Header if ARGF.pos - e.length == 0 puts e end __END__ #-- # Copyright (C) 2007 Fancypants, Inc. #++ — http://blog.nicksieger.com/articles/2007/10/06/obscure-and-ugly-perlisms-in-ruby
信贷:
https://web.archive.org/web/20080725055721/http://www.oreillynet.com/ruby/blog/2007/04/trivial_scripting_with_ruby.html#comment-565558 http://blog.nicksieger.com/articles/2007/10/06/obscure-and-ugly-perlisms-in-ruby
简单快捷:
STDIN.gets.chomp == 'YES'