bash管道vs此处字符串
我认为这些命令在 bash 中是等效的,但它们产生不同的输出。你能帮我理解为什么吗?
$ echo "SEBA" | wc
1 1 5
$ wc <<< "SEBA"
1 1 5
继续运行
- Ubuntu 20.04.2 LTS
- GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu)
- wc (GNU coreutils) 8.30
这里有一些测试:
$ echo "SEBA" | wc | hexdump
0000000 2020 2020 2020 2031 2020 2020 2020 2031
0000010 2020 2020 2020 0a35
0000018
$ wc <<< "SEBA" | hexdump
0000000 2031 2031 0a35
0000006
$ echo "SEBA" | hexdump
0000000 4553 4142 000a
0000005
$ hexdump <<< "SEBA"
0000000 4553 4142 000a
0000005
回答
当 GNUwc从文件中获取所有输入时,它使用stat()(或fstat()for stdin)来获取所有文件的大小(以字符为单位)。由此它可以确定每个输出字段所需的最大位数,并且只使用那么多位数。
当任何输入是管道时,不可能提前确定其大小。该输入默认为 7 位数字。
Here-strings 是通过将字符串复制到临时文件并将 stdin 重定向到该文件来实现的,因此这种情况下可以使用优化的字段大小。但是管道echo不允许这样做,所以它得到了 7 位数字的字段。
请参阅函数get_input_fstatus和compute_number_widthGNU coreutils 源代码。