Yus*_*iny 2 ruby linux bash shell named-pipes
我想在bash中使用命名管道而不读取或写入它,直到发生事件为止。我需要在shell脚本运行的整个过程中保持此管道为打开状态。如有需要,我会从中阅读。意思是,可以做这样的事情:
open(<$NAMED_PIPE>, "r+")
--do something--
--call child ruby script, which will write to named pipe--
--do something more---
read line < $NAMED_PIPE
Run Code Online (Sandbox Code Playgroud)
这有可能在bash中吗?
我正在使用以下代码:../Ruby |-try1.rb`-try2.sh
try1.rb如下:
#!/usr/bin/ruby
require 'optparse'
puts 'Hello World!, This is my first ruby program'
options = {}
optparse = OptionParser.new do|opts|
opts.banner = "Featbuild minimal trial script for command line parsing"
options[:cpl] = nil
opts.on('--cpl SWITCH_STATE', 'compile on or off') do|cplopt|
options[:cpl] = cplopt
OPT_CPL=cplopt
puts cplopt
end
opts.on('-h', '--help', 'Display this screen') do
puts opts
exit
end
end
optparse.parse!
output = open("mypipe", "w+")
output.puts OPT_CPL
output.flush
Run Code Online (Sandbox Code Playgroud)
和try2.sh脚本(称为ruby脚本):
#!/bin/sh
mkfifo mypipe
exec 4< /home/yusufh/Ruby/mypipe
OPT=$*
./try1.rb ${OPT}
#read -ru 4 line
read line <&4
echo $line
exec 4<&- #close FIFO my_pipe
rm mypipe
Run Code Online (Sandbox Code Playgroud)
@konsolebox,当我使用普通的文本文件复制红宝石脚本中的数据时,您的解决方案就起作用了,bash脚本从那里本身将其拾取。但是,在尝试使用命名管道时,bash脚本将在执行以下语句后阻塞:exec 4< /home/yusufh/Ruby/mypipe。控制权并没有产生ruby脚本过程,在该过程中将生成数据,此后,必须在此行完成bash脚本的实际等待/阻止:read line <&4。因此,我要实现的目标没有实现。另外,当bash获取FIFO的fd时等待时,如果我在重复的终端上将某些东西回显到命名管道中,则它会退出等待状态并继续进行。但是在这种情况下,正如我所观察到的,从Ruby脚本返回的数据也不会写入FIFO。这是调试模式下脚本的输出:
[yusufh@verigybuild6 Ruby]$ bash -xv try2.sh --cpl on &
[1] 2777
[yusufh@verigybuild6 Ruby]$ #!/bin/sh
mkfifo mypipe
+ mkfifo mypipe
exec 4< /home/yusufh/Ruby/mypipe
+ exec
[yusufh@verigybuild6 Ruby]$ echo "Hello World" > mypipe
[yusufh@verigybuild6 Ruby]$
OPT=$*
+ OPT='--cpl on'
./try1.rb ${OPT}
+ ./try1.rb --cpl on
Hello World!, This is my first ruby program
on
#read -ru 4 line
read line <&4
+ read line
echo $line
+ echo Hello World
Hello World
exec 4<&- #close FIFO my_pipe
+ exec
rm mypipe
+ rm mypipe
[1]+ Done bash -xv try2.sh --cpl on
[yusufh@verigybuild6 Ruby]$
Run Code Online (Sandbox Code Playgroud)
任何想法,为什么这是失败的?感谢您的努力!:-)
使用Bash非常简单:
# Open the named pipe with a custom fd for input
exec 4< /path/to/named_pipe
# Do other things
:
# Read a line from pipe
read -ru 4 line
# Or
read -r line <&4
# Just make this consistent and close it when you're done. May not be necessary at exit but still a good practice.
exec 4<&-
Run Code Online (Sandbox Code Playgroud)
read,最好使用-r防止反斜杠转义任何字符read在未IFS设置(IFS= read ...)的情况下运行也可能有助于防止调整前导空格和尾随空格。类似的概念将适用于写作:
exec 4> /path/to/named_pipe
echo something >&4
exec 4>&-
Run Code Online (Sandbox Code Playgroud)
奖励:您也可以在像块的范围内打开一个命名管道{},while,for,if,until,等有了它不会是必要关闭文件描述符:
{
# Do reads and other things
...
} 4< /path/to/named_pipe
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |