2016-08-23 1 views
0

Я пытаюсь написать программу, которая позволит упростить управление проектами Arduino. Поэтому я написал сценарий bash, который создает для меня все необходимые папки и файлы, и когда я его выполняю, я бегу как чемпион. Потому что я хочу, чтобы изменить каталог в рабочем терминале внутри сценария я бег сценария как этогоЯ получаю синтаксическую ошибку, когда я вызываю скрипт из C++-программы

. ./initialize.sh 

Это также работает большим, но потому, что я пишу программу на С ++, поиск этого сценария из программы дает мне головную боль.

Так внутри программы я запускаю этот скрипт так:

system(". /usr/lib/avrduino/script/initialize.sh"); 

, а затем, когда я запускаю программу, я получаю эту ошибку:

sh: 25: /usr/lib/avrduino/script/initialize.sh: Syntax error: "(" unexpected (expecting "}")

Запуск скрипта из программы, как это:

system("/usr/lib/avrduino/script/initialize.sh"); 

работает без ошибок, но работает в подоболочке.

точки

Синтаксис ошибки в этой строке в сценарии

options=("uno" "mega" "mega2560" "atmega8" "atmega168" "atmega328" "pro" "pro5v" "pro328" "pro5v328") 

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

EDIT: код сценария

#!/bin/bash 

BLACK='\033[0;30m' 
RED='\033[0;31m' 
GREEN='\033[0;32m' 
BROWN='\033[0;33m' 
BLUE='\033[0;34m' 
PURPLE='\033[0;35m' 
CYAN='\033[0;36m' 
LGRAY='\033[0;37m' 
DGRAY='\033[1;30m' 
LRED='\033[1;31m' 
LGREEN='\033[1;32m' 
YELLOW='\033[1;33m' 
LBLUE='\033[1;34m' 
LPURPLE='\033[1;35m' 
LCYAN='\033[1;36m' 
WHITE='\033[1;37m' 
NC='\033[0m' 

makefile() 
{ 
    BOARD="default" 
    PS3='Chose your board: ' 
    options=("uno" "mega" "mega2560" "atmega8" "atmega168" "atmega328" "pro" "pro5v" "pro328" "pro5v328") 
    select opt in "${options[@]}" 
    do case $opt in 
    "uno") BOARD="uno" 
    cp -r /usr/lib/avrduino/data/boards_info/uno/board-info.h . 
    MCU="atmega328P" 
    F_CPU="16000000UL" 
    ;; 
    "mega") BOARD="mega" 
    cp -r /usr/lib/avrduino/data/boards_info/mega/board-info.h . 
    F_CPU="16000000UL" 
    ;; 
    "mega2560") BOARD="mega2560" 
    cp -r /usr/lib/avrduino/data/boards_info/mega2560/board-info.h . 
    F_CPU="16000000UL" 
    ;; 
    "atmega8") BOARD="atmega8" 
    cp -r /usr/lib/avrduino/data/boards_info/atmega8/board_-nfo.h . 
    MCU="atmega8" 
    F_CPU="16000000UL" 
    ;; 
    "atmega168") BOARD="atmega168" 
    cp -r /usr/lib/avrduino/data/boards_info/atmega168/board-info.h . 
    MCU="atmega168" 
    F_CPU="16000000UL" 
    ;; 
    "atmega328") BOARD="atmega328" 
    cp -r /usr/lib/avrduino/data/boards_info/atmega328/board-info.h . 
    MCU="atmega328P" 
    F_CPU="16000000UL" 
    ;; 
    "pro") BOARD="pro" 
    cp -r /usr/lib/avrduino/data/boards_info/pro/board-info.h . 
    MCU="unknow" 
    F_CPU="16000000UL" 
    ;; 
    "pro5v") BOARD="pro5v" 
    cp -r /usr/lib/avrduino/data/boards_info/pro5v/board-info.h . 
    MCU="unknown" 
    F_CPU="16000000UL" 
    ;; 

    "pro328") BOARD="pro328" 
    cp -r /usr/lib/avrduino/data/boards_info/pro328/board-info.h . 
    MCU="atmega328P" 
    F_CPU="16000000UL" 
    ;; 
    "pro5v328") BOARD= "pro5v328" 
    cp -r /usr/lib/avrduino/data/boards_info/pro5v328/board-info.h . 
    MCU="atmega328P" 
    F_CPU="16000000UL" 
    ;; 
    *) 
    echo "Error : Input is not valid" 
    echo "Exiting..." 
    return 1 
    ;; 
    esac 
    break 
    done 
    [ -e Makefile ] && rm Makefile 
    read -p "Do you want to configure your Makefile settings [Y/n]: " CONFIGURE 
    if { [ "$CONFIGURE" == "Y" ] || [ "$CONFIGURE" == "y" ]; }; then 
    read -p "Enter your MCU: " MCU 
    read -p "Enter F_CPU: " F_CPU 
    fi 
    read -p "Enter ARDUINO_PORT: " ARDUINO_PORT 
    echo "ARDUINO_DIR = /usr/share/arduino">>Makefile 
    echo "BOARD_TAG = $BOARD">>Makefile 
    echo "ARDUINO_PORT = $ARDUINO_PORT">>Makefile 
    echo "NO_CORE = 1">>Makefile 
    echo "AVRDUDE_ARD_PROGRAMMER = arduino">>Makefile 
    echo "HEX_MAXIMUM_SIZE = 30720">>Makefile 
    echo "AVRDUDE_ARD_BAUDRATE = 115200">>Makefile 
    echo "#ISP_LOW_FUSE = 0xFF">>Makefile 
    echo "#ISP_HIGH_FUSE = 0xDA">>Makefile 
    echo "#ISP_EXT_FUSE = 0x05">>Makefile 
    echo "#ISP_LOCK_FUSE_PRE = 0x3F">>Makefile 
    echo "#ISP_LOCK_FUSE_POST = 0x0F">>Makefile 
    echo "MCU = $MCU">>Makefile 
    echo "F_CPU = $F_CPU">>Makefile 
    echo "VARIANT = standard">>Makefile 
    echo "ARDUINO_LIBS =">>Makefile 
    echo "include /usr/share/arduino/Arduino.mk">>Makefile 
    echo "$BOARD|$MCU|" >> .avrduino.txt 

    clear 
    echo -e "${LGREEN}Makefile settings${NC}" 
    echo -e "${LBLUE}ARDUINO_DIR = ${LRED}/usr/share/arduino ${NC}" 
    echo -e "${LBLUE}BOARD_TAG = ${LRED}$BOARD${NC}" 
    echo -e "${LBLUE}ARDUINO_PORT = ${LRED}$ARDUINO_PORT${NC}" 
    echo -e "${LBLUE}NO_CORE = ${LRED}1${NC}" 
    echo -e "${LBLUE}AVRDUDE_ARD_PROGRAMMER = ${LRED}arduino${NC}" 
    echo -e "${LBLUE}HEX_MAXIMUM_SIZE = ${LRED}30720${NC}" 
    echo -e "${LBLUE}AVRDUDE_ARD_BAUDRATE = ${LRED}115200${NC}" 
    echo -e "${DGRAY}#ISP_LOW_FUSE = ${RED}0xFF${NC}" 
    echo -e "${DGRAY}#ISP_HIGH_FUSE = ${RED}0xDA${NC}" 
    echo -e "${DGRAY}#ISP_EXT_FUSE = ${RED}0x05${NC}" 
    echo -e "${DGRAY}#ISP_LOCK_FUSE_PRE = ${RED}0x3F${NC}" 
    echo -e "${DGRAY}#ISP_LOCK_FUSE_POST = ${RED}0x0F${NC}" 
    echo -e "${LBLUE}MCU = ${LRED}$MCU${NC}" 
    echo -e "${LBLUE}F_CPU = ${LRED}$F_CPU${NC}" 
    echo -e "${LBLUE}VARIANT = ${LRED}standard${NC}" 
    echo -e "${LBLUE}ARDUINO_LIBS =${NC}" 

} 

initializeProject() 
{ 
    read -p "Project name: " PROJECT_NAME 
    if [ ! -e PROJECT_NAME ]; then 
    mkdir $PROJECT_NAME 
    cd $PROJECT_NAME 
    makefile #Call function that makes makefile 
    cp -r /usr/lib/avrduino/data/include/ . 
    echo -e "${LGREEN}Project created successfully ${NC}" 
    else 
    echo "AVRduino: Project with name [ $PROJECT_NAME ] already exists. " 
    echo "AVRduino: Stop project wizard and exit." 
    fi 
} 

clear 
initializeProject 
+0

Это опечатка в вашем сообщении или у вас на самом деле есть './usr' в вашем коде? – NathanOliver

+0

Есть ли в первой строке скрипта #! биты? – cup

+0

./usr не опечатано, http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip –

ответ

2

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

В этом контексте ваша строка «shebang», #!/bin/bash, это просто комментарий.
(Вы можете поставить #! doodle poodle noodle там, и это будет работать так же хорошо.)

При использовании system, он выполняет в /bin/sh, и, таким образом, ваш bash скрипт имеет синтаксические ошибки.

Один из способов выполнения скриптов, чтобы сделать их исполняемым:

chmod +x /usr/lib/avrduino/script/initialize.sh 

, а затем вы можете просто передать его непосредственно system:

system("/usr/lib/avrduino/script/initialize.sh"); 

Или вы могли бы Явно выполнить его в bash:

system("/bin/bash /usr/lib/avrduino/script/initialize.sh"); 

ОК, вот способ можно решить «изменение каталога» проблемы:

Rewrite initialize.sh поэтому он принимает имя проекта в качестве аргумента вместо того, чтобы просить за него в интерактивном режиме (это как нормально работать Unix инструменты, поэтому придерживайтесь его).

Затем добавьте следующую строку в ваш .bashrc:

make_project() 
{ 
    /usr/lib/avrduino/script/initialize.sh "$1" && cd "$1" 
} 

Тогда вы можете сказать make_project foo и получить перевезены в каталог «Foo».

+0

Любая идея, как использовать команду CD, чтобы при использовании скрипта эта команда работала в текущем терминале? –

+0

@ACVoltage Вы не можете увидеть мой комментарий к другому ответу. Вам нужно переосмыслить свое решение. – molbdnilo

1

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

#!/bin/bash 
# rest of script 

Если это не сработает, позвоните по телефону

system("/bin/bash /usr/lib/avrduino/script/initialize.sh"); 
+0

Итак, я изменил системный вызов, и он работает, но не так, как я хочу. Просто чтобы увидеть, что, может быть, я этого не понял. Если у меня есть cd $ PROJECT_NAME, это изменит рабочий каталог в моем терминале, из которого я назвал свою программу. Потому что я стремлюсь к этому. –

+0

Примите решение тогда - теперь у вас есть новая проблема. – pakistanprogrammerclub

+0

@ACVoltage 'system' создает новый процесс с собственным рабочим каталогом, а ваша программа на C++ также имеет свои собственные. Изменение любого из них не повлияет на оболочку, из которой вы выполняете свою программу. – molbdnilo