LINUX.ORG.RU

bash. непонятка с аргументами выполняемого процесса.


0

2

привет

проблема следующая: есть скрипт подгружаемый в основной скрипт. в скрипте лежат настройки.

пример:

MAKE_FLAGS=(
   "CFLAGS=\"-pipe -Ofast\""
   "CXXFLAGS=\"-O3 -Ipath\""
)

далее, из этих опций формируется командная строка:
local _make_flags_string="${MAKE_FLAGS[@]}"
local _make_cmd="make -j${BUILD_JOBS} -C${BUILDS_DIR}/${_rule_name} ${_make_flags_string}"
далее, сохраняю командную строку так:
echo "${_make_cmd}" > /home/$USER/cmd.txt
сохраняется вполне себе валидная строка:

make -j4 -C/home/nixman/building/build/libiconv-1.14 CFLAGS="-pipe -Ofast" CXXFLAGS="-O3 -Ipath"

копипащу ее в командную строку - все выполняется как надо.

в скрипте пытаюсь выполнить ее так:

${_make_cmd} > /home/$USER/log.txt 2>&1
в лог выводится это:

make: неверный ключ — «O»

что я делаю не так? уже и экранировать пробелы пробовал. и двойные кавычки заменял на апострофы - ошибка одна и та же.

благодарен.

★★★

Последнее исправление: niXman (всего исправлений: 1)
Ответ на: комментарий от AX

нет. сейчас получаю такую ошибку:

make: *** Нет правила для сборки цели `-Ofast"'. Останов.

команда выглядит так:

make -j4 -C/home/nixman/building/build/libiconv-1.14 -f Makefile — CFLAGS="-pipe -Ofast" CXXFLAGS="-O3 -Ipath"

niXman ★★★
() автор топика
Ответ на: комментарий от drBatty

надеюсь в вашей доке написано, что это РЕШЕТО?

да. но я не нашел иного способа решить проблему.

не подскажете ли?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

1. вы строки суёте в переменную,
2. переменную суёте в файл
3. файл суёте в строку
4. строку суёте в eval
5. и строку выполняете.

Если такое многоступенчитое выполнение для вас - самоцель, то я вам не чем могу помоч. Если вы напротив, просто хотите выполнить команду с параметрами, то на шаге №1 можно и остановится, и просто написать command $PARAMETRS.

drBatty ★★
()
Ответ на: комментарий от niXman

вы думаете я это намеренно так усложнил? ;)

думаю, что можно и упростить до одного пункта. Вообще, что касается скриптов, то по себе знаю - начинающие всё усложняют.

drBatty ★★
()
Ответ на: комментарий от drBatty

что это РЕШЕТО

Именно по-этому все configure-скрипты, создаваемые Autoconf'ом наполнены eval'ом.

[К.О.] ТС выводил переменную в файл с целью отладки скрипта. [/К.О.]

mky ★★★★★
()

Не надо так делать.

CFLAGS=«» CXXFLAGS=«»

потом source /path/to/settings

вполне достаточно и портабельно. Я лучше *FLAGS вообще не указывать.

r2d2
()
Ответ на: комментарий от mky

Именно по-этому все configure-скрипты, создаваемые Autoconf'ом наполнены eval'ом.

и что? он кагбэ и нужно для внедрения в систему нового функционала. В данном случае - полезного. Причём для автоматического внедрения.

ТС выводил переменную в файл с целью отладки скрипта.

зачем такие сложности-то?

drBatty ★★
()
Ответ на: комментарий от r2d2

Не понял ваш пост.

есть скрипт подгружаемый в основной скрипт.

Не надо так делать.

потом source /path/to/settings

Что именно вы предлагаете? По команде source как раз и выполняется скрипт.

лучше *FLAGS вообще не указывать

Почему?

mky ★★★★★
()
Ответ на: комментарий от mky

1. Не надо массивов и eval 2. (про флаги) Компиляторы разные бывают.

r2d2
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.