2012-04-13 1 views
44

Ich weiß, wie ein Shell-Befehl in Ruby laufen wie:Ruby-run-Shell-Befehl in einem bestimmten Verzeichnis

%x[#{cmd}] 

Aber, wie definiere ich ein Verzeichnis, diesen Befehl auszuführen?

Gibt es eine ähnliche Art und Weise des Beschusses aus, ähnlich wie subprocess.Popen in Python:

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

Dank!

Antwort

109

Sie können die Blockversion von Dir.chdir verwenden. Im Innern des Blockes, den Sie in dem gewünschten Verzeichnis sind nach dem Block sind Sie noch im vorigen Verzeichnis:

Dir.chdir('mydir'){ 
    %x[#{cmd}] 
} 
+3

+1 Es scheint, dass zu wenige Ruby-Programmierer darüber wissen. – Phrogz

+5

Die Dinge, die Ruby mit Blöcken macht, erstaunt mich immer wieder. Ruby lässt meine anderen Sprachen ständig klobig und überkompliziert erscheinen. – bta

+0

Das ist erstaunlich, hatte ich nur früher davon gewusst! – ZirconCode

10

Rubin 1.9.3 (Blocking call):

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

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

Vielleicht ist es nicht die beste Lösung, aber versuchen Dir.pwd zu verwenden, um das aktuelle Verzeichnis zu bekommen und es irgendwo zu speichern. Verwenden Sie danach Dir.chdir (Ziel), wobei Ziel ein Verzeichnis ist, in dem Sie den Befehl ausführen möchten. Nachdem Sie den Befehl ausgeführt haben, verwenden Sie erneut Dir.chdir und verwenden Sie das zuvor gespeicherte Verzeichnis, um es wiederherzustellen.

+2

Sie können auch die Blockversion von 'Dir.chdir' verwenden. Innerhalb des Blocks befinden Sie sich im angeforderten Verzeichnis, nach dem Block befinden Sie sich noch im vorherigen Verzeichnis. – knut

+0

@knut Du solltest das eine Antwort geben - ich mag es! Ich wollte etwas Verrücktes vorschlagen, wie 'Dir.chdir (Dir.pwd.tap {Dir.chdir ('d: \ test \ local'); #Armerstuff})' da ich nicht wusste, dass chdir einen Block –

+0

nehmen könnte @AbeVoelker Du hast Recht, [hier ist es] (http://Stackoverflow.com/a/10148325/676874) – knut

4

auch die Shell-Route nehmen

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

ich das gleiche Problem hatte und löste es durch beide Befehle in zurück Zecken setzen und Trennung mit ‚& &‘:

`cd \desired\directory && command` 
1

Der nächstgelegene ich zu backtricks mit sicheren Wechsel dir sehen ist capture2:

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

Sie können andere nützliche Open3 Methoden in Ruby docs sehen. Ein Nachteil ist, dass jruby Unterstützung für open3 eher gebrochen ist.