我有一系列需要以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用户,无论你是否将它输入终端或在.bat文件中运行,批处理脚本总是100%运行)但是我不明白为什么我输入终端的东西不能从.sh文件中运行。我的壳确实是bash
!
'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样式,这意味着删除所有回车符。如何执行此操作取决于您可用的工具。
我发现了答案!我使用的是Microsoft DOS行结尾