在命令行或脚本中出现 $‘\r’: command not found 这样的错误通常是由于文件格式或字符编码问题导致的。具体来说,这个错误最常见的原因是文件中含有 Windows 风格的换行符(CR LF),而不是 Unix/Linux 风格的换行符(LF)。
原因分析
Windows 换行符:在 Windows 系统中,文本文件的行尾通常是由回车(Carriage Return,CR,\r)和换行(Line Feed,LF,\n)两个字符组成的,即 CR LF(\r\n)。
Unix/Linux 换行符:而在 Unix 或 Linux 系统中,行尾只由一个换行符 LF(\n)表示。
当在 Unix/Linux 系统中运行一个含有 Windows 风格换行符(CR LF)的脚本时,shell 会尝试将 CR(\r)也作为命令的一部分来执行,从而导致 $‘\r’: command not found 这样的错误。
解决方案
转换文件格式:
使用 dos2unix 工具将 Windows 格式的文件转换为 Unix 格式。这个工具会删除文件中的 CR(\r)字符。
在 Linux 系统中,你可以使用命令 dos2unix filename 来转换文件。
如果你没有安装 dos2unix,可以使用包管理器如 apt(Debian/Ubuntu)或 yum(CentOS/RHEL)来安装它。
使用文本编辑器修改:
在一些高级文本编辑器(如 Notepad++、Sublime Text、VSCode 等)中,你可以直接查看并修改文件的换行符格式。
将文件的换行符从 CR LF(\r\n)改为 LF(\n)。
使用 sed 命令:
如果你熟悉命令行,也可以使用 sed 命令来删除文件中的 CR 字符:sed -i ‘s/\r$//’ filename。
重新保存文件:
在某些情况下,简单地在 Unix/Linux 系统中重新保存文件(使用适当的文本编辑器)也可以解决问题,因为这会自动使用正确的换行符。
应用上述任何一种方法后,你的脚本应该能够在 Unix/Linux 系统中正常运行,不再出现 $‘\r’: command not found 错误。