Почему сортировка -o полезна?

32

Философия UNIX гласит: делай одно и делай это хорошо. Создавайте программы, которые обрабатывают текст, потому что это универсальный интерфейс.

Команда sort, по крайней мере, сортировка GNU, имеет -oвозможность вывода в файл вместо stdout. Почему, скажем, sort foobar -o whateverполезно, когда я мог просто sort foobar > whatever?

strugee
источник
3
GNU не UNIX. Во многих отношениях он отличается, например, подробные аргументы (--help и т. Д.).
Сакиск
@ Да, если это правда . но я бы сказал, что это не ответ на этот конкретный вопрос.
стружка
2
Вот почему я оставил это как комментарий, а не как ответ :)
Сакиск

Ответы:

47

Это имеет не только GNU-сортировка. У BSD-сорта это тоже есть. И почему?
(Я тоже думал, что это хороший вопрос ...)

Со страницы руководства: «Данный аргумент является именем выходного файла, который будет использоваться вместо стандартного вывода. Этот файл может совпадать с одним из входных файлов».

Вы не можете перейти к одному и тому же файлу с перенаправлением, перенаправление вывода стирает файл.

Чтобы уточнить, если бы я хотел отсортировать файл и поместить отсортированные результаты в то же место, я мог бы попробовать sort < foo > foo. За исключением перенаправления вывода, файл усекается при fooподготовке к получению вывода. И тут нечего сортировать. Без "-o" способ сделать это был бы sort < foo > bar ; mv bar foo. Я предполагаю, что -oопция делает нечто подобное, не заставляя вас беспокоиться об этом.

kurtm
источник
12
Вы также можете, sudo sort -o /some/placeчто ваш непривилегированный пользователь не имеет разрешения на запись в.
Багамат
8
И чтобы избежать путаницы с комментарием Багамата: он не говорит, что они могут сортировать файлы, для которых у них нет разрешений. Перенаправление ввода / вывода работает ... плохо с sudo. Поскольку перенаправление происходит в вашей оболочке (sudo - это просто команда, которую он собирается запустить), использование перенаправления с командой через sudo раздражает. (Сначала я был смущен тем, что говорил Багамат, поэтому решил, что другие тоже могут быть смущены).
Куртм
3
Просто для того, чтобы сыграть в защиту дьявола, на самом деле есть альтернативы как проблеме «входной файл совпадает с проблемой выходного файла», так и проблеме «привилегированного перенаправления», и обе альтернативы больше в духе «делай одно хорошо». Для «input = output» есть sponge(часть moreutils). Для привилегированного перенаправления существует конвейер | sudo tee, который также имеет преимущество ограничения повышения привилегий до одной простой программы tee.
jw013
Хорошие моменты. Хотя -oвариант sortсуществовал задолго до губки. Он по крайней мере столь же стар, как 4.4-lite2 (именно здесь история начинается в OpenBSD CVS). И для случая, когда вы работаете с непривилегированным файлом и записываете в привилегированную область, это | sudo teeпрекрасно работает, но в большинстве случаев вы хотите, чтобы все это было привилегированным, и sudoсбивает вас с толку. И sudo grep file | sudo teeглупо.
Куртм
1
sortему нужно прочитать весь ввод, прежде чем он сможет начать выводить что-либо, поэтому он может безопасно перезаписать свой ввод. Он может хранить данные в памяти или во временных файлах перед началом вывода.
Стефан Шазелас
12

«-O» вариант уже был в в sortчасти шестого издания Unix

Однако я согласен с вами, что это не в философии Unix. uniqне было такой опции (и sortне было -uтогда).

На моем PDP-11 я использовал небольшую программу, которая принимала бы один параметр:

renac whatever

Если он whateverуже существует, он будет записывать все, начиная от stdin, во временный файл, который был переименован только whateverпосле того, как ввод stdin иссяк. Таким образом, вы можете направить вывод любой команды renacвместо перенаправления на имя файла без возможности перезаписи ввода. Решение проблемы перезаписи таким образом, IMHO, больше соответствует философии Unix.

Некоторыми более поздними дополнениями к программе были: не перезаписывать выходной файл, если на stdin ничего не поступило (например, из-за неправильного ввода части командной строки), и разрешать добавление stdin в указанный файл.

Это была одна из первых (если не первая) реальных программ на Си, которые я сделал (для своей работы я в основном разрабатывал на Pascal для этой системы).

Энтон
источник
Если я правильно понял, aptлюди с ароматизированными GNU / Linux могут иметь переписанную версию предоставляемой функциональности renacс помощью программы sponge(из man: впитать стандартный ввод и записать в файл ), package moreutils`.
41754
@uprego. Я только что посмотрел на источник sponge.c, и кажется, что он содержит много кода из-за функциональности sponging (stdin -> stdout).
Anthon
@uprego ни на самом деле spongeне moreutilsбыли созданы GNU.
jw013
Я не собирался утверждать это.
41754