2011-05-31 19 views
5

我不是以英語爲母語,所以請原諒這個問題的尷尬稱號。我只是不知道如何更好地表達它。Shell重定向VS明確的文件處理代碼

我對FreeBSD的盒子,我有一點點的過濾器工具寫在C其中通過stdin讀取數據的列表,並通過輸出一個stdout處理列表。我像這樣調用它:find . -type f | myfilter > /tmp/processed.txt

現在我想給我的過濾器一點點更多的曝光和發佈。公約說,工具應該允許這樣的事情:find . -type f | myfilter -f - -o /tmp/processed.text

這將迫使我編寫代碼,因爲shell可以完成這項工作,所以不需要這些代碼,因此我傾向於忽略它。

我的問題是:我錯過了一些參數(其它約定,但)爲什麼文件的閱讀和寫作應該在我的代碼做一個不委託給shell重定向?

+0

如果存在這樣的約定,像'grep'這樣的工具就不會遵循它。 – 2011-05-31 07:32:09

+0

如果人們期待這樣的工具(不管它有多不合邏輯),那麼遵循它們是有道理的。別忘了* nix工具在許多環境中使用。也許有些事情會更方便地使用stdio的參數insead。 – vbence 2011-05-31 07:37:24

+0

是的,grep確實使用了-f,但是您可以執行grep模式FILENAMES,所以接受文件名參數並且不僅僅從STDIN讀取行。另外,grep有-r -D -d參數 - 處理參數列表中的''目錄'問題等等。例如@ikegami告訴我,每次都很樂意處理情況。 – jm666 2011-05-31 07:43:46

回答

2

這絕對沒有錯。你的過濾器將有一個類似於c++filt的界面。

,如果你想自動選擇基於輸入文件名的輸出文件,您可以考慮文件處理,或者如果你想特殊處理在單個命令處理多個文件。

如果你不想做任何任一則沒有什麼錯是一個簡單的過濾器。如果他們願意,任何人都可以提供一組簡單的外殼封裝來提供cmd infile outfile語法。

0

很高興有作爲選項運行任何命令與文件名參數。正如你的例子:

myfilter [-f ./infile] [-o ./outfile] #or 
myfilter [-o outfile] [filename] #and (the best one) 
myfilter [-f file] [-o file] #so, when the input and output are the same file - the filter should working correctly anyway 

對於很好的例子檢查sort命令。通常在管道中用作過濾器,但可以做[-o output]並且也可以正確處理same input/output problem ...

爲什麼它很好?例如,當想通過「fork/exec」從「C」運行命令並且不希望啓動shell來處理I/O時。在這種情況下,帶參數的execve(.....)變得更容易(也更快),因爲它使用shell包裝啓動cmd。

1

這是一個不必要的限制界面。在命令行中接受參數更靈活,

grep foo file | myfilter > /tmp/processed.text 

,並沒有被使用

find . -type f -exec myfilter {} + > /tmp/processed.text 
1

其實有作爲外殼的重定向同樣的效果,你可以做到這一點排除find

freopen("filename" , "wb" , stdout); 

所以如果你使用了整個代碼的printf,輸出將被重定向到文件中。因此,您不需要修改以前編寫的任何代碼,並輕鬆適應該約定。