Shell脚本:“syntax error:unexpected end of file”
这种错误只能说是坑,如果没有见到过,很可能就要摔里头。解决问题是重要的,但弄明白问题的来源,往往更为重要。
所以要先扯一下,换行和回车的历史遗留问题。
在计算机出现之前,有个玩意叫电传打字机。每秒钟可以打10个字符,但是在打完一行需要换行时,要用去0.2s。
这正好可以打2个字符,这段时间里如果有字符传过来,那么这些字符将被丢失。
很显然,要解决这个问题,最简单的办法就是浪费这个0.2s。同时,我们在写东西时,要把手换到下一行及每行的首位置,也就是说这是两个动作。
自然而然地,研发人员在每一行后面添加了两个表示结束的字符(回车+换行)。
所谓“回车”:让打字机的打印头重新回到一行的首位置(左边界);所谓“换行”:让打字机把纸向下移一行。
后来,计算机来了,操作系统也来了。于是,坑也来了。不同的操作系统对这个机器的“复位+走纸”的表示是不同的:
OS |
表示 |
C语言/转义字符 |
HEX表示 |
Windows |
回车+换行(CR/LF) |
\r\n |
0x0d0a |
Unix/Linux |
换行(LF) |
\n |
0x0a |
Mac OS |
回车(CR) |
\r |
0x0d |
于是,unix/mac下的文件如果在windows里打开,所有文字会变成一行;而windows的文件在unix/mac下打开,每行的结尾会多出一个 ^M 符号。
我想在linux下执行一个shell脚本,而它恰巧又在windows中打开过,于是我就狠狠地摔在了这个坑里。解决的办法自然很简单,一个dos2unix命令即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?