2015-02-24 99 views
4

我正在用另一种语言重新编写GNU的wc实用程序,并且我跑过了这个命令,其中应该导致wc输出0个字节计数。这个shell命令做了什么?

(dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group

由于我目前了解,dd在一个单独的(子)shell启动,然后wc开始,再/etc/group内容重定向的外壳里面?

dd命令使用的输入块大小为99kB,并在读取输入之前跳过其中的一个?那是我被绊倒的地方。

现在我的版本报告〜980字节读取,所以我想更好地理解这个命令,所以我的实用程序可以反映这一点。

+2

当心:巫术。 – bishop 2015-02-24 18:38:14

+0

你的'/ etc/group'文件大〜980字节吗? – 2015-02-24 18:38:40

+0

@EtanReisner是的。 – 2015-02-24 18:43:09

回答

4

此命令(dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group产生一个子shell(用于(list))和附加的/etc/group到那个子shell标准输入。

内该子外壳的dd命令运行(并且继承子壳的标准输入),用99k的输入块尺寸的1和块的跳过计数复制为0计数这将导致dd寻求99k放入其标准输入流并停止。当完成时wc然后运行(并继承子shell的标准输入)并报告要读取的流中留下的字符数(对于除巨大的之外的所有组,文件将为空)。

您的wc实施是否追求文件句柄的开始?

+0

我的wc实现不是。谢谢:)一旦我被允许,我会接受答案。 – 2015-02-24 18:42:31

+0

哦,很奇怪@ jm666。 (dd ibs = 99k skip = 1 count = 0; wc -c) 2015-02-24 18:45:36

+0

@ jm666即使跳过?因为这不是我在这里看到的。你用什么'dd'? (我根本不确定'dd'应该在那里做什么,但我会想象它应该寻找并停止这是我看到的。) – 2015-02-24 18:45:44

1

dd命令与/etc/group一起用作输入。有了这些参数,我们有一个99k的块文件,99k的一个块由于ibs argument而被跳过,然后复制99k的0个块。然后,您将使用您的自定义命令./wc -c,并将此命令的结果作为输入。 dd最终实现的是忽略99k的一个块,然后将其余数据馈送到您的自定义命令中。

例如

$ wc -c /etc/group 
1011 /etc/group 
$ (dd ibs=500 skip=1 count=0; wc -c) < /etc/group 
511 

当然,您会发现通过自定义wc命令会得到不同的结果。

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