在Ruby exec语句中使用命名管道

时间:2014-04-03 13:03:52

标签: ruby unix sh named-pipes

我正在尝试使用Chef的shell_out命名管道!在将文件管道传输到另一个进程之前,将行前置和附加到文件的开头和结尾。当我尝试执行代码时,Ruby总是遇到错误,但错误似乎不是Ruby的错误。下面是我的代码的基本变体,导致相同的错误以及不会失败的等效命令。思考?说明?修复?

[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
[vagrant@centos-65-developer ~]$ cat <(echo foo) <(cat file) <(echo bar) | less
[vagrant@centos-65-developer ~]$ cat <(echo foo) <(cat file) <(echo bar) | less
foo
file contents
bar
(END)

1 个答案:

答案 0 :(得分:0)

Aha,命名管道的<()格式是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"