这个shell命令有什么作用?

时间:2015-02-24 18:29:56

标签: shell gnu

我正在用另一种语言重写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字节读取,所以我想更好地理解这个命令,所以我的实用程序可以反映出来。

3 个答案:

答案 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