我想在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
当前回答
while STDIN.gets
puts $_
end
while ARGF.gets
puts $_
end
这是受到Perl的启发:
while(<STDIN>){
print "$_\n"
}
其他回答
我要补充一点,为了带参数使用ARGF,你需要在调用ARGF.each之前清除ARGV。这是因为ARGF将ARGV中的任何内容视为文件名,并首先从那里读取行。
这是一个'tee'实现的例子:
File.open(ARGV[0], 'w') do |file|
ARGV.clear
ARGF.each do |line|
puts line
file.write(line)
end
end
while STDIN.gets
puts $_
end
while ARGF.gets
puts $_
end
这是受到Perl的启发:
while(<STDIN>){
print "$_\n"
}
似乎大多数答案都假设参数是包含要添加到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
也许是这样的?
#/usr/bin/env ruby
if $stdin.tty?
ARGV.each do |file|
puts "do something with this file: #{file}"
end
else
$stdin.each_line do |line|
puts "do something with this line: #{line}"
end
end
例子:
> cat input.txt | ./myprog.rb
do something with this line: this
do something with this line: is
do something with this line: a
do something with this line: test
> ./myprog.rb < input.txt
do something with this line: this
do something with this line: is
do something with this line: a
do something with this line: test
> ./myprog.rb arg1 arg2 arg3
do something with this file: arg1
do something with this file: arg2
do something with this file: arg3
我不太清楚你需要什么,但我会用这样的东西:
#!/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!