web-dev-qa-db-ja.com

Ruby特定のディレクトリでシェルコマンドを実行

Rubyのようなシェルコマンドを実行する方法を知っています。

%x[#{cmd}]

しかし、このコマンドを実行するディレクトリを指定するにはどうすればよいですか?

Pythonのsubprocess.Popenに似たシェルアウトの同様の方法があります:

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

ありがとう!

52
icn

Dir.chdirのブロックバージョンを使用できます。ブロック内では、要求されたディレクトリにいます。ブロックの後は、まだ前のディレクトリにいます:

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

Ruby 1.9.3(ブロッキング呼び出し):

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

Dir.pwd #=> "/home/abe"
12
Abe Voelker

また、シェルルートを取ります

%x[cd #{dir} && #{cmd}]
4
glenn jackman

Dirが安全に変更されているbacktricksに最も近いのは_capture2_です。

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

他の便利なOpen3メソッドは、Ruby docs。で確認できます。1つの欠点は、jrubyの_open3_のサポートがかなり壊れていることです。

2
akostadinov

私はこの同じ問題を抱えていたので、両方のコマンドをバックティックに入れ、「&&」で区切って解決しました。

`cd \desired\directory && command`
1
rmsimpsonau

最善の解決策ではないかもしれませんが、Dir.pwdを使用して現在のディレクトリを取得し、どこかに保存してみてください。その後、Dir.chdir(destination)を使用します。destinationは、コマンドを実行するディレクトリです。コマンドを実行した後、Dir.chdirを再度使用し、以前に保存したディレクトリを使用して復元します。

1
parallelgeek