3

私はこの単純なルビースクリプトを持っています:

redcricket@dev-006:~$ cat simple.rb  
#!/usr/local/bin/ruby

IO.popen 'ls -l', 'r+' do |f|
        puts f.gets
end

そして、それを実行すると、得られる唯一の出力はこれです...

redcricket@dev-006:~$ ./simple.rb  
total 32

...私が期待したのはこれでした...

redcricket@smp-mig-dev-006:~$ ls -l
total 32
drwxr-xr-x  4 redcricket co 4096 Dec  5 12:23 applications
-rw-r--r--  1 redcricket co  464 Oct  5 16:23 config
drwxr-xr-x 72 redcricket co 4096 Dec  5 15:11 docs
drwxr-xr-x  3 root    root  4096 Dec  5 12:14 oradiag_root
drwxr-xr-x  5 redcricket co 4096 Dec  5 16:22 platform
-rwxr-xr-x  1 redcricket co  373 Dec  5 16:30 process_yum_output.rb
-rwxr-xr-x  1 redcricket co 2159 Nov 28 16:24 SetupSSHPK.sh
-rwxr-xr-x  1 redcricket co  142 Dec  5 16:31 simple.rb

...どうにかして f.gets を反復処理する必要があると思いますか?

ありがとう!

4

4 に答える 4

4

渡されたブロックは1回だけIO#popen実行されます。ループではありません。ブロックに渡されるオブジェクトを¹と考えてください。の2番目の引数がだった場合、それを読むことができます; もしそうなら、あなたはそれに書くことができます。制御フローがブロックを離れると、子プロセスは停止し、アクセスに使用したオブジェクトは無効になり、使用できなくなります。FileIO#popen"r"File"w"IO

行の配列を取得する場合はreadlines、ブロックの引数を呼び出します。それらを繰り返し処理する場合は、次のように呼び出しますeach

IO.popen("ls", "r") { |io| io.each { |line| puts line } }

¹正確には、これはのインスタンスですIO

于 2012-12-05T21:42:16.257 に答える
4

RubyIO#getsメソッドは、IOオブジェクトから次の入力行を返すだけです。

すべての行を取得するには、nilになるまで「gets」を繰り返し呼び出すかread、文字列全体を取得するかreadlines、配列内の入力行を取得するために呼び出します。

IO.popen('ls -l','r') { |f| puts $_ while f.gets }
IO.popen('ls -l','r') { |f| puts f.read }
IO.popen('ls -l','r') { |f| puts f.readlines }
于 2012-12-05T21:42:34.820 に答える
2

好き:

IO.popen 'ls -l', 'r+' do |f|
  puts f.gets until f.eof?
end
于 2012-12-05T21:46:03.910 に答える
2

渡されたブロックIO.popenは一度だけ呼び出され、作成されたパイプを表す IO オブジェクトが渡されます。

そのオブジェクトを 1 回呼び出すだけなのでgets、そのコマンドからの出力は 1 行しか表示されません。さらに行を取得するには、IO オブジェクトを反復処理する必要があります。

IO.popen %w{ls -l}, 'r' do |pipe|
  pipe.each do |line|
    puts "|#{line}"
  end
end
于 2012-12-05T21:54:14.380 に答える