【问题标题】:What does this Ruby code mean?这段 Ruby 代码是什么意思?
【发布时间】:2016-12-16 13:58:05
【问题描述】:

我正在尝试对 gitlab 进行备份还原,它有点工作,但命令行总是说存储库的还原失败。我想我在负责[失败]语句的代码中找到了条件语句。有人知道这是在做什么,或者知道我应该去寻找错误的方向吗?

 if Kernel.system("git clone --bare #{path_to_bundle} #{project.repository.path_to_repo} > /dev/null 2>&1")
puts "[DONE]".green                                                                                                                                                               
          else                                                                                                                                                                                
            puts "[FAILED]".red                                                                                                                                                               
          end 

【问题讨论】:

    标签: ruby git backup gitlab


    【解决方案1】:

    Kernel.system 调用给定的 shell 命令。当它失败时,它会返回一个 false 值。

    在您的情况下,这意味着 git clone --bare #{path_to_bundle} #{project.repository.path_to_repo} > /dev/null 2>&1 失败。

    您可以在没有> /dev/null 2>&1 的情况下手动在命令行上执行此命令时检查失败的原因。

    要获取命令,您可以在命令之前的调试打印处

    if Kernel.system(pp("git clone --bare #{path_to_bundle} #{project.repository.path_to_repo} > /dev/null 2>&1"))

    【讨论】:

    • 如果我检查 /dev/null 2>&1.我得到输出: -bash: /dev/null: Permission denied 我试图更改 dev/null 和 repo 的 chmod 和 chown。但我仍然收到权限被拒绝的消息。我做错了什么?
    • 您的主机是裸机还是某种虚拟机或容器?看起来您的用户对 /dev/null 没有写权限。您使用哪种操作系统?
    • 我用的是 vm(盒子里的外壳)
    • 我不知道你的虚拟机你可以试试ls -l /dev/null来检查这个设备是否存在。当它存在时,您没有使用权限。您必须询问您的管理员或文档如何解决此问题。 >/dev/null 2>&1 并不重要。它应该只使评论静音。
    • 如果 chmod 不起作用,可能是您没有更改权限的权限,或者 apparmor 之类的东西阻止您访问此设备。您可以使用uname -a 获取有关您的系统的更多信息。 ps -ef 还可以告诉你一些关于你的虚拟机上发生了什么的事情。
    【解决方案2】:

    来自docs

    如果命令给出零退出状态,系统返回true,对于非零退出状态返回false。如果命令执行失败,则返回 nil$? 中提供了错误状态。

    也就是说:不断陷入失败状态意味着系统命令返回falsenil。您可能想查看$? 的原因:

    command = Kernel.system("git clone --bare #{path_to_bundle} #{project.repository.path_to_repo} > /dev/null 2>&1")
    if command
      puts "[DONE]".green
    else
      puts "[FAILED]".red
      puts "Reason:"
      puts $?
    end 
    

    【讨论】:

    • 如果我这样做,我会得到输出:pid 7169(每个 pid 有一个不同的编号)exit 128(所有出口都有相同的编号)
    • 当您收到错误代码 128 this question and the answers 时,您可能会感兴趣。
    猜你喜欢
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多