用于编译程序并运行它的Bash脚本在终端中工作,但不能作为bash脚本

问题描述 投票:-1回答:2

我有一系列需要以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

bash gcc g++
2个回答
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
投票

我发现了答案!我使用的是Microsoft DOS行结尾

© www.soinside.com 2019 - 2024. All rights reserved.