Скрипт Bash для компиляции и запуска программы работает в терминале, но не как скрипт Bash - PullRequest
0 голосов
/ 14 октября 2018

У меня есть простая серия команд, которые должны выполняться от имени пользователя root:

#/bin/bash
g++ -O3 -ffast-math -msse4 -c *.c *.cpp  -lGL -lglfw -m64 -Wno-undef -fPIC
rm main.o
g++ -O3 -ffast-math -msse4 -shared -o GeklminRender.so *.o -m64 -Wno-undef -lGL -lglfw
#In your root window:
cp /home/gek/Programming/GeklminRender-master/THEVERSION/GeklminRender.so /usr/lib/GeklminRender.so
g++ -O3 -ffast-math -msse4 -lGL -lglfw -m64 -Wno-undef -Wall -L. -l:GeklminRender.so -o prog2.bin main.cpp
#./prog2.bin

Когда я запускаю эти команды индивидуально, копируя их в LXTerminal, он работает совершенно нормально.

Когда я запускаю файл SH, он выводит эту серию ошибок (Примечание: он выполняется в корневом терминале, набрав ./Compiler_Call.sh)

’; did you mean ‘-fPIC’?
rm: cannot remove 'main.o'$'\r': No such file or directory
/usr/bin/ld: cannot find -lglfw
collect2: error: ld returned 1 exit status
cp: cannot stat '/home/gek/Programming/GeklminRender-master/THEVERSION/GeklminRender.so': No such file or directory
: No such file or directory

Теперь, может быть, я просточто-то упустил (я пожизненный пользователь Windows, где пакетные сценарии запускаются всегда 100% времени, независимо от того, набрали ли вы его в терминал или запускали его в файле .bat), но я не понимаю, почемувведите в терминал не работают из файла .sh.Моя оболочка действительно bash!

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Тот факт, что 'main.o'$'\r' появляется в вашем выводе, очень показателен.Это говорит о том, что в вашем скрипте есть дополнительный символ возврата каретки в конце строки rm main.o.Этот символ невидим для вас, но не для bash, поэтому, даже если вам кажется, что вы написали команду для удаления файла main.o, bash видит команду для удаления файла main.o\r (где стоит \r)для невидимого символа возврата каретки), и, конечно, нет файла с таким именем.

Если в конце ваших других строк есть возврат каретки, это, вероятно, также объяснит другие сообщения об ошибках, которые вывидя.Например, ’; did you mean ‘-fPIC’?, вероятно, исходит от GCC, пытающегося отобразить сообщение, похожее на это

invalid option ‘-fPIC\r’; did you mean ‘-fPIC’?

, но, поскольку GCC фактически перемещает курсор назад к началу строки, когда появляется \r,вторая половина сообщения перезаписывает первую половину.И /usr/bin/ld: cannot find -lglfw, вероятно, на самом деле /usr/bin/ld: cannot find -lglfw\r, где возврат каретки в конце невидим.

Это произошло бы, если вы написали этот файл сценария в текстовом редакторе, который использует окончания строк в стиле Windows.Чтобы запустить его в bash, вам нужно преобразовать окончания строк в Unix-стиле, что означает удаление всех символов возврата каретки.Как вы это сделаете, зависит от того, какие инструменты у вас есть.

0 голосов
/ 14 октября 2018

Я НАШЕЛ ОТВЕТ !!!Я использовал окончание строки Microsoft DOS

...