这个shell命令是做什么用的?

4
我正在用一种不同的语言重新编写GNU的wc实用程序,我遇到了这个命令,它应该导致wc输出0字节计数。 (dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group 据我目前的理解,dd在一个单独的子shell中启动,然后启动wc,然后将/etc/group的内容重定向到shell内部? dd命令使用99kB的输入块大小,并跳过其中的一个才读取输入?这就是我被绊倒的地方。
现在我的版本报告了约980个字节的读取,所以我想更好地理解这个命令,以便我的实用程序可以反映出来。

你的 /etc/group 文件大小约为980字节吗? - Etan Reisner
3个回答

4
这个命令 (dd ibs=99k skip=1 count=0; ./wc -c) < /etc/group 会生成一个子 shell(用于执行 (list)),并将 /etc/group 附加到该子 shell 的标准输入。
在该子 shell 中,使用输入块大小为 99k,跳过计数为 1,并且要复制的块数为 0 来运行 dd 命令(并继承了子 shell 的标准输入)。这将导致 dd 在其标准输入流中寻找 99k 并停止。完成后,wc 将被运行(并继承了子 shell 的标准输入),并报告剩余待读取的流中的字符数(对于除了非常大的组文件之外,将是零)。
你的 wc 实现是否会回到文件句柄的开头?

我的wc实现有问题。谢谢 :) 一旦允许,我会接受答案。 - Eric Lagergren
哦,奇怪的@jm666。(dd ibs = 99k skip = 1 count = 0; wc -c)< /etc/group对我来说显示wc计算为0字节。 - Eric Lagergren
@jm666 即使使用跳过选项,您也是这样吗?因为我在这里看到的不是这样。您使用的是什么 dd?(我不确定 dd 在那里应该做什么,但我想象它应该寻找并停止,这就是我看到的。) - Etan Reisner
很奇怪。我正在使用OS X。系统默认的wc返回2317,而gwc(GNU wc)返回0。真的很奇怪。 - clt60
@jm666 这里是 OS X 的 wc 实用程序:https://svnweb.freebsd.org/base/head/usr.bin/wc/wc.c?view=co - Eric Lagergren

1
dd命令以/etc/group作为输入参数。使用这些参数,我们有一个99k的块文件,由于ibs argument跳过了99k的1个块,然后复制了0个99k的块。然后,您将使用自定义命令./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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接