Ruby run shell command in a specific directory

2019-01-08 18:45发布

问题:

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!

回答1:

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}]
}


回答2:

Ruby 1.9.3 (blocking call):

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

Dir.pwd #=> "/home/abe"


回答3:

also, taking the shell route

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


回答4:

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.



回答5:

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.



回答6:

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

`cd \desired\directory && command`