dos2unix用于将DOS/Windows格式(CRLF)文本文件转换为Unix格式(LF),需先安装(如apt install dos2unix或yum install dos2unix),再用dos2unix file或加-k/-n等参数控制时间戳和输出方式。

直接运行 dos2unix 命令就能完成转换,但前提是命令已安装、目标文件确实是 DOS 格式(含 \r\n),且你有写入权限——这三点不满足,就不是“一键”而是报错或静默失败。
确认 dos2unix 是否可用及安装方法
很多 Linux 发行版默认不带 dos2unix,执行时会提示 command not found:
- Debian/Ubuntu:运行
sudo apt install dos2unix - CentOS/RHEL/Fedora:运行
sudo yum install dos2unix或sudo dnf install dos2unix - Alpine:运行
apk add dos2unix - macOS(Homebrew):运行
brew install dos2unix
装完后用 dos2unix -V 验证版本,确认可用。
判断文件是否真需要转换
别盲目跑 dos2unix script.sh。有些文件看着像 Windows 生成的,其实已经是 Unix 格式;强行转换没坏处,但会更新 mtime,可能干扰部署流程或缓存逻辑。
- 用
file script.sh粗略看:输出含CRLF line terminators才是 DOS 格式 - 更准一点:用
od -c script.sh | head -n 2查看开头几行,如果出现\r \n就是 DOS 换行 - 在 vim 中打开,底部显示
[dos]或行尾有^M字符,也是明确信号
常用转换方式与关键参数组合
dos2unix 默认直接修改原文件,不备份、不保留时间戳——这是最常踩的坑。
- 最简转换(覆盖原文件):
dos2unix script.sh - 保留原始文件 + 输出新文件:
dos2unix -n script.sh script_unix.sh - 保留原文件时间戳(重要!尤其用于配置文件或部署脚本):
dos2unix -k script.sh - 批量处理当前目录所有 .sh 文件:
dos2unix *.sh,但注意通配符为空时会报错,建议加shopt -s nullglob或用find . -name "*.sh" -exec dos2unix -k {} \;
-k 和 -n 可同时用:dos2unix -k -n old.sh new.sh,既不改原文件时间,又不覆盖原文件。
为什么有时转换后脚本还是执行失败?
换行符只是问题表象。DOS 格式脚本在 Linux 上执行失败,常见真正原因包括:
- 文件权限没设可执行:
chmod +x script.sh - Shebang 行被破坏(比如开头多了 BOM 或隐藏字符),用
head -n1 script.sh | cat -A检查是否为#!/bin/bash$而非^M#!/bin/bash$ - 编码不是 UTF-8(
dos2unix不处理编码,只动换行符),中文注释乱码需额外用iconv - 脚本里硬编码了 Windows 路径(如
C:\temp),这种dos2unix完全无能为力
换行符问题本身很干净,但实际排查时容易被其他更隐蔽的问题带偏——先确认 ^M 是否消失,再往下查。











