解决Win平台上linux虚拟机脚本格式问题
问题描述
经常会有以下使用场景:
在windows平台上编写脚本,复制脚本到docker容器linux中运行,或者复制到linux虚拟机中运行.
尝尝会报错: $'\r' command not found
这样的错误
原因在于:
Carriage-Return 回车符\r
Line-Feed 换行符\n
windows平台使用的格式是CRLF
结尾是 \r\n
; 而 linux 和macOS平台使用的是LF
结尾是\n
;而MAC平台使用的是CR
结尾是\r
老的Mac系统(Mac OS, OS X):
\r
新的Mac系统(macOS):
\n
在2001年以前的Mac操作系统,称为Classic Mac OS,行末采用”\r”,这一系列操作系统的最后一个版本是1999年发布的Mac OS 9;
从2001年3月发布的Mac OS 10.0开始,行末采用”\n”,称为macOS或OS X
查看脚本格式
1.cat -A filename
,如果输出结果中行末尾是^M$,则是dos格式,如果行末尾只是$,则是unix格式。
2.vim filename
,编辑文件,执行“:set ff”,若执行结果为fileformat=dos则为dos格式,若执行结果为fileformat=unix则为unix格式。
3.od -t x1 filename
,以16进制查看文件,若输出结果中存在“0d 0a”则为dos格式,如果只有“0a”则为unix格式。其中“0d”即为回车符“\r”,“0a”即为换行符“\n”。
解决方法
当然是想办法把windows平台下的脚本转换成 LF
呀
- 如果有
vim\vi
vim内执行 Shift + ;
:set ff = unix
:wq
-
使用
dos2unix
工具如果用的是
git bash
那么该客户端已经自带了dos2unix
如果不是的话前提需要先安装
dos2unix
http://dos2unix.sourceforge.net/
例如: 我使用的是
CygWin64 Mintty
控制台那么我只需要执行即可
$ apt-cyg install dos2unix
dos2unix 使用方法
# 使用方法 $ dos2unix filename # 或者使用以下命令,强制转换 $ find . -type f -exec dos2unix {} + # -f --force Force conversion of all files. Also binary files.
-
使用
sed
命令$ sed -e ‘s/.$//’ dosfile > unixfile
通常情况下是完全可以实现的, 但这个方法不是100%的解决方法
git
跨平台协作开发, 经场会出现在win平台下,使用git clone
命令将项目源码下载下来后,拿到linux虚拟机中运行,出现换行符错误的问题, 原因在于win平台使用git的时候, git自动将换行符替换为\r\n
, 这时候再拿到linux中运行当然就不行了.
还好 Git 在设计时就考虑了这一点,其提供了一个 autocrlf
的配置项,用于在提交和检出时自动转换换行符,该配置有三个可选项:
- true: 提交时转换为 LF,检出时转换为 CRLF
- false: 提交检出均不转换
- input: 提交时转换为LF,检出时不转换
# 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true
# 提交时转换为LF,检出时不转换
git config --global core.autocrlf input
# 提交检出均不转换
git config --global core.autocrlf false
查看当前git config 配置
$ git config --list
http.proxy=socks5://127.0.0.1:7890
https.proxy=socks5://127.0.0.1:7890
user.name=XXXX
user.email=XXXX
core.autocrlf=true
如果把 autocrlf
设置为 false
时,那另一个配置项 safecrlf
最好设置为 ture
。该选项用于检查文件是否包含混合换行符,其有三个可选项
- true: 拒绝提交包含混合换行符的文件
- false: 允许提交包含混合换行符的文件
- warn: 提交包含混合换行符的文件时给出警告
# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
# 允许提交包含混合换行符的文件
git config --global core.safecrlf false
# 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn
像比如我, 再win上开发,使用git提交到github, 经常从github上下载项目,再win上修改后,拿到linux虚拟机/docker中运行,
那我的做法就是: 代码仓库使用统一的换行符(LF)
$ git config --global core.autocrlf input
$ git config --global core.safecrlf true
当遇到CRLF无法提交的时候, 用doc2unix
转换一下即可