dos2unix 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。脚本在 Linux 上莫名报 "command not found" 或 "^M" 错误?多半是换行符惹的祸。
dos2unix 把 Windows 风格的换行 CRLF(\r\n)转成 Unix 的 LF(\n)。反之 unix2dos 把 LF 转回 CRLF。跨平台传文本文件几乎必遇。
一、基本用法
bash
dos2unix script.sh # 就地把 CRLF 改成 LF
dos2unix -n win.txt unix.txt # -n 保留原文件,输出到新文件
unix2dos file.txt # 反向:LF → CRLF默认就地修改原文件;用
-n输出到另一个文件更安全。unix2dos是反向操作(Linux 文件拿到 Windows 编辑器用)。
二、为什么必须转换
bash
# Windows: 每行结尾 \r\n(CRLF)
# Unix: 每行结尾 \n(LF)
# 未转换的脚本在 Linux 跑:
# $'\r' 被当成命令一部分 → bash: $'\r': command not found
# 或 shebang 变成 #!/bin/bash\r → 找不到解释器经典症状:脚本在 Windows 编辑过、传到 Linux 执行,报
command not found、^M乱入、或 shebang 失效。根因就是多余的\r。dos2unix一键清除。
三、怎么发现 CRLF
bash
file script.sh # 输出含 "with CRLF line terminators" 即有问题
cat -A script.sh # 行尾显示 ^M$ 即 CRLF($ 是 LF,^M 是 \r)file 会直接告诉你有没有 CRLF;
cat -A里^M$就是证据($=LF,^M=CR)。排查脚本诡异报错先看这两招。
四、没有 dos2unix 时:tr 替代
bash
tr -d '\r' < win.txt > unix.txt # 删掉 \r,等价 dos2unix(见 [tr](/linux/cmd/tr.md))
sed -i 's/\r$//' script.sh # sed 删行尾 \r(见 [sed](/linux/cmd/sed.md))没装 dos2unix 也能用
tr -d '\r'或 sed 去回车,效果一样。但 dos2unix 还能处理 BOM、更稳妥,推荐优先用。
一句话总结
dos2unix = CRLF→LF 换行符转换:Windows 编辑过的脚本传到 Linux 报 ^M/command not found 就是它干的(多余 \r);dos2unix -n 安全输出到新文件,unix2dos 反向;发现用 file(含 CRLF 提示)或 cat -A(^M$);无此命令可用 tr -d '\r'(见tr)或 sed 替代。