456 字
2 分钟
md5 不带参数时不显示帮助,而是等你输入

今天有人问 md5 命令的默认行为。他以为直接跑 md5 会输出帮助文档,但光标停住什么都不显示——以为命令挂了。

实际上这是正常行为。

md5 在 macOS 上没有 -h#

Terminal window
$ md5 -h
md5: invalid option -- h
usage: md5 [-pqrtx] [-c string] [-s string] [files ...]

-h 不是合法选项,macOS 的 md5 帮助只能通过 man md5 查看,或者传一个非法选项触发 usage 输出。

不带参数 = 从 stdin 读取#

md5 没有文件参数时,不会退出,而是阻塞等 stdin 输入。这是 Unix 工具的标准模式:接受文件列表,没有文件就读管道/终端。

交互式使用:

Terminal window
$ md5
hello world # 输入内容
<Ctrl+D> # EOF
b59c67bf196a4758191e42f76670ceba

或者用管道:

Terminal window
$ printf 'hello world' | md5
b59c67bf196a4758191e42f76670ceba

空输入、换行、大小写#

几个容易踩坑的点:

空字符串有固定哈希值,不是空输出:

Terminal window
$ printf '' | md5
d41d8cd98f00b204e9800998ecf8427e

这是 MD5 对空字节序列的正确结果,经常用来验证 MD5 实现是否正确。

echo 会自动添加换行,printf 不会,导致同一段文字哈希不同:

Terminal window
$ echo 'abc' | md5
0bee89b07a248e27c83fc3d5951213c1 # "abc\n"
$ printf 'abc' | md5
900150983cd24fb0d6963f7d28e17f72 # "abc"

想对字符串本身(不含换行)计算哈希,用 printfecho -n

Terminal window
printf 'abc' | md5
echo -n 'abc' | md5 # 等价

默认输出小写 hex。没有文件名时,裸输出 32 个字符,不带 MD5 (file) = 包装:

Terminal window
$ md5 /etc/hosts
MD5 (/etc/hosts) = b1946ac92492d2347c6235b4d2611184
$ printf 'abc' | md5
900150983cd24fb0d6963f7d28e17f72 # 无文件名前缀

Linux 行为略有不同#

Linux 上一般用 md5sum,不带参数同样读 stdin,但输出格式是 <hash> -(注意两个空格,后面跟 - 表示 stdin):

Terminal window
$ printf 'abc' | md5sum
900150983cd24fb0d6963f7d28e17f72 -

macOS md5 和 Linux md5sum 计算结果相同,格式不同,脚本里注意别混用。


运行 md5 后光标停住,按 Ctrl+D 就能继续,不是死锁。

md5 不带参数时不显示帮助,而是等你输入
https://blog.lishuyu.app/posts/md5-stdin-default/
作者
猫猫魔女
发布于
2026-06-09
许可协议
CC BY-NC-SA 4.0