Cli string replace | Wiki | PWODEV
, 21.07.2020 12:58

Cli string replace


Делаю я, значит, небольшой скрипт по переименовывании файлов blalbalba.env.dist в blalbalba.env и дальнейшей замене в файлах переменных с помощью командной строки. Сначала все было хорошо, локально работает замечательно. Пришло время запушить все на AWS, а именно в деплой процесс, в файлик buildspec.yml. И тут мне появилась на глаза ошибочка из-за которой пришлось немного подебажить. Запишу сюда все это для потомков.

Итак исходный скрипт который работает локально без проблем:

for DIST_FILE in $(find . -type f -name "*.dist"); do cat "$DIST_FILE" | envsubst > "${DIST_FILE/.dist/}";

Но этот же скрипт в CodeBuild в AWS не работает и показывает следующую ошибку:

Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: for DIST_FILE in $(find . -type f -name «*.dist»); do cat «$DIST_FILE» | envsubst > «${DIST_FILE/.dist/}»; done. Reason: exit status 2

Начал я дебажить по каждой команде в отдельности. Для начала думал проблема лежит тут:

cat "$DIST_FILE" | envsubst

cat — это вывод содержимого файла. envsubst — эта функция заменяет в полученном тексте cat переменные которые должны быть ранее определены командой

export VARIABLE_NAME='test_value'

Получается если cat покажет $VARIABLE_NAME то envsubst заменит все $VARIABLE_NAME на test_value.

Что еще важно envsubst не работает без gettext. Поэтому надо ранее установить это:

apt install gettext

Но после этого проблема не решилась. Начал дебажить дальше и выявил проблему тут:

${DIST_FILE/.dist/}

Эта команда берет название файла DIST_FILE ищет в нем «.dist» и заменяет ее на пустоту. В переменной DIST_FILE для примера будет «blalbalba.env.dist». Результатом команды должно быть «blalbalba.env».

Дело в том что CodeBuild в AWS не понимает эту команду. String Replace в таком случае надо делать по другому. В php есть такая функция, она позволяет заменить текст в строке:

str_replace();

Но мы используем не php а bash и в этом случае надо пользоваться такой функицей:

$(echo "$DIST_FILE" | sed "s/.dist//");

Эта cli команда позволяет без проблем заменить поисковый текст в строке.

В конце покажу что получилось:

for DIST_FILE in $(find . -type f -name "*.dist"); do cat $DIST_FILE | envsubst > $(echo "$DIST_FILE" | sed "s/.dist//"); done

На этом все. Проблему я свою решил, если кому интересно более подробней, пишите в комментариях вопросы, будем искать на них ответы.


Добавить комментарий