Философия UNIX гласит: делай одно дело и делай его хорошо. Создавай программы, которые обрабатывают текст, потому что это универсальный интерфейс.
Команда sort
, по крайней мере GNU sort, имеет -o
опцию вывода в файл вместо stdout
. Зачем, скажем, sort foobar -o whatever
полезно, когда я мог бы просто sort foobar > whatever
?
решение1
Это не только в GNU sort есть. В BSD sort тоже есть. А почему?
(Я тоже подумал, что это хороший вопрос...)
Из страницы руководства: «Указанный аргумент — это имя выходного файла, который будет использоваться вместо стандартного вывода. Этот файл может совпадать с одним из входных файлов».
Вы не можете перейти к тому же файлу с помощью перенаправления, перенаправление вывода стирает файл.
Для дальнейшего разъяснения, если бы я хотел отсортировать файл и поместить отсортированные результаты в то же место, я мог бы попробовать sort < foo > foo
. За исключением того, что перенаправление вывода обрезает файл foo
при подготовке к получению вывода. И тогда нечего сортировать. Без "-o" способ сделать это был бы sort < foo > bar ; mv bar foo
. Я предполагаю, что -o
опция делает что-то похожее, не заставляя вас беспокоиться об этом.
решение2
Опция '-o' уже была sort
вШестое издание Unix
Однако я согласен с вами, что это не соответствует философии Unix. У меня uniq
не было такой возможности (и sort
не было -u
тогда).
На моем PDP-11 я использовал небольшую программу, которая принимала один параметр:
renac whatever
Если бы whatever
он уже существовал, он бы записывал все из stdin во временный файл, который переименовывался бы только whatever
после того, как ввод stdin иссякал. Таким образом, вы могли бы перенаправить вывод любой команды в renac
вместо перенаправления на имя файла без возможности перезаписи ввода. Решение проблемы перезаписи таким способом, IMHO, больше соответствует философии Unix.
Более поздними дополнениями к программе стали: запрет на перезапись выходного файла, если на stdin ничего не поступило (например, в результате неправильного ввода части командной строки), а также предоставление возможности добавлять stdin к указанному файлу.
Это была одна из первых (если не первая) настоящих программ на языке C, которые я создал (для своей работы я в основном писал на языке Pascal в этой системе).