- 起源
- 前段时间跟网友联线语音遇见的shell脚本问题
- 我就是跟他说这个脚本,你自己直接复制人家的代码
- 用记事本保存,然后改后缀名是无法运行的
- 我还没有开始解释,他复制保存运行报错一气呵成
- 复现
- 这里我创建了一个cs.sh的脚本来复现
- 内容
- 1.png
- 报错内容
- 2.png
- bash: ./cs.sh:/bin/bash^M:解释器错误: 没有那个文件或目录
- 报错解决
- 于是我这个老哥想到了一个好方法,既然解释器错误
- 那就直接把解释器那一行删除了🙄
- 测试运行
- 3.png
- 4.png
- 正常运行
- 我说如果有空格你怎么解决
- 5.png
- 6.png
- $'\r':未找到命令
- 当然还会出现其他的一些问题
- 语法错误: 未预期的文件结尾
- 这个根本治标不治本
- 所以拿记事本直接保存代码运行可不行
- 问题详情
- 操作系统的差异
- Dos和Windows平台:使用回车CR和换行LF两个字符来结束一行,回车+换行CR+LF,即\r\n
- Mac和Linux平台:只使用换行LF一个字符来结束一行,即\n
- 其实最早Mac每行结尾是回车CR即\r,后mac也使用了unix
- 7.png
- 8.png
- 记事本默认就是CRLF,并且无法修改
- 9.png
- 解决方法
- 现在好多文本工具都提供了转换功能
- 比如像VS底部也显示行尾,并且可以进行修改
- 10.png
- 在设置中搜索
files.eol
- 11.png
- 12.png
- vim编辑器
: set ff=unix
- 使用unix换行符
- 就是转换为unix风格再执行
- 如果脚本已经写好了再重新保存,但是这样子太麻烦了
- 那可以直接删除\r,毕竟相对于unix就是多了这玩意
sed -i 's/\r//' cs.sh
- 测试运行
- 13.png
- 发现一样可以正常运行😏
【由于CRLF换行符导致脚本执行异常】
开始
完结
随机文章
我还没有做出来文章评论,评论请前往留言信箱