Перенаправление оболочки против явного кода обработки файлов - PullRequest
5 голосов
/ 31 мая 2011

Я не являюсь носителем английского языка, поэтому, пожалуйста, извините за неудобное название этого вопроса. Я просто не знал, как это лучше выразить.

Я нахожусь на коробке FreeBSD, и у меня есть небольшой инструмент фильтрации, написанный на C, который читает список данных с помощью stdin и выводит обработанный список с помощью stdout. Я называю это примерно так: find . -type f | myfilter > /tmp/processed.txt.

Теперь я хочу немного увеличить экспозицию своего фильтра и опубликовать его. Конвенция гласит, что инструменты должны позволять что-то вроде этого: find . -type f | myfilter -f - -o /tmp/processed.text

Это вынудит меня написать код, который просто не нужен, поскольку оболочка может выполнять эту работу, поэтому я склонен пропустить это.

Мой вопрос таков: пропускаю ли я какой-то аргумент (кроме соглашения), почему чтение и запись файлов должны выполняться в моем коде, а не делегироваться для перенаправления оболочки?

Ответы [ 4 ]

2 голосов
/ 31 мая 2011

В этом нет абсолютно ничего плохого.Ваш фильтр будет иметь интерфейс, подобный, скажем, c++filt.

. Вы можете рассмотреть обработку файлов, если вы хотите автоматически выбирать выходной файл на основе имени входного файла или если вы хотите специальной обработкидля обработки нескольких файлов в одной команде.

Если вы не хотите выполнять какие-либо из этих действий, нет ничего плохого в том, чтобы быть простым фильтром.Любой может предоставить набор простых оболочек оболочки для обеспечения синтаксиса cmd infile outfile, если пожелает.

1 голос
/ 31 мая 2011

Фактически, чтобы иметь тот же эффект, что и перенаправление оболочки, вы можете сделать это:

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

, и поэтому, если вы использовали printf во всем коде, выходные данные будут перенаправлены в файл.Поэтому вам не нужно изменять какой-либо код, который вы написали ранее, и легко адаптировать его к соглашению.

1 голос
/ 31 мая 2011

Это ненужно ограничивающий интерфейс. Прием аргументов из командной строки более гибкий,

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

и это не исключает использования find

find . -type f -exec myfilter {} + > /tmp/processed.text
0 голосов
/ 31 мая 2011

Приятно иметь в качестве опции любую команду с аргументом имени файла.Как в вашем примере:

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 тоже ...

И почему это хорошо?Например, когда вы хотите запустить команду из «C» с помощью «fork / exec» и не хотите запускать оболочку для обработки ввода-вывода.В этом случае намного проще (и быстрее) execve(.....) с аргументами, так как запускайте cmd с оболочкой оболочки.

...