23600


環境 : CentOS7 ruby2.3.0

[code]

    [root@5ecf1469c888 ~]# irb
    2.3.0 :001 > 10.times do |i| `touch #{i}.txt` end
     => 10
    2.3.0 :002 > exit
    [root@5ecf1469c888 ~]# ls
    0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt  anaconda-ks.cfg  git
    
[/code]

ワンライナーで何か作業を行う時にパイプなどでrubyに渡して処理させることは可能でしょうか？  
上記の例だと、irb環境でシェルを使っているのですが逆のことを行いたいのです。  
シェル環境でrubyを使う。

例↓イメージでいうとこのような感じ

[code]

    [root@5ecf1469c888 ~]# ls |irb puts
    Switch to inspect mode.
    /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/magic-file.rb:8:in `initialize': No such file or directory @ rb_sysopen - puts (Errno::ENOENT)
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/magic-file.rb:8:in `open'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/magic-file.rb:8:in `open'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/input-method.rb:101:in `initialize'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/context.rb:85:in `new'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb/context.rb:85:in `initialize'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:426:in `new'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:426:in `initialize'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:381:in `new'
            from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/irb.rb:381:in `start'
            from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
    
[/code]

簡単な例でいうと  
ls で標準出力される結果を ruby のputs で表示させる。

他にはパイプで渡した結果を.splitメソッドなどを使ってやりたいのです。


CC BY-SA 3.0
2016-03-29T16:37:30.973
23599
2016-03-29T21:27:37.670
14384
question
ruby centos bash
CentOS7上にてパイプ経由rubyを使う方法はありませんか？


rubyのコマンドラインオプション`-ne`を利用します。

（irbは対話的にrubyを扱うコマンドなのでここでは必要ありません）

  * `-e <script>` : スクリプトを実行する
  * `-n` : 実行するスクリプト全体を `while gets; ... ; end` で囲む
  * `$_` : 組み込み変数。getsで読み込んだ値が入っている

例1: 入力を一行ごとに読み込んで出力する

[code]

    $ ls | ruby -ne 'puts $_'
    
[/code]

例2: 読み込んだ行を分割する (`$F = $_.split` / `-a`オプションが必要)

[code]

    $ ls | ruby -ane 'p $F'
    
[/code]


CC BY-SA 3.0
2016-03-29T19:01:24.477
23600
2016-03-29T19:01:24.477
2391
23599
answer


入出力をパイプできるプログラムは、「標準入力から読み込み，標準出力へ出力するプログラム」です。

[code]

    #upcase.rb
    while $_ = ARGF.gets
      $_.chomp!
      $_.upcase!
      puts $_
    end
    
[/code]

これをパイプで実行するとこうなります。

[code]

    % hostname -f
    foo.example.jp
    % hostname -f | ruby upcase.rb
    FOO.EXAMPLE.JP
    % hostname -f | ruby upcase.rb | sed 's/\./%/g'
    FOO%EXAMPLE%JP
    
[/code]

ワンライナーで書く時の簡便のため、rubyに`-n`オプションを指定すると上記の`while`ループが省略できます。`-l`を付けると`$_.chomp!`が省略できます。`-p`を付けると`while`ループと`puts
$_`が省略できます。(厳密には少し嘘です)。詳しくは[リファレンスマニュアル](http://docs.ruby-
lang.org/ja/2.3.0/doc/spec=2frubycmd.html)を参照してください。

[code]

    % hostname -f | ruby -lpe '$_.upcase'
    FOO.EXAMPLE.JP
    
[/code]


CC BY-SA 3.0
2016-03-29T21:27:37.670
23602
2016-03-29T21:27:37.670
5793
23599
answer