2014-04-03 68 views
1

我正嘗試使用命名管道與廚師的shell_out!在將文件管道傳送到另一個進程之前,在文件的開頭和結尾添加行和前綴。當我嘗試執行代碼時,Ruby總是遇到錯誤,但是錯誤似乎是sh不是Ruby的。下面是我的代碼的一個基本變體,它會導致相同的錯誤以及不會失敗的等效命令。思考?說明?固定?在Ruby exec語句中使用命名管道

[1] pry(main)> a = "cat <(echo foo) <(cat file) <(echo bar) | less" 
=> "cat <(echo foo) <(cat file) <(echo bar) | less" 
[2] pry(main)> `#{a}` 
sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `cat <(echo foo) <(cat file) <(echo bar) | less' 
=> "" 
[3] pry(main)> b = "echo 'foo\nfile contents\nbar' | less" 
=> "echo 'foo\nfile contnents\nbar' | less" 
[4] pry(main)> `#{b}` 
=> "foo\nfile contents\nbar\n" 
[5] pry(main)> exit 
[[email protected] ~]$ cat <(echo foo) <(cat file) <(echo bar) | less 
[[email protected] ~]$ cat <(echo foo) <(cat file) <(echo bar) | less 
foo 
file contents 
bar 
(END) 

回答

0

啊哈,命名管道的<()格式是bash而不是unix或sh的一​​個特性。所以爲了使用這個特性,命令必須由bash解釋,因此我的代碼必須轉換爲:

[1] pry(main)> a = "bash -c 'cat <(echo foo) <(cat file) <(echo bar)' | less" 
=> "bash -c 'cat <(echo foo) <(cat file) <(echo bar)' | less" 
[2] pry(main)> `#{a}` 
=> "foo\nfile contents\nbar\n"