Философия UNIX гласит: делай одно и делай это хорошо. Создавайте программы, которые обрабатывают текст, потому что это универсальный интерфейс.
Команда sort
, по крайней мере, сортировка GNU, имеет -o
возможность вывода в файл вместо stdout
. Почему, скажем, sort foobar -o whatever
полезно, когда я мог просто sort foobar > whatever
?
sort
unix-philosophy
strugee
источник
источник
Ответы:
Это имеет не только GNU-сортировка. У BSD-сорта это тоже есть. И почему?
(Я тоже думал, что это хороший вопрос ...)
Со страницы руководства: «Данный аргумент является именем выходного файла, который будет использоваться вместо стандартного вывода. Этот файл может совпадать с одним из входных файлов».
Вы не можете перейти к одному и тому же файлу с перенаправлением, перенаправление вывода стирает файл.
Чтобы уточнить, если бы я хотел отсортировать файл и поместить отсортированные результаты в то же место, я мог бы попробовать
sort < foo > foo
. За исключением перенаправления вывода, файл усекается приfoo
подготовке к получению вывода. И тут нечего сортировать. Без "-o" способ сделать это был быsort < foo > bar ; mv bar foo
. Я предполагаю, что-o
опция делает нечто подобное, не заставляя вас беспокоиться об этом.источник
sudo sort -o /some/place
что ваш непривилегированный пользователь не имеет разрешения на запись в.sponge
(часть moreutils). Для привилегированного перенаправления существует конвейер| sudo tee
, который также имеет преимущество ограничения повышения привилегий до одной простой программыtee
.-o
вариантsort
существовал задолго до губки. Он по крайней мере столь же стар, как 4.4-lite2 (именно здесь история начинается в OpenBSD CVS). И для случая, когда вы работаете с непривилегированным файлом и записываете в привилегированную область, это| sudo tee
прекрасно работает, но в большинстве случаев вы хотите, чтобы все это было привилегированным, иsudo
сбивает вас с толку. Иsudo grep file | sudo tee
глупо.sort
ему нужно прочитать весь ввод, прежде чем он сможет начать выводить что-либо, поэтому он может безопасно перезаписать свой ввод. Он может хранить данные в памяти или во временных файлах перед началом вывода.«-O» вариант уже был в в
sort
части шестого издания UnixОднако я согласен с вами, что это не в философии Unix.
uniq
не было такой опции (иsort
не было-u
тогда).На моем PDP-11 я использовал небольшую программу, которая принимала бы один параметр:
Если он
whatever
уже существует, он будет записывать все, начиная от stdin, во временный файл, который был переименован толькоwhatever
после того, как ввод stdin иссяк. Таким образом, вы можете направить вывод любой командыrenac
вместо перенаправления на имя файла без возможности перезаписи ввода. Решение проблемы перезаписи таким образом, IMHO, больше соответствует философии Unix.Некоторыми более поздними дополнениями к программе были: не перезаписывать выходной файл, если на stdin ничего не поступило (например, из-за неправильного ввода части командной строки), и разрешать добавление stdin в указанный файл.
Это была одна из первых (если не первая) реальных программ на Си, которые я сделал (для своей работы я в основном разрабатывал на Pascal для этой системы).
источник
apt
люди с ароматизированными GNU / Linux могут иметь переписанную версию предоставляемой функциональностиrenac
с помощью программыsponge
(изman
: впитать стандартный ввод и записать в файл), package
moreutils`.sponge
неmoreutils
были созданы GNU.