2012-04-13 2 views
44

so come eseguire un comando di shell in Ruby come:Rubino comando di shell run in una directory specifica

%x[#{cmd}] 

Ma, come faccio a specificare una directory per eseguire questo comando?

C'è un modo simile di sborsare, simile a subprocess.Popen in Python:

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

Grazie!

risposta

109

È possibile utilizzare la versione di blocco di Dir.chdir. All'interno del blocco ci si trova nella directory richiesta, dopo il blocco si è ancora nella directory precedente:

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

+1 Sembra che pochi programmatori Ruby lo sappiano. – Phrogz

+5

Cose come questa che Ruby fa con i blocchi non smettono mai di stupirmi. Ruby rende costantemente i miei altri linguaggi grossi e complicati. – bta

+0

Questo è incredibile, se solo ne avessi saputo prima! – ZirconCode

10

Rubino 1.9.3 (blocco delle chiamate):

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

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

forse non è la soluzione migliore, ma tenta di utilizzare Dir.pwd per ottenere la directory corrente e salvarlo da qualche parte. Quindi utilizzare Dir.chdir (destinazione), dove destinazione è una directory da cui si desidera eseguire il comando. Dopo aver eseguito il comando, utilizzare di nuovo Dir.chdir, utilizzando la directory salvata in precedenza per ripristinarlo.

+2

È inoltre possibile utilizzare la versione di blocco di 'Dir.chdir'. All'interno del blocco ci si trova nella directory richiesta, dopo il blocco ci si trova ancora nella directory precedente. – knut

+0

@knut Dovresti fare una risposta - Mi piace! Stavo per suggerire qualcosa di pazzo come 'Dir.chdir (Dir.pwd.tap {Dir.chdir ('d: \ test \ local'); #otherstuff})' poichè non ero a conoscenza chdir poteva prendere un blocco –

+0

@AbeVoelker Hai ragione, [eccolo qui] (http://stackoverflow.com/a/10148325/676874) – knut

4

anche, prendendo la via shell

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

Ho avuto questo stesso problema e risolto da mettendo entrambi i comandi in avanti e zecche separandoli con '& &':

`cd \desired\directory && command` 
1

Il più vicino che vedere la backtricks con dir cambiando cassaforte è capture2:

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

Potete vedere altri metodi Open3 utili in docs rubino. Uno svantaggio è che il supporto jruby per open3 è piuttosto rotto.