2015-02-24 129 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