为什么OpenShift操作挂钩脚本会因奇怪的错误而失败?

为什么OpenShift操作挂钩脚本会因奇怪的错误而失败?,openshift,Openshift,我将非盒式磁带特定的操作挂钩(例如post\u restart)重命名为盒式磁带特定的操作挂钩(例如post\u restart\u cron),然后遇到奇怪的新错误,例如: /var/lib/openshift/${USER}/app-root/runtime/repo/.openshift/action_hooks/post_restart_cron: line 5: `firstcron-secondcron': not a valid identifier 脚本文件post_resta

我将非盒式磁带特定的操作挂钩(例如
post\u restart
)重命名为盒式磁带特定的操作挂钩(例如
post\u restart\u cron
),然后遇到奇怪的新错误,例如:

/var/lib/openshift/${USER}/app-root/runtime/repo/.openshift/action_hooks/post_restart_cron: line 5: `firstcron-secondcron': not a valid identifier
脚本文件post_restart_cron为:

#!/bin/bash

function firstcron-secondcron {
    echo in function
}

问题在于,非盒带特定的操作挂钩显然在非POSIX模式下运行bash,该模式允许在函数名中使用连字符,但盒带特定的操作挂钩在POSIX模式下运行bash,该模式不允许在函数名中使用连字符

为什么特定于盒带的操作挂钩在POSIX模式下运行bash?我不是100%确定,但我认为会发生以下情况:

  • 将钩子记住为
    源代码
  • 创建命令字符串
    set-e;来源
  • 它可能将该字符串传递给在POSIX模式下运行的
    sh-c
    ,因为它使用
    source
    ,所以它直接读取脚本,而不是在新进程中运行它(这将读取
    #!/bin/bash
    行并运行
    /bin/bash
    ,默认情况下非POSIX模式)
  • v2\u cart\u model.rb
    中非盒式磁带特定的代码路径必须有所不同,以避免上述步骤

    我的解决方案是在禁用POSIX模式的脚本中使用
    unset POSIXLY_CORRECT

    我通过在脚本中运行
    set
    命令调试了这个问题,该命令显示了导致我使用消除过程进行调查的各种bash变量