456 字
2 分钟
md5 不带参数时不显示帮助,而是等你输入
今天有人问 md5 命令的默认行为。他以为直接跑 md5 会输出帮助文档,但光标停住什么都不显示——以为命令挂了。
实际上这是正常行为。
md5 在 macOS 上没有 -h
$ md5 -hmd5: invalid option -- husage: md5 [-pqrtx] [-c string] [-s string] [files ...]-h 不是合法选项,macOS 的 md5 帮助只能通过 man md5 查看,或者传一个非法选项触发 usage 输出。
不带参数 = 从 stdin 读取
md5 没有文件参数时,不会退出,而是阻塞等 stdin 输入。这是 Unix 工具的标准模式:接受文件列表,没有文件就读管道/终端。
交互式使用:
$ md5hello world # 输入内容<Ctrl+D> # EOFb59c67bf196a4758191e42f76670ceba或者用管道:
$ printf 'hello world' | md5b59c67bf196a4758191e42f76670ceba空输入、换行、大小写
几个容易踩坑的点:
空字符串有固定哈希值,不是空输出:
$ printf '' | md5d41d8cd98f00b204e9800998ecf8427e这是 MD5 对空字节序列的正确结果,经常用来验证 MD5 实现是否正确。
echo 会自动添加换行,printf 不会,导致同一段文字哈希不同:
$ echo 'abc' | md50bee89b07a248e27c83fc3d5951213c1 # "abc\n"
$ printf 'abc' | md5900150983cd24fb0d6963f7d28e17f72 # "abc"想对字符串本身(不含换行)计算哈希,用 printf 或 echo -n:
printf 'abc' | md5echo -n 'abc' | md5 # 等价默认输出小写 hex。没有文件名时,裸输出 32 个字符,不带 MD5 (file) = 包装:
$ md5 /etc/hostsMD5 (/etc/hosts) = b1946ac92492d2347c6235b4d2611184
$ printf 'abc' | md5900150983cd24fb0d6963f7d28e17f72 # 无文件名前缀Linux 行为略有不同
Linux 上一般用 md5sum,不带参数同样读 stdin,但输出格式是 <hash> -(注意两个空格,后面跟 - 表示 stdin):
$ printf 'abc' | md5sum900150983cd24fb0d6963f7d28e17f72 -macOS md5 和 Linux md5sum 计算结果相同,格式不同,脚本里注意别混用。
运行 md5 后光标停住,按 Ctrl+D 就能继续,不是死锁。
md5 不带参数时不显示帮助,而是等你输入
https://blog.lishuyu.app/posts/md5-stdin-default/