Ruby run shell command in a specific directory

2019-01-08 18:31发布

I know how to run a shell command in Ruby like:

%x[#{cmd}]

But, how do I specify a directory to run this command?

Is there a similar way of shelling out, similar to subprocess.Popen in Python:

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

Thanks!

6条回答
够拽才男人
2楼-- · 2019-01-08 18:46

I had this same problem and solved it by putting both commands in back ticks and separating with '&&':

`cd \desired\directory && command`
查看更多
霸刀☆藐视天下
3楼-- · 2019-01-08 18:49

also, taking the shell route

%x[cd #{dir} && #{cmd}]
查看更多
够拽才男人
4楼-- · 2019-01-08 18:49

Maybe it's not the best solution, but try to use Dir.pwd to get the current directory and save it somewhere. After that use Dir.chdir( destination ), where destination is a directory where you want to run your command from. After running the command use Dir.chdir again, using previously saved directory to restore it.

查看更多
ゆ 、 Hurt°
5楼-- · 2019-01-08 18:53

The closest I see to backtricks with safe changing dir is capture2:

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

You can see other useful Open3 methods in ruby docs. One drawback is that jruby support for open3 is rather broken.

查看更多
男人必须洒脱
6楼-- · 2019-01-08 18:54

You can use the block-version of Dir.chdir. Inside the block you are in the requested directory, after the Block you are still in the previous directory:

Dir.chdir('mydir'){
  %x[#{cmd}]
}
查看更多
冷血范
7楼-- · 2019-01-08 18:57

Ruby 1.9.3 (blocking call):

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

Dir.pwd #=> "/home/abe"
查看更多
登录 后发表回答