【问题标题】:What is the best way to validate a terminal command has run successfully in Rails?验证终端命令在 Rails 中成功运行的最佳方法是什么?
【发布时间】:2010-09-15 08:10:57
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby validation terminal system


    【解决方案1】:

    对于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存储库没有改变怎么办?您的代码将指示失败。如果文件内容发生了变化,但分配的块数没有变化(并且复制操作失败)怎么办?您的代码将表明成功。
    【解决方案2】:

    你是如何执行外部命令的? Ruby system() 函数根据命令是否成功返回 truefalse。此外,$? 包含错误状态。

    【讨论】:

      【解决方案3】:

      如果您使用Kernel.system() 方法,它将返回一个布尔值,指示命令成功。

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

      有一个很好的比较不同的ruby系统命令here

      【讨论】:

        【解决方案4】:
        1. 为了迂腐,您不能验证exec'd 命令,因为exec 将当前程序替换为exec'd 命令,因此该命令永远不会返回到Ruby 进行验证。李>
        2. 至少对于 cp,使用 FileUtils 模块(Ruby 标准库的一部分)可能会更好,而不是直接使用 shell。
        3. 如上所述,$? 预定义变量将为您提供由system() 或反引号运算符执行的最后一个命令的返回码。

        【讨论】:

        • 是的,当我第一次开始 ruby​​ 编程时,exec 真的让我大吃一惊。基本不用!
        猜你喜欢
        • 2013-12-19
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        相关资源
        最近更新 更多