Ich schreibe eine schnelle Rails-App und habe mich gefragt, wie ich den Erfolg eines exec'd-Befehls validieren kann. Die zwei Befehle, die ich ausführe, sind SVN-Update und ein CP von einem Verzeichnis zum anderen.Wie kann ein Terminal-Befehl in Rails erfolgreich validiert werden?
Antwort
Wenn Sie die Methode Kernel.system() verwenden, wird ein Boolescher Wert zurückgegeben, der den Erfolg des Befehls angibt.
result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error
Es gibt einen guten Vergleich verschiedenen Rubin System here Befehle.
Überprüfen Sie für das SVN-Update die Versionsnummer vor und nach dem Update.
Für das cp, könnten Sie eine Dateigröße überprüfen, ob die Originaldatei gleich der kopierten Datei ist.
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
Wie werden die externen Befehle ausgeführt? Die Ruby-Funktion system()
gibt true
oder false
zurück, je nachdem, ob der Befehl erfolgreich war. Außerdem enthält $?
einen Fehlerstatus.
- Nur um pedantisch, können Sie einen
exec
‚d Befehl weilexec
das aktuelle Programm mit demexec
ersetzt‘ nicht bestätigen d Befehl, so würde der Befehl nie für die Validierung nach Ruby zurückzukehren. - Für die cp, zumindest, würden Sie wahrscheinlich besser mit dem FileUtils-Modul (Teil der Ruby-Standard-Bibliothek), anstatt auf die Shell fallen.
- Wie oben erwähnt, gibt Ihnen die vordefinierte Variable
$?
den Rückkehrcode des letzten Befehls, der vonsystem()
oder dem Backtick-Operator ausgeführt werden soll.
Ja, exec warf mich wirklich, als ich zum ersten Mal Ruby-Programmierung begann. Im Grunde, benutze es nicht! –
Was passiert, wenn das Subversion-Repository nicht geändert wurde? Ihr Code würde auf einen Fehler hinweisen. Was wäre, wenn sich der Dateiinhalt geändert hätte, aber nicht die Anzahl der zugewiesenen Blöcke (und der Kopiervorgang fehlgeschlagen ist)? Ihr Code würde auf Erfolg hinweisen. –