记一次CRLF line terminators导致shell脚本报错“ not found.4.7…”详解程序员

忙了一上午,遇到了“’ not found.4.7: host/network…”报错信息,一直在查语法的问题,确忽略了最根本的编码格式问题,记录一下;

 

拿到文件的第一时间,切记要做文件编码格式查看,可以避免很多问题  

 

1.命令格式:

file [ -bchikLnNprsvz ] [ -f namefile ] [ -F separator ] [ -m magicfiles ] file …

2.命令功能:

用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份

3.命令参数:

-b        列出文件辨识结果时,不显示文件名称。

-c        详细显示指令执行过程,便于排错或分析程序执行的情形

-f        列出文件中文件名的文件类型

-F        使用指定分隔符号替换输出文件名后的默认的”:”分隔符。

-i        输出mime类型的字符串

-L        查看对应软链接对应文件的文件类型

-z        尝试去解读压缩文件的内容

–help    显示命令在线帮助

-version    显示命令版本信息

 

Linux和Windows文本文件的行结束标志不同。在Linux中,文本文件用”/n”表示回车换行,而Windows用”/r/n”表示回车换行。有时候在Windows编写shell脚本时需要注意这个,否则shell脚本会报”No such file or directory”或”command not found line x”之类的错误,如果不知晓前因后果,肯定会被这个折腾得相当郁闷。如下所示test.sh

记一次CRLF line terminators导致shell脚本报错“ not found.4.7...”详解程序员

执行test.sh脚本过程中报” No such file or directory /home/oracle/.bash_profile” 和”command not found line xx”. 如果你从shell脚本语法方面去检查,根本没有任何问题。不知具体原因的肯定相当郁闷。

记一次CRLF line terminators导致shell脚本报错“ not found.4.7...”详解程序员

如果你用file命令查看test.sh,你会发现文件编码为ASCII,with CRLF line terminators。我们用cat -v test.sh 可以看到^M (/r的十六进制为0D,对应的控制符为^M)。 cat -v可以看到文件中的非打印字符。

记一次CRLF line terminators导致shell脚本报错“ not found.4.7...”详解程序员

IT虾米网

vi命令查看test.sh文件看不到^M, 其实这个跟vi的版本有关系。有些版本vi显示的是行尾为^M(AIX下都是显示^M)。而有些vi打开时可以看到底下有[dos]的格式提示。

IT虾米网

我们可以用file命令对比正常的shell脚本的格式和编码。如下所示

记一次CRLF line terminators导致shell脚本报错“ not found.4.7...”详解程序员

解决这个问题其实也不难,有很多方式,例如直接使用vi编辑器编写shell脚本;使用cat命令创建shell脚本,然后从Windows文本工具里面拷贝脚本过来;最方便的还是使用dos2unix将DOS格式文本文件转换成Unix格式或Linux格式。

IT虾米网

 

资料来源:IT虾米网

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/1820.html

(0)
上一篇 2021年7月15日 23:28
下一篇 2021年7月15日 23:28

相关推荐

发表回复

登录后才能评论