2011-01-24 12 views
7

C'è un modo per catturare un errore "comando non trovato" in uno script Ruby? Per esempio, data:Catturare errori "comando non trovato" dai backtick di Ruby?

output = `foo` 

Come faccio a intrappolare la situazione in cui foo non è installato? Mi aspettavo di poter fare rescue un'eccezione, ma questo non sembra funzionare su 1.8.7. C'è un modo diverso di chiamare il sottoprocesso che farà ciò che voglio? O c'è un approccio diverso?

Aggiornamento

Le mie scuse, ho dimenticato di dire un requisito nascosta: Io preferirei che l'interprete non perde la riga di comando per l'utente (che può contenere dati sensibili), motivo per cui l'eccezione il metodo di cattura è preferito. Ci scusiamo ancora per averlo lasciato fuori la prima volta.

+0

Una tattica che è utile quando si ha bisogno di una caratteristica specifica, è per eseguire un controllo preliminare, cercando prima la funzionalità, l'app o il codice, prima di provare a eseguirlo. Dicendo 'which 'foo'' o usando un paio di File test per cercare l'esistenza del file più la sua eseguibilità, vi dirà se è sicuro procedere senza effettivamente tentare il comando e fallendo. Offre un'esperienza utente migliore perché puoi controllare il modo in cui reagisci alla funzionalità mancante, o percorrere un percorso alternativo o notificare all'utente che non puoi procedere perché manca qualcosa. –

+0

D'accordo, ma "quale 'foo'' non è multipiattaforma, e non potrei pensare a un modo multipiattaforma di farlo se non provarlo e cogliere l'errore ... – kfb

risposta

13

Utilizzare il codice di ritorno!

irb(main):001:0> `date` 
=> "Mo 24. Jan 16:07:15 CET 2011\n" 
irb(main):002:0> $? 
=> #<Process::Status: pid=11556,exited(0)> 
irb(main):003:0> $?.to_i 
=> 0 
irb(main):004:0> `foo` 
(irb):4: command not found: foo 
=> "" 
irb(main):005:0> $?.to_i 
=> 32512 

http://corelib.rubyonrails.org/classes/Process/Status.html

Redirecting STDERR a STDOUT vi darà l'uscita come valore di ritorno, invece di gonfiore è appena uscito:

irb(main):010:0> `foo 2>&1` 
=> "sh: foo: not found\n" 
irb(main):011:0> $?.to_i 
=> 32512 
+0

Grazie! Tuttavia ho dimenticato di menzionare un ulteriore requisito di non far fuoriuscire la linea di comando; se capisco correttamente questo mostrerebbe ancora il comando non trovato messaggio all'utente. – kfb

+0

Aggiunto esempio su come fare questo alla mia risposta. –

+0

Funziona come un fascino! Grazie! – kfb