我在Mac上写了一个示例脚本
#!/bin/bash test() { echo "Example" } test exit 0
这通过显示示例工作正常
当我在RedHat机器上运行这个脚本时,它说
意外令牌附近的语法错误'
我检查过bash是否可用
cat /etc/shells which bash shows /bin/bash
有人遇到过同样的问题吗?
提前致谢 !
它可能是文件编码问题.
在处理不同操作系统和编辑器之间的文件时遇到了文件类型编码问题 - 在我的情况下尤其是在Linux和Windows系统之间.
我建议检查文件的编码,以确保它适合目标linux环境.我想如果你使用的MAC比使用Windows文本编辑器的话,编码问题不太可能,但我认为文件编码仍然值得考虑.
---编辑(添加@Potatoswatter推荐的实际解决方案)
为了演示文件类型编码如何成为这个问题,我将您的示例脚本复制/粘贴到Windows中的记事本中(我无法访问Mac),然后将它复制到linux机器并运行它:
jdt@cookielin01:~/windows> sh ./originalfile ./originalfile: line 2: syntax error near unexpected token `$'{\r'' '/originalfile: line 2: `test() {
在这种情况下,记事本使用回车符和换行符保存文件,导致上面显示的错误.该\r
表示回车(Linux系统终止换行符行\n
只).
在linux机器上,您可以通过运行以下命令来测试此理论,以从文件中删除回车符(如果它们存在):
cat originalfile | tr -d "\r" > newfile
然后尝试运行新文件sh ./newfile
.如果这样做,问题是回车是隐藏的字符.
注意:这不是您的环境的精确复制(我无法访问Mac),但是我觉得问题是编辑器在某处保存了回车到文件中.
--- /编辑
稍微说一下,操作系统和编辑器可以具有不同的文件编码默认值.通常,应用程序和编辑器会影响所使用的文件类型编码,例如,我认为Microsoft Notepad和Notepad ++默认使用Windows-1252.可能还存在新行差异(在Windows环境中,回车符和换行符通常用于终止文件中的行,而在Linux和OSX中,通常只使用换行符).
引用文件编码的类似问题和答案在这里:在bash脚本执行中出现的坏字符