为何tail -c3命令在管道与文件场景下输出结果不同?
差异原因解析
核心问题出在echo命令的默认行为上:当你执行echo 987654321时,它会自动在输出字符串的末尾追加一个换行符(ASCII码0x0A)。
管道场景的实际情况
通过管道传递给tail -c3的完整内容是987654321\n(总计10字节),tail取最后3字节时,得到的是21\n。其中换行符是不可见的控制字符,输出到终端时只会触发换行动作,所以你看到的可见结果是21。
文件场景的实际情况
你直接写入test_tail.sh的内容是987654321,没有额外的换行符,总计9字节。此时tail -c3取最后3字节就是321,完全符合手册中“显示文件最后NUM字节”的描述。
验证方法
- 用
echo -n 987654321 | tail -c3执行,-n参数会禁止echo添加换行符,此时输出结果就是321,和文件场景一致。 - 用
hexdump -C可以直观查看字节内容:- 执行
echo 987654321 | hexdump -C,能看到末尾多了0x0a的换行符字节; - 执行
hexdump -C test_tail.sh,只会看到9个数字对应的字节。
- 执行
内容的提问来源于stack exchange,提问作者Yongwu Xiu
相关产品推荐
相关产品推荐

