bash: невозможно выполнить команды сборки с помощью bash сценариев - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь запустить команду 'make' из моего скрипта bash для создания кода.

Я вижу, что все параметры были назначены и могу отобразить команду, которую я пытаюсь запустить. Я не мог видеть никаких проблем с командой. Но проблема в том, что когда он пытается выполнить команду через скрипт bash, он терпит неудачу.

My command is :- ./build_script LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm"

Скрипт Фрагмент разбора всех аргументов и построения команды make: -

makeargs=""
for build_flag do
   if [[ "$build_flag " = "PROJECTS="* ]]; then
          apps =`echo $build_flag |sed "s/PROJECTS=//" `
          makeargs="$makeargs PROJECTS=\"$apps \""
   else
        makeargs="$makeargs $build_flag"
    fi
done
echo "make DCOV=1 $makeargs $maketest"
make DCOV=1 $makeargs $maketest

Когда я запускаю сценарий, я вижу, что команда сборки построена правильно.

Вывод: -

make DCOV=1 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm" run_all
GNUmakefile:16: warning: overriding commands for target `/'
GNUmakefile:19: warning: ignoring old commands for target `/'
make: *** No rule to make target `bfm"'.  Stop.

Я пытаюсь напечатать PROJECTS переменная в моем 'GNUmakefile' присутствует в папке build_main. Я вижу результат: PROJECTS is "bfm. Он не принимает целую "cuda bfm" как целую строку.

Примечание: - Когда я пытаюсь запустить ту же команду сборки: - make DCOV=1 LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm" run_all явно работает нормально.

Похоже, проблема Интерпретация переменных с makefile.

Есть какое-нибудь решение для этого? Пожалуйста помоги. Спасибо!

1 Ответ

2 голосов
/ 20 февраля 2020

Измените makeargs строку на массив, прежде чем передать ее в качестве группы аргументов.

eval makeargs_array=( $makeargs )
make UVC=1 "${makeargs_array[@]}" $maketest

Если вы не преобразуете в массив, при включении отладки интерпретация последней строки будет показана как

make DCOV=1 LIC=1 DOCUMNETS=1 'PROJECTS="cuda' bfm '"'

Что явно игнорирует двойные кавычки и рассматривает пробел в качестве разделителя. В этом случае в качестве отдельного аргумента передается даже двойная кавычка.

Объяснение:

Разделение слов В нем говорится:

Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметического c раскрытия, которые не встречались в двойных кавычках для разбиения слов.

Если мы используем "$makeargs", то есть в окружении двойных кавычек , это не учитывается разделением слов и приводит к LIC=1 DOCUMNETS=1 "PROJECTS=cuda bfm"

Но опять же это полная строка, в то время как требуется разделить строку для использования в качестве аргументов.

Так что теперь используем $makeargs.

Разделение слов вступает в действие в соответствии с IFS по умолчанию (пробел, табуляция, перевод строки), мы получаем результат как LIC=1 DOCUMNETS=1 PROJECTS="cuda bfm "

Часть строки, заключенная в двойные кавычки, не влияла на разбиение слов, поскольку разделение здесь - это полная строка.

Почему массив работал здесь?

Массив сам расширяет каждый элемент как отдельное слово при использовании @, и здесь не требуется дальнейшего разделения слов после расширения.

Массивы

...