Dlaczego sort -o jest użyteczny?


32

Filozofia UNIX mówi: zrób jedną rzecz i zrób to dobrze. Twórz programy obsługujące tekst, ponieważ jest to uniwersalny interfejs.

sortPolecenia, przynajmniej rodzaju GNU, posiada -oopcję wyjścia do pliku zamiast stdout. Dlaczego, powiedzmy, jest sort foobar -o whateverprzydatny, kiedy mógłbym po prostu sort foobar > whatever?


3
GNU to nie UNIX. W wielu aspektach jest inaczej, na przykład pełne argumenty (--help itp.).
sakisk

@faif tak to prawda . ale twierdzę, że to nie jest odpowiedź na to konkretne pytanie.
strugee,

2
Dlatego zostawiłem to jako komentarz, a nie odpowiedź :)
sakisk

Odpowiedzi:


47

Ma to nie tylko rodzaj GNU. Sortowanie BSD też to ma. A dlaczego?
(Myślałem też, że to dobre pytanie ...)

Ze strony podręcznika: „Podany argument to nazwa pliku wyjściowego, który ma zostać użyty zamiast standardowego pliku wyjściowego. Ten plik może być taki sam jak jeden z plików wejściowych.”

Nie można przejść do tego samego pliku z przekierowaniem, przekierowanie wyjścia usuwa plik.

W celu dalszego wyjaśnienia, jeśli chciałbym posortować plik i umieścić posortowane wyniki w tym samym miejscu, mógłbym spróbować sort < foo > foo. Z wyjątkiem tego, że przekierowanie danych wyjściowych obcina plik foow przygotowaniu do otrzymania danych wyjściowych. A potem nie ma nic do sortowania. Bez „-o” byłoby to możliwe sort < foo > bar ; mv bar foo. Zakładam, że -oopcja robi coś podobnego, nie powodując, że musisz się tym martwić.


12
Możesz również, sudo sort -o /some/placeże Twój nieuprzywilejowany użytkownik nie ma uprawnień do pisania.
bahamat

8
I aby uniknąć pomyłek z komentarzem bahamata: Nie mówi, że mogą sortować plik, do którego nie mają uprawnień. Przekierowanie I / O działa ... źle z sudo. Ponieważ przekierowanie odbywa się w twojej powłoce (sudo jest tylko poleceniem, które zamierza uruchomić), używanie przekierowania z poleceniem przez sudo jest denerwujące. (Początkowo byłem zdezorientowany, co mówi bahamat, więc pomyślałem, że inni też mogą być zdezorientowani).
kurtm

3
Aby grać adwokata diabła, istnieją w rzeczywistości alternatywy zarówno dla problemu „plik wejściowy jest taki sam jak problem z plikiem wyjściowym” i problemu „uprzywilejowanego przekierowania”, a obie alternatywy są bardziej w duchu „rób jedną rzecz dobrze”. Dla „input = output” istnieje sponge(część moreutils). Na uprzywilejowanej przekierowania nie jest orurowanie do | sudo tee, który ma również korzyści z ograniczania eskalacji uprawnień do jednego prostego programu, tee.
jw013,

Słuszne uwagi. Chociaż -oopcja sortistniała na długo przed gąbką. Jest co najmniej tak stary jak 4.4-lite2 (od tego miejsca zaczyna się historia w OpenBSD CVS). A w przypadku, gdy operujesz na nieuprzywilejowanym pliku i piszesz w uprzywilejowanym obszarze, | sudo teedziała świetnie, ale przez większość czasu chcesz, aby cała ta sprawa była uprzywilejowana, i sudopotępia cię. I sudo grep file | sudo teejest głupie.
kurtm

1
sortmusi przeczytać całe dane wejściowe, zanim zacznie coś wypisywać, dlatego może bezpiecznie nadpisać dane wejściowe. Przed zapisaniem może przechowywać dane w pamięci lub w plikach tymczasowych.
Stéphane Chazelas

12

Opcja „-o” była już w tej sortczęści szóstej edycji Unix

Zgadzam się jednak z tobą, że nie jest to zgodne z filozofią uniksową. uniqnie miał tej opcji (i sortnie miał -uwtedy).

Na moim PDP-11 użyłem małego programu, który pobierałby jeden parametr:

renac whatever

Gdyby whateverjuż istniał, zapisywałby wszystko od standardowego pliku do pliku tymczasowego, którego nazwę zmieniono dopiero whateverpo wyschnięciu wejścia standardowego. W ten sposób możesz renacprzekierować wyjście dowolnego polecenia zamiast przekierowywać do nazwy pliku bez szansy na zastąpienie danych wejściowych. Rozwiązanie problemu nadpisywania w ten sposób jest bardziej zgodne z filozofią Unixa.

Późniejszymi dodatkami do programu były: nie nadpisywanie pliku wyjściowego, jeśli nic nie dotarło do standardowego wejścia (np. W wyniku błędnego wpisania części wiersza poleceń) i umożliwienie dodania standardowego pliku do nazwanego pliku.

Był to jeden z pierwszych (jeśli nie pierwszy) prawdziwych programów C, które stworzyłem (dla mojej pracy rozwijałem się głównie w Pascalu na tym systemie).


Jeśli dobrze rozumiem, aptludzie z GNU / Linuxem o smaku mogą mieć przepisaną wersję funkcjonalności renac, z programem o nazwie sponge(z man: wchłanianie standardowego wejścia i zapisywanie do pliku ), package moreutils`.
41754

@uprego. Właśnie poszukałem źródła sponge.c i wydaje się, że ma dużo narzutu kodu z powodu funkcji spongowania (stdin -> stdout).
Anthon

@uprego ani spongenie moreutilszostały utworzone przez GNU.
jw013,

Nie zamierzałem tego twierdzić.
41754,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.