Qual è il modo migliore per convalidare un comando terminale eseguito correttamente in Rails?
-
05-07-2019 - |
Domanda
Sto scrivendo un'app Rails veloce e mi chiedevo come posso confermare il successo di un comando exec'd. I due comandi che sto eseguendo sono e l'aggiornamento SVN e un cp da una directory all'altra.
Soluzione
Se si utilizza il metodo Kernel.system () restituirà un valore booleano che indica il successo del comando.
result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error
Esiste un buon confronto tra diversi comandi del sistema ruby ?? qui .
Altri suggerimenti
Come stai eseguendo i comandi esterni? La funzione system ()
di Ruby restituisce true
o false
a seconda che il comando abbia avuto esito positivo. Inoltre, $?
contiene uno stato di errore.
- Solo per essere pedanti, non è possibile convalidare un comando
exec
'd perchéexec
sostituisce il programma corrente conexec
' d comando, quindi il comando non tornerà mai su Ruby per la convalida. - Almeno per il cp, probabilmente sarebbe meglio usare il modulo FileUtils (parte della Ruby Standard Library), piuttosto che passare alla shell.
- Come notato sopra, la variabile predefinita
$?
ti fornirà il codice di ritorno dell'ultimo comando eseguito dasystem ()
o dall'operatore backtick.
Per l'aggiornamento SVN, controllare il numero di versione prima e dopo l'aggiornamento.
svn_start_version = IO.popen("svn info").readlines[4]
`svn update`
svn_end_version = IO.popen("svn info").readlines[4]
if svn_end_version > svn_start_version
"success"
end
Per il cp, potresti fare un controllo della dimensione del file sul file originale uguale al file copiato.
source_file_size = IO.popen("du file1").readlines
`cp file1 file2`
dest_file_size = IO.popen("du file2").readlines
if dest_file_size == source_file_size
"success"
end