抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

解决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

  1. 如果有vim\vi

​ vim内执行 Shift + ;

:set ff = unix
:wq
  1. 使用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.
  2. 使用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 转换一下即可

评论吧



本站总访问量为 访客数为

鲁 ICP 备 20018157 号-1
Copyright 2021 - 2022 sizaif. All Rights Reserved