Почему скрипты хуков действия OpenShift терпят неудачу со странными ошибками?

Я переименовал action_hook из ловушки действий, не относящейся к картриджу (например, post_restart) для конкретного картриджа (например, post_restart_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
}

1 ответ

Решение

Проблема заключается в том, что перехватчики действий, не относящиеся к картриджам, по-видимому, запускают bash в режиме не POSIX, который допускает дефисы в именах функций, а перехватчики действий, специфичные для картриджей, запускают bash в режиме POSIX, который не допускает дефисы в именах функций.

Почему специфические для картриджа действия запускают bash в режиме POSIX? Я не уверен на 100%, но я думаю, что происходит следующее:

  1. v2_cart_model.rb: кассета_hooks запоминает хук как source <hook filepath>,
  2. v2_cart_model.rb:do_control_with_directory создает командную строку set -e; <path to control script> <action> <other args>; source <hook filepath>,
  3. Это, вероятно, передает эту строку sh -c который работает в режиме POSIX и потому, что он использует source, он читает сценарий напрямую, а не запускает его в новом процессе (который будет читать #!/bin/bash линия и бег /bin/bash который по умолчанию не в режиме POSIX).

Должно быть что-то отличное в кодировке, не относящемся к картриджам, в v2_cart_model.rb это позволяет избежать шагов, описанных выше.

Мое решение было использовать unset POSIXLY_CORRECT в моем скрипте, который отключил режим POSIX.

Я отладил эту проблему, запустив set команда в моем скрипте, которая показала множество переменных bash, ведущих к исследованиям, на которых я использовал процесс исключения.

Другие вопросы по тегам