Я пишу быстрое приложение на Rails, и мне было интересно, как я могу проверить успешность команды exec'd. Две команды, которые я выполняю, - это обновление SVN и cp из одного каталога в другой.
Для обновления SVN проверьте номер версии до и после обновления.
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
Для cp вы можете проверить размер исходного файла, равный скопированному.
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
Как вы выполняете внешние команды? Функция Ruby system()
возвращает true
или false
в зависимости от того, была ли команда успешной. Кроме того, $?
содержит статус ошибки.
Если вы используете метод Kernel.system (), он вернет логическое значение, указывающее на успех команды.
result = system("cp -r dir1 dir2")
if (result)
#do the next thing
else
# handle the error
Есть хорошее сравнение различных системных команд ruby здесь.
exec
'd, потому что exec
заменяет текущую программу командой exec
'd, поэтому команда никогда не вернется в Ruby для проверки.$?
предоставит вам код возврата последней команды, которая должна быть выполнена system()
или оператором обратного апострофа.Да, exec меня действительно потрясло, когда я только начал программировать на Ruby. В принципе, не используйте его!
Что, если репозиторий Subversion не был изменен? Ваш код укажет на сбой. Что, если изменилось содержимое файла, но не количество выделенных блоков (и операция копирования не удалась)? Ваш код будет означать успех.