Bash: не могу запустить программу, созданную с помощью make на Linux - PullRequest
0 голосов
/ 30 мая 2019

Я хочу собрать свою программу, используя make, а затем запустить созданный исполняемый файл с помощью скрипта bash, но bash не может найти исполняемый файл, хотя он был создан, и я могу запустить его вручную. Проблема существует только на Linux Mint 19 в Gnome-терминал. Изменить: Точное сообщение об ошибке: "/ путь / к / мой / исполняемый файл: нет такого файла или каталога"

У меня есть кроссплатформенный проект, в котором мне нужно запустить cmake, затем собрать проект и, наконец, запустить созданный исполняемый файл. У меня есть скрипт bash для автоматизации процесса: Изменить: это только часть, которая вызывает проблемы;)

for TASK in $@; do
    if [[ $TASK == "make" ]]; then
        call cmake here, this creates a .sln or a make file
    elif [[ $TASK == "build" ]]; then
        if  [[ $OS == 'CYGWIN_NT-10.0' ]]; then
            MSBuild.exe "./build/debug/myproject.sln"
        elif [[ $OS == 'Linux' ]]; then
            cd ./build/debug/ && make
        else
            error...
        fi
    elif [[ $TASK == "run" ]]; then
        if  [[ $OS == 'CYGWIN_NT-10.0' ]]; then
            ./build/debug/Debug/program.exe
        elif [[ $OS == 'Linux' ]]; then
            ./build/debug/program
        else
            error...
        fi
    else
        error...
    fi
done

Вызов "./script.sh make build run" должен, например, вызвать cmake для создания файлов сборки, затем вызвать программу сборки (make для Linux или msbuild для Windows) и затем запустить созданный исполняемый файл. Это прекрасно работает на Windows 10 в терминале Cygwin. В Linux вызов "./script.sh build run" не выполняется, потому что он не может найти исполняемый файл. Однако "./script.sh build && ./build/debug/program" работает хорошо. Удивительно, что «./script.sh build && ./script.sh run» также работает как положено. Это почему? Есть ли ошибка в скрипте bash? И почему он работает на Cygwin, а не на Linux Mint?

1 Ответ

0 голосов
/ 31 мая 2019

Хорошо, я решил это.Задавать вопросы, кажется, первый шаг к поиску решения.Кажется, проблема в том, что вызов "./script.sh build run" сначала оценивает команду сборки "cd ./build/debug/ && make".Я полагаю, что такие команды породили бы новую вложенную оболочку, где команды cd и make затем оцениваются, а затем оболочка продолжается в исходном рабочем каталоге.По-видимому, этого не происходит, и рабочий каталог исполняемого сценария изменяется на «./build/debug».Следующая команда «run» пытается выполнить «./build/debug/program», но, поскольку текущий рабочий каталог изменяется, она, по сути, ищет «./build/debug/build/debug/program», который не существует.Я добавил строку

cd ../../

в код для команды build.Теперь это выглядит так:

...
elif [[ $OS == 'Linux' ]]; then
    cd ./build/debug/ && make
    cd ../../
else
...

Я не знаю точно, почему, но на Linux это работает так.

...