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
На этом все. Проблему я свою решил, если кому интересно более подробней, пишите в комментариях вопросы, будем искать на них ответы.
Читайте также:
- Proxmox — apt-get update не работает
- Debian ssh root — Permission denied, please try again.
- Solr cli команды
- Равномерное распределение трафика по LAN портам Synology
- Cli string replace