Piszę szybką aplikację Rails i zastanawiałem się, jak mogę sprawdzić poprawność polecenia exec'd. Dwie uruchomione przeze mnie komendy to aktualizacja SVN i cp z jednego katalogu do drugiego.Jaki jest najlepszy sposób sprawdzania poprawności polecenia terminala, który został pomyślnie uruchomiony w Railsach?
Odpowiedz
Jeśli użyjesz metody Kernel.system(), zwróci ona wartość logiczną wskazującą powodzenie polecenia.
result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error
Istnieje dobre porównanie różnych poleceń systemu ruby: here.
Aby zaktualizować SVN, sprawdź numer wersji przed aktualizacją i po aktualizacji.
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
Dla cp, można wykonać sprawdzenie rozmiaru pliku oryginalnego, który jest równy skopiowanemu plikowi.
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
Jak ty wykonywania poleceń zewnętrznych? Funkcja Ruby system()
zwraca true
lub false
w zależności od tego, czy polecenie się powiodło. Ponadto $?
zawiera stan błędu.
- Wystarczy być pedantyczny, nie można sprawdzić poprawność „polecenie d bo
exec
zastępuje aktualny program zexec
”exec
polecenia d, więc komenda nigdy nie wróci do Ruby do walidacji. - Co do cp, prawdopodobnie lepiej byłoby używać modułu FileUtils (część Ruby Standard Library), zamiast upuszczać do powłoki.
- Jak wcześniej wspomniano, predefiniowana zmienna
$?
podaje kod powrotu ostatniej komendy do wykonania przezsystem()
lub operator zwrotny.
Tak, exec naprawdę rzucił mi się, kiedy zaczynałem programowanie ruby. Zasadniczo, nie używaj go! –
Co się stanie, jeśli repozytorium subversion nie zostało zmienione? Twój kod wskazywałby awarię. Co się stanie, jeśli zawartość pliku uległa zmianie, ale nie liczba przydzielonych bloków (i operacja kopiowania nie powiodła się)? Twój kod wskazuje na sukces. –