代码之家  ›  专栏  ›  技术社区  ›  John Dibling

通过`myapp | myscript.rb将stdin管道化到ruby脚本`

  •  3
  • John Dibling  · 技术社区  · 14 年前

    \n

    例如,我试图在命令行上运行以下命令:

    myapp.exe | my_script.rb

    …与 my_script.rb

    while $stdin.gets
        puts $_
    end
    

    我最终将使用regex处理字符串并显示一些摘要数据,但目前我只是尝试连接基本功能。运行上述命令时,出现以下错误:

    my_script.rb:1:in `gets': Bad file descriptor (Errno::EBADF)
            from my_script.rb:1
    

    我在WindowsServer2003R2SP2和Ruby1.8.6上运行这个。

    编辑:

    在某种程度上,我能让这件事成功。有几个问题妨碍了我。首先,可能是使用Ruby来处理管道中的 stdin 从另一个进程 doesn't work on Windows 2003R2 popen 连接到 myapp.exe 作为一个 fork 编辑子进程。不幸的是, 没有在Windows中实现,所以这也不起作用。

    我终于可以下载了 POpen4 ,一个实现 波本 :

    文件:my\u script.rb

    require 'rubygems'
    require 'popen4'
    
     status =
        POpen4::popen4("myapp.exe") do |stdout, stderr, stdin, pid|
            puts pid
            while s = stdout.gets
                puts s
            end
    
        end
    

    此脚本与 ,这正是我想要的。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Adrian    14 年前

    试着简单一点 gets ,没有 $stdin . 如果这不起作用,您可能需要检查 myapp.exe 对于另一个ruby脚本的不可打印字符,使用 IO.popen .

        2
  •  0
  •   Community CDub    7 年前

    gets

    看到了吗 SO

        3
  •  0
  •   Sergio Tulentsev    11 年前

    尝试通过显式调用Ruby来执行Ruby脚本:

    myapp.exe | ruby my_script.rb
    

    我在Ruby中使用stdin时遇到了一些奇怪的行为,当依赖Windows根据文件关联调用正确的程序时。