Bash脚本来编译程序并运行它可以在终端中运行,但不能作为bash脚本

时间:2018-10-14 05:49:00

标签: bash gcc g++

我有一系列简单的命令,需要以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文件时,它会打印出一系列错误(注意:正在root终端中通过键入./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的用户,无论您是否在终端中键入批处理脚本或在.bat文件中运行批处理脚本,批处理脚本始终总是100%地运行),但我不明白为什么在.sh文件中无法输入终端的内容。我的外壳确实是bash

2 个答案:

答案 0 :(得分:2)

'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’?

但是,由于\r出现时,GCC实际上将显示光标移回了行的开头,因此消息的后一半覆盖了前一半。 /usr/bin/ld: cannot find -lglfw可能实际上是/usr/bin/ld: cannot find -lglfw\r,其中末尾的回车符是不可见的。

如果您在使用Windows样式的行尾的文本编辑器中编写了此脚本文件,则会发生这种情况。为了使其在bash中运行,您必须将行尾转换为Unix样式,这意味着删除所有回车符。如何执行此操作取决于您可用的工具。

答案 1 :(得分:-1)

我找到了答案!!! 我正在使用Microsoft DOS行结尾