Чому сорт -о корисний?


32

Філософія UNIX говорить: зробіть одне і зробіть це добре. Створіть програми, які обробляють текст, адже це універсальний інтерфейс.

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


3
GNU не UNIX. У багатьох аспектах це різне, наприклад, багатослівні аргументи (--help тощо).
sakisk

@faif так , це правда . але я заперечую, що це не відповідь на це конкретне питання.
strugee

2
Тому я залишив це як коментар, а не відповідь :)
sakisk

Відповіді:


47

Це не лише такий тип GNU. У BSD сорту теж є. А щодо чого?
(Я думав, що це теж гарне питання ...)

На вхідній сторінці: "Наведений аргумент - це ім'я вихідного файлу, який буде використовуватися замість стандартного виводу. Цей файл може бути таким самим, як один із вхідних файлів."

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

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


12
Ви також можете, sudo sort -o /some/placeщо ваш несанкціонований користувач не має дозволу писати.
bahamat

8
І щоб уникнути плутанини з коментарем bahamat: Він не каже, що вони можуть сортувати файл, на який не мають дозволів. Перенаправлення вводу / виводу працює ... погано із судо. Оскільки перенаправлення відбувається у вашій оболонці (sudo - це лише команда, яку він буде запускати), використання перенаправлення з командою через sudo дратує. (Я спочатку плутався в тому, що говорив бахамат, тому вважав, що інші теж можуть плутатись).
kurtm

3
Просто для того, щоб грати в захисника диявола, насправді є альтернативи як "вхідному файлу, так і проблемі вихідного файлу" та проблемі "привілейоване перенаправлення", і обидві альтернативи більше в дусі "добре робити одну справу". Для "input = output" є sponge(частина moreutils). Для привілейованого перенаправлення є трубопровід до | sudo tee, який також має перевагу обмеження привілеїв для однієї простої програми tee.
jw013

Хороші бали. Хоча -oваріант sortіснував задовго до появи губки. Він, принаймні, такий, як 4.4-lite2 (саме там історія починається в OpenBSD CVS). І для випадку, коли ви працюєте над непривілейованим файлом і пишете в привілейовану область, виходить | sudo teeчудово, але більшу частину часу ви хочете, щоб уся справа була привілейована, і sudoвас запускає. І sudo grep file | sudo teeнерозумно.
kurtm

1
sortпотрібно прочитати весь вхід, перш ніж він може почати виводити що завгодно, тому він може безпечно перезаписати його. Він може зберігати дані в пам'яті або у тимчасових файлах до початку виведення.
Стефан Шазелас

12

Варіант '-o' вже був у sortскладі шостого видання Unix

Однак я згоден з вами, що це не входить у філософію Unix. uniqне мав такого варіанту (іsort тоді не мав -u).

У моєму PDP-11 я використовував невелику програму, яка брала б один параметр:

renac whatever

Якби воно whateverвже існувало, воно записувало б все, від stdin до тимчасового файлу, на який було лише перейменованоwhatever після висихання вводу stdin. Таким чином, ви можете передавати вихід будь-якої команди, renacа не перенаправляти на ім'я файлу без шансу перезаписати вхід. Таким чином, вирішуючи проблему перезапису, IMHO більше відповідає філософії Unix.

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

Це була одна з перших (якщо не перша) реальна програма C, яку я створив (для роботи я в основному розроблявся в Паскалі в цій системі).


Якщо я добре зрозумів, aptлюди з ароматизованим GNU / Linux можуть мати перезаписану версію функціоналу, що renacнадається, з програмою під назвою sponge(від man: замочити стандартний вхід і записати у файл ), package moreutils`.
41754,

@uprego. Я просто подивився на джерело sponge.c і, здається, має багато надмірних кодів через функціональність губки (stdin -> stdout).
Антон

@uprego ні, spongeні moreutilsнасправді не були створені GNU.
jw013

Я не мав намір це стверджувати.
41754
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.