Вы не можете использовать
case somecommand in ...
потому что:
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
Обратите внимание на слово
, то есть строку.
Использование $(true)
не работает, так как true
не дает никакого вывода на стандартный вывод.
Я бы предложил:
{ somecommand; err="$?"; } || true
case "$err" in ...
Это остановит выход скрипта, запущенного под errexit
(-e
).
Из руководства bash
(из описания set -e
):
Оболочка не завершает работу, если команда, которая завершилась неудачно, является частью списка команд, непосредственно следующего за ключевым словом while или until, частью теста после зарезервированных слов if или elif зарезервированных слов, частью любой команды, выполняемой в списке && или ||, за исключением команды, следующей за заключительной && или ||, любой команды в конвейере, кроме последней, или если возвращаемое значение команды инвертируется с помощью !
Возможно, есть способ. Когда вы развертываете эти файлы, вы можете редактировать их с помощью sed
. Таким образом, ваш базовый файл конфигурации может иметь следующие строки:
...
Type=simple
ExecStart=/bin/airflow worker -q "nameOfWorker"
Restart=on-failure
...
И у вас может быть сценарий, который заменяет строку «nameOfWorker» на предполагаемое имя:
sed 's/nameOfWorker/${intendedName}/' YourBaseSystemd.service > NewlyMade.service
Таким образом, вы можете запускать эту строку кода при подготовке новых машин.