2014-01-10 150 views
2

我偶然在下面的代碼行管道符號

open("|cd lib && /opt/jruby/bin/jruby jasper_pdf.rb") { |input| open("log/jasper_pdf.log", "w") { |f| f.write(input.read) } } 

什麼是cd命令之前管道符號?

+1

http://ruby-doc.org/core-2.1.0/Kernel.html#method-i-open – matt

回答

2

Kernel#open紅寶石文檔說:

如果路徑與管道字符(「|」)開始,創建子進程, 由一對配管的連接到主叫方。返回的IO對象可用於寫入標準輸入並從此子流程的標準輸出 中讀取。

在您的情況下,它用於將由命令/opt/jruby/bin/jruby jasper_pdf.rb生成的進程的輸出記錄到文件log/jasper_pdf.log

這大致相當於使用Open3模塊是這樣的:

require 'open3' 
Open3.popen2e('cd lib && /opt/jruby/bin/jruby jasper_pdf.rb') do |_, output, _| 
    open('log/jasper_pdf.log', 'w') do |f| 
    f.write(output.read) 
    end 
end