сценарий оболочки для d в */ ; do выполняется локально, но он не работает в circleci

#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