Ответ 1
Я не знаю, какова ваша конечная цель, но вместо этого вы можете использовать следующий более надежный способ: использовать массивы в bash. (Я не буду обсуждать несколько синтаксических ошибок, которые у вас есть в вашем script.)
Не помещайте свои команды и их аргументы в строку, как вы, а затем eval
строку (кстати, в вашем случае eval бесполезен). Я понимаю ваш script как (эта версия не даст вам упомянутых вами ошибок, сравните с вашей версией, особенно нет значков доллара для переменных присваиваний):
#!/bin/bash
echo "AVR-GCC"
elf="main.elf"
c="main.c"
gcc="avr-gcc -mmcu=atmega128 -Wall -Os -o $elf $c"
eval $gcc
echo "AVR-GCC done"
У вас очень скоро возникнут проблемы, когда, например, вы сталкиваетесь с файлами с пробелами или смешными символами (подумайте о файле с именем ; rm -rf *
). Вместо этого:
#!/bin/bash
echo "AVR-GCC"
elf="main.elf"
c="main.c"
gcc="avr-gcc"
options=( "-mmcu=atmega128" "-Wall" -"Os" )
command=( "$gcc" "${options[@]}" -o "$elf" "$c" )
# execute it:
"${command[@]}"
Попытайтесь понять, что происходит здесь (я могу прояснить любые конкретные вопросы, которые вы попросите), и понять, насколько безопаснее это, чем положить команду в строку.