Ruby run shell command in a specific directory

RubyShellCommand

Ruby Problem Overview


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!

Ruby Solutions


Solution 1 - Ruby

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

Solution 2 - Ruby

Ruby 1.9.3 (blocking call):

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

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

Solution 3 - Ruby

also, taking the shell route

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

Solution 4 - Ruby

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.

Solution 5 - Ruby

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.

Solution 6 - Ruby

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

`cd \desired\directory && command`

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionicnView Question on Stackoverflow
Solution 1 - RubyknutView Answer on Stackoverflow
Solution 2 - RubyAbe VoelkerView Answer on Stackoverflow
Solution 3 - Rubyglenn jackmanView Answer on Stackoverflow
Solution 4 - RubyakostadinovView Answer on Stackoverflow
Solution 5 - RubyparallelgeekView Answer on Stackoverflow
Solution 6 - RubyrmsimpsonauView Answer on Stackoverflow