Rails中验证终端命令成功运行的最佳方法是什么?

6

我正在编写一个快速的Rails应用程序,并想知道如何验证执行命令的成功。我要运行的两个命令是SVN更新和从一个目录复制到另一个目录。

4个回答

8
如果您使用 Kernel.system() 方法,它将返回一个布尔值,表示命令是否成功执行。
result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error

在这里有一个很好的Ruby系统命令比较,请点击这里

2
你是如何执行外部命令的?Ruby的system()函数返回truefalse,具体取决于命令是否成功执行。此外,$?包含一个错误状态。

1
  1. 只是为了严谨起见,您无法验证一个 exec 命令,因为 exec 会用 exec 命令替换当前程序,所以该命令永远不会返回到 Ruby 进行验证。
  2. 对于 cp 命令,您最好使用 FileUtils 模块(Ruby 标准库的一部分),而不是降级到 shell。
  3. 如上所述,$? 预定义变量将为您提供由 system() 或反引号运算符执行的最后一个命令的返回代码。

是的,当我开始学习 Ruby 编程时,exec 真的让我很困惑。基本上,不要使用它! - Orion Edwards

-4

在进行 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

如果Subversion仓库没有更改会怎样?你的代码将指示失败。如果文件内容已更改但未更改分配的块数(并且复制操作失败),你的代码将指示成功。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接