我正在用另一种语言重写GNU的wc
实用程序,我遇到了这个命令应该导致wc输出0字节计数。
(dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group
正如我目前所理解的那样,dd
在一个单独的(子)shell中启动,然后启动wc
,然后/etc/group
的内容被重定向到shell中? / p>
dd
命令使用99kB的输入块大小并在读取输入之前跳过其中一个?那就是我被绊倒的地方。
现在我的版本报告〜980字节读取,所以我想更好地理解这个命令,所以我的实用程序可以反映出来。
答案 0 :(得分:4)
此命令(dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group
生成一个子shell(对于(list)
)并附加/etc/group
到该子shell标准输入。
在该子shell中运行dd
命令(并继承子shell的标准输入),输入块大小为99k
,跳过计数为1,并阻塞到复制计数为0.这将导致dd
在其标准输入流中寻找99k
并停止。完成后再运行wc
(并继承子shell的标准输入)并报告要读取的流中剩余的字符数(除了巨大< / strong>分组文件没什么。)
您的wc
实现是否正在寻找文件句柄的开头?
答案 1 :(得分:1)
dd
命令与/etc/group
一起用作输入。使用这些参数,我们有一个99k
的块文件,由于99k
而跳过1个ibs argument
块,然后复制0个99k
块。然后,您将使用自定义命令./wc -c
并将此命令的结果作为输入。 dd最终实现的是忽略99k
块,然后将剩余数据提供给自定义命令。
e.g。
$ wc -c /etc/group
1011 /etc/group
$ (dd ibs=500 skip=1 count=0; wc -c) < /etc/group
511
当然,您希望通过自定义wc
命令获得不同的结果。
答案 2 :(得分:0)
请注意,这取决于实施
在我的OS X上使用@nalipar的例子。
$ wc -c /etc/group
2317 /etc/group
$ gwc -c /etc/group #the GNU version of the wc
2317 /etc/group
系统默认wc
(dd ibs=500 skip=1 count=0; wc -c) < /etc/group
打印
0+0 records in
0+0 records out
0 bytes transferred in 0.000012 secs (0 bytes/sec)
2317
使用GNU wc
(dd ibs=500 skip=1 count=0; gwc -c) < /etc/group
0+0 records in
0+0 records out
0 bytes transferred in 0.000013 secs (0 bytes/sec)
1817