Каков наилучший способ проверки правильности работы терминальной команды в Rails? - PullRequest
6 голосов
/ 05 октября 2008

Я пишу быстрое приложение на Rails, и мне было интересно, как я могу подтвердить успех команды exec'd. Две команды, которые я запускаю: SVN update и cp из одного каталога в другой.

Ответы [ 4 ]

8 голосов
/ 05 октября 2008

Если вы используете метод Kernel.system () , он вернет логическое значение, указывающее на успешное выполнение команды.

result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error

Существует хорошее сравнение различных системных команд ruby ​​ здесь .

2 голосов
/ 05 октября 2008

Как вы выполняете внешние команды? Функция Ruby system() возвращает true или false в зависимости от того, была ли команда успешной. Кроме того, $? содержит состояние ошибки.

1 голос
/ 05 октября 2008
  1. Просто чтобы быть педантичным, вы не можете проверить команду exec 'd, потому что exec заменяет текущую программу командой exec' d, поэтому команда никогда не вернется в Ruby для проверки.
  2. По крайней мере, для cp вам лучше использовать модуль FileUtils (часть стандартной библиотеки Ruby), чем переходить на оболочку.
  3. Как отмечалось выше, предопределенная переменная $? даст вам код возврата последней команды, которая должна быть выполнена system() или оператором обратного удара.
0 голосов
/ 05 октября 2008

Для обновления 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
...