【问题标题】:Ruby run shell command in a specific directoryRuby 在特定目录中运行 shell 命令
【发布时间】:2012-04-26 05:39:24
【问题描述】:

我知道如何在 Ruby 中运行 shell 命令,例如:

%x[#{cmd}]

但是,我该如何指定一个目录来运行这个命令呢?

有没有类似的脱壳方式,类似于Python中的subprocess.Popen

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local')

谢谢!

【问题讨论】:

    标签: ruby shell command


    【解决方案1】:

    您可以使用Dir.chdir 的块版本。在块内你在请求的目录中,在块之后你仍然在上一个目录中:

    Dir.chdir('mydir'){
      %x[#{cmd}]
    }
    

    【讨论】:

    • Ruby 对块所做的这些事情从未停止让我感到惊讶。 Ruby 经常让我的其他语言感到笨拙和过于复杂。
    • 这太棒了,如果我早点知道的话!
    • Dir.chdir 如果你有一个线程就可以了。对于多个线程,请查看此处的其他答案。
    • 这非常适合单线程脚本。并行启动多个进程是不安全的。
    【解决方案2】:

    Ruby 1.9.3(阻塞调用):

    require 'open3'
    Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t|
      p o.read.chomp #=> "/"
    }
    
    Dir.pwd #=> "/home/abe"
    

    【讨论】:

      【解决方案3】:

      还有,走shell路线

      %x[cd #{dir} && #{cmd}]
      

      【讨论】:

        【解决方案4】:

        我看到的最接近安全更改目录的回招是capture2

        require 'open3'
        output, status = Open3.capture2('pwd', :chdir=>"/tmp")
        

        您可以在 ruby​​ 文档中查看其他有用的 Open3 方法。一个缺点是jrubyopen3 的支持相当不完善。

        【讨论】:

        • 使用任何基于Process.spawn 的调用(systempopen3、...)的:chdir 选项似乎对于启动并行进程也是线程安全的。跨度>
        【解决方案5】:

        也许这不是最好的解决方案,但尝试使用 Dir.pwd 获取当前目录并将其保存在某处。之后使用 Dir.chdir(destination),其中destination 是您要从中运行命令的目录。运行命令后再次使用 Dir.chdir,使用之前保存的目录来恢复它。

        【讨论】:

        • 您也可以使用Dir.chdir的块版本。在块内,您位于请求的目录中,在块之后您仍在上一个目录中。
        • @knut 你应该这样回答——我喜欢!我打算建议像Dir.chdir(Dir.pwd.tap {Dir.chdir('d:\test\local'); #otherstuff}) 这样疯狂的东西,因为我不知道 chdir 可能会占用一个块
        • @AbeVoelker 你说得对,here it is
        【解决方案6】:

        我遇到了同样的问题,并通过将两个命令放在反引号中并用'&&'分隔来解决它:

        `cd \desired\directory && command`
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-31
          • 2016-07-18
          相关资源
          最近更新 更多