#shell #sh #circleci
Вопрос:
Я создал сценарий, и когда я пытаюсь запустить его локально, он работает нормально, но когда я запускаю его на circleci, я получаю ошибку.
Это сценарий
#!/usr/bin/env bash for d in */ ; do cd $d for f in * ; do if [[ $f == *.sh ]]; then if [[ $d == "test/" ]]; then echo "$d" else bash *.sh fi else if [[ $f == *.yaml ]]; then echo "$file" fi fi done cd .. done
И это ошибка, которую я получил на ci
generate-docs.sh: 4: cd: can't cd to */ generate-docs.sh: 6: [[: not found generate-docs.sh: 15: [[: not found
Комментарии:
1. Первая ошибка: в текущем каталоге нет каталогов. Когда это происходит, по умолчанию шаблон глобуса просто превращается в строку.
2. Другие ошибки: скрипт запускается не с помощью bash, а с помощью простого sh.
3. Кроме того,
bash *.sh
— как вы думаете, что это делает?4. @glennjackman На самом деле я запускал сценарий не с помощью bash, поэтому я мог исправить первую и вторую ошибки, но о «bash *.sh». Я запускаю это, чтобы попытаться скомпилировать все сценарии внутри каталога $d, но это не работает. Знаете ли вы правильный способ сделать это?
5. @glennjackman Я только что сделал это, но цикл продолжается бесконечно
Ответ №1:
Что касается линии
bash *.sh
Похоже, вы хотите запустить все сценарии сразу. Предполагая, что файлы оболочки «a.sh», «b.sh», «c.sh» и т. Д., Затем оболочка расширяет это bash a.sh b.sh c.sh ...
значение, что означает, что первый (в алфавитном порядке) запускается со всеми остальными, приведенными в качестве аргументов. Вам нужно зацикливаться, выполняя по одному за раз. Но вы уже находитесь внутри петли, так что все, что вам там нужно, это
bash "$f"
Ответ №2:
(Я не знаю circleci, но мое предложение слишком длинное, чтобы вдаваться в комментарий, поэтому я пишу его как ответ):
Прежде всего, я хотел бы убедиться, что скрипт запускается в правильном месте и использует правильную оболочку. Поэтому я бы поставил в начале вашего сценария такую защиту, как эта:
#!/usr/bin/env bash if test -z "${BASH_VERSION}" then echo "Needs to be executed with bash!" exit 1 fi echo Working Directory is "$PWD" set -x # Only for debugging. Remove it when everything works # ... your remaining script goes here