这个 shell 命令有什么作用?

What does this shell command do?

我正在用另一种语言重写 GNU 的 wc 实用程序,我 运行 跨过这个 应该 导致 wc 输出 0 的命令字节计数。

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

按照我目前的理解,dd是在一个单独的(子)shell中启动的,然后是wc启动的,然后是/etc/group的内容在 shell?

中重定向

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

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

此命令 (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 的标准输入)并报告要读取的流中剩余的字符数(对于所有但是巨大的组文件将一无所获。

您的 wc 实现是否正在寻找文件句柄的开头?

dd命令与/etc/group一起使用作为输入。使用这些参数,我们有一个 99k 的块文件,99k 的 1 个块由于 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 命令获得不同的结果。

注意,这取决于实施

在我的 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