魔术字节(或从管道中删除最新的换行符)
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
当我处理多部分消息时,我遇到了一些评估多部分消息正文内容长度的奇怪行为。
长话短说。它可以分解为管道换行。
$ 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