Sé cómo ejecutar un comando de la shell en Ruby como:

%x[#{cmd}]

Pero, ¿cómo puedo especificar un directorio para ejecutar este comando?

Es allí 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!

InformationsquelleAutor icn | 2012-04-13

6 Comentarios

  1. 124

    Puede utilizar el bloque de la versión de Dir.chdir. En el interior del bloque que está en el directorio solicitado, después de que el Bloque que está todavía en el directorio anterior:

    Dir.chdir('mydir'){
      %x[#{cmd}]
    }
    • +1 parece que muy pocos los programadores Ruby sabe acerca de esto.
    • La cosas como esta que Ruby hace con bloques nunca dejan de sorprenderme. Ruby constantemente hace que mis otros idiomas sentir torpe y demasiado complicado.
    • Esto es increíble, yo sólo había conocido de esto antes!
    • Dir.chdir está bien si tienes un solo hilo. Para varios subprocesos vistazo a las otras respuestas aquí.
    • agradable, funciona con jruby demasiado. @neoneye, buen punto.
    • Esto es ideal para un único subproceso de secuencias de comandos. No es seguro para el lanzamiento de varios procesos en paralelo.

  2. 12

    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"
  3. 2

    La más cercana veo a backtricks, con caja de seguridad cambio de dir es capture2:

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

    Se puede ver en otras útil Open3 métodos en ruby docs. Un inconveniente es que jruby apoyo para open3 es bastante roto.

    • El uso de la :chdir opción de que cualquier Process.spawnbasado en la llamada (system, popen3,…) parece ser seguro para subprocesos para el lanzamiento de procesos paralelos, demasiado.
  4. 1

    Tal vez no es la mejor solución, pero intenta utilizar Dir.pwd para obtener el directorio actual y guardarlo en algún lugar. Después de que el uso de Directorios.chdir( destino ), donde el destino es un directorio donde se desea ejecutar el comando. Después de ejecutar el comando use Dir.chdir de nuevo, el uso de guardado previamente directorio a restaurar.

    • También puede utilizar el bloque de la versión de Dir.chdir. En el interior del bloque que está en el directorio solicitado, después de que el Bloque que está todavía en el directorio anterior.
    • Usted debe hacer que una respuesta – me gusta! Yo iba a sugerir algo loco como Dir.chdir(Dir.pwd.tap {Dir.chdir('d:\test\local'); #otherstuff}) como yo no era consciente de chdir podría tomar un bloque de
    • Tienes razón, aquí es
  5. 1

    Tuve este mismo problema y se soluciono poniendo ambos comandos en la parte de atrás de las garrapatas y la separación con ‘&&’:

    `cd \desired\directory && command`

Dejar respuesta

Please enter your comment!
Please enter your name here