魔术字节(或从管道中删除最新的换行符)

magic bytes (or removing latest newlines from being piped)

当我处理多部分消息时,我遇到了一些评估多部分消息正文内容长度的奇怪行为。

长话短说。它可以分解为管道换行。

$ a="x"; b="y"
$ echo -e "${a}" | wc -c
2 # strange, shouldn't it be just a single byte?
$ echo -e "${b}" | wc -c
2 # at this point one could guess the sum is **4**, but its not
$ echo -e "${a}${b}" | wc -c
3
$ echo -e "${a}${b}" | hexdump -C 
00000000  78 79 0a  |xy.|
00000003

是否有可能避免 magic/invisible 字节被管道传输 或者 - 如果不可能 - 至少移除?

提前致谢。

您指的魔法字符是换行符\n。换行符只是告诉终端模拟器你是 运行——你猜对了——打印一个换行符!

echo 默认情况下会在字符串的末尾附加一个换行符,因此您的字符串不会与提示符在同一行结束。

echo 可以传递 -n,这样可以防止它在字符串末尾附加换行符。您还可以使用默认情况下不附加换行符的 printf 命令。

我建议 printf 而不是 echo,因为现在 echo 存在许多可移植性问题。

所以,最后,示例命令可能如下所示:

printf "${a}" | wc -c

echo:

echo -en "${a}" | wc -c