60

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

%x[#{cmd}]

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

subprocess.PopenPythonの場合と同様に、同様の方法で砲撃する方法はありますか:

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

ありがとう!

4

6 に答える 6

141

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

Dir.chdir('mydir'){
  %x[#{cmd}]
}
于 2012-04-13T21:07:09.483 に答える
12

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

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

Dir.pwd #=> "/home/abe"
于 2012-04-13T20:45:45.513 に答える
4

また、シェルルートを取る

%x[cd #{dir} && #{cmd}]
于 2012-04-14T10:53:24.957 に答える
4

安全な変更ディレクトリを使用したバックトリックに最も近いのは次のcapture2とおりです。

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

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

于 2014-08-26T08:10:08.217 に答える
1

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

于 2012-04-13T20:46:17.260 に答える