Оператор блока IF внутри скрипта execlineb

411
DarkGhostHunter

У меня есть Docker-контейнер на основе Alpine, который запускает S6 Overlay для управления двумя службами внутри него (музыкальной базой данных и веб-интерфейсом для управления им). Проблема заключается в том, что второй сервис является необязательным и зависит от $переменной среды (true | false).

Итак, в основном у меня есть это, но служба не может работать, потому что ifблок недействителен:

#!/usr/bin/execlineb -P  with-contenv  if [ $SERVICE_2 = true ]; then \ sh -c "exec -a service_2 /usr/bin/php /var/www/service_2_music_admin_script.php >> /proc/self/fd/1 2>&1" \ ;fi 

Выполнение скрипта возвращает:

if: fatal: unterminated block 

Кстати, контейнер не имеет bash; работает Busybox. Я пытаюсь избежать установки Bash, если это не критично.

1
Поддерживается ли этот синтаксис, может быть: `[$ SERVICE_2 = true] && sh…`? Kamil Maciorowski 6 лет назад 0
Нет, даже без разрывов строки `\`. Та же ошибка DarkGhostHunter 6 лет назад 0
Я немного знал об execlineb и предполагал, что он похож на `sh`, так как ваш` if` в основном такой же. Но [этот сайт] (https://skarnet.org/software/execline/if.html) содержит совершенно другой синтаксис `if`, и это может быть причиной вашей ошибки. Другая идея: вы запускаете `sh` в конце концов; почему вы не сделаете этот скрипт скриптом `sh`? Kamil Maciorowski 6 лет назад 1
Я решил использовать `sh`. По сути, я хэшбанировал `/ usr / sbin / with-contenv sh` и продолжал нормально. DarkGhostHunter 6 лет назад 0

1 ответ на вопрос

2
DarkGhostHunter

После некоторого копания блок If в execline стал слишком большим нюансом. Итак, я решил корневую проблему: изменил на sh с переменными среды контейнера.

#!/usr/bin/with-contenv sh  ... 

Затем я использовал execдля выполнения процесса (в противном случае он не подключается к S6).