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

Posted

技术标签:

【中文标题】在 Ruby exec 语句中使用命名管道【英文标题】:Using named pipes in Ruby exec statements 【发布时间】:2014-04-03 13:03:52 【问题描述】:

我正在尝试将命名管道与 Chef 的 shell_out 一起使用!在将文件传送到另一个进程之前,将行添加到文件的开头和结尾。当我尝试执行代码时,Ruby 总是遇到错误,但错误似乎是 sh 不是 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】:

啊哈,命名管道的&lt;() 格式是 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"

【讨论】:

以上是关于在 Ruby exec 语句中使用命名管道的主要内容,如果未能解决你的问题,请参考以下文章

如何等待命名管道的另一端打开?

Bash 重定向:命名管道和 EOF

无法将多个 shell 语句重定向到命名管道

命名管道(C#)

内存映射文件 VS 命名管道 - C#

php包含来自fifo(命名管道)文件的指令