2012-04-13 13 views
44

sé cómo ejecutar un comando shell en Ruby como:Rubí orden de marcha cáscara en un directorio específico

%x[#{cmd}] 

Pero, ¿Cómo se especifica un directorio para ejecutar este comando?

¿Hay una manera similar de los bombardeos a cabo, de forma similar a subprocess.Popen en Python:

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

Gracias!

Respuesta

109

Puede usar la versión en bloque de Dir.chdir. Dentro del bloque se encuentra en el directorio solicitado, después de que el bloque está todavía en el directorio anterior:

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

+1 Parece que muy pocos programadores de Ruby lo saben. – Phrogz

+5

Las cosas como esta que Ruby hace con los bloques nunca dejan de sorprenderme. Ruby constantemente hace que mis otros idiomas se sientan torpes y complicados. – bta

+0

¡Esto es asombroso, si hubiera sabido esto antes! – ZirconCode

10

de Ruby 1.9.3 (bloqueo de llamadas):

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

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

tal vez no es la mejor solución, pero trate de usar Dir.pwd para obtener el directorio actual y guardarlo en algún lugar. Después de eso, use Dir.chdir (destino), donde el destino es un directorio desde el que desea ejecutar el comando. Después de ejecutar el comando, use Dir.chdir de nuevo, utilizando el directorio previamente guardado para restaurarlo.

+2

También puede usar la versión en bloque de 'Dir.chdir'. Dentro del bloque está en el directorio solicitado, después del Bloque todavía está en el directorio anterior. – knut

+0

@knut Deberías hacer una respuesta: ¡me gusta! Iba a sugerir algo loco como 'Dir.chdir (Dir.pwd.tap {Dir.chdir ('d: \ test \ local'); #otherstuff})' ya que no sabía que chdir podría tomar un bloque –

+0

@AbeVoelker Tienes razón, [aquí está] (http://stackoverflow.com/a/10148325/676874) – knut

4

también, tomando la ruta cáscara

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

Tuve este mismo problema y lo resolvió por poniendo ambos comandos en las garrapatas de espalda y separar con '& &':

`cd \desired\directory && command` 
1

lo más cerca que veo a backtricks con dir caja fuerte está cambiando capture2:

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

Puede ver otros métodos Open3 útiles en documentos de rubí. Una desventaja es que el soporte jruby para open3 está bastante roto.

Cuestiones relacionadas