Измените 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
"
Часть строки, заключенная в двойные кавычки, не влияла на разбиение слов, поскольку разделение здесь - это полная строка.
Почему массив работал здесь?
Массив сам расширяет каждый элемент как отдельное слово при использовании @
, и здесь не требуется дальнейшего разделения слов после расширения.
Массивы