2008-10-05 26 views

Odpowiedz

8

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.

-4

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 
+0

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. –

2

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.

1
  1. Wystarczy być pedantyczny, nie można sprawdzić poprawność „polecenie d bo exec zastępuje aktualny program z execexec polecenia d, więc komenda nigdy nie wróci do Ruby do walidacji.
  2. Co do cp, prawdopodobnie lepiej byłoby używać modułu FileUtils (część Ruby Standard Library), zamiast upuszczać do powłoki.
  3. Jak wcześniej wspomniano, predefiniowana zmienna $? podaje kod powrotu ostatniej komendy do wykonania przez system() lub operator zwrotny.
+0

Tak, exec naprawdę rzucił mi się, kiedy zaczynałem programowanie ruby. Zasadniczo, nie używaj go! –