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_fstatuscompute_number_widthGNU coreutils 源代码。


以上是bash管道vs此处字符串的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>