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.
sort
Polecenia, przynajmniej rodzaju GNU, posiada -o
opcję wyjścia do pliku zamiast stdout
. Dlaczego, powiedzmy, jest sort foobar -o whatever
przydatny, kiedy mógłbym po prostu sort foobar > whatever
?
sort
unix-philosophy
strugee
źródło
źródło
Odpowiedzi:
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 plikfoo
w przygotowaniu do otrzymania danych wyjściowych. A potem nie ma nic do sortowania. Bez „-o” byłoby to możliwesort < foo > bar ; mv bar foo
. Zakładam, że-o
opcja robi coś podobnego, nie powodując, że musisz się tym martwić.źródło
sudo sort -o /some/place
że Twój nieuprzywilejowany użytkownik nie ma uprawnień do pisania.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
.-o
opcjasort
istniał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 tee
działa świetnie, ale przez większość czasu chcesz, aby cała ta sprawa była uprzywilejowana, isudo
potępia cię. Isudo grep file | sudo tee
jest głupie.sort
musi 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.Opcja „-o” była już w tej
sort
części szóstej edycji UnixZgadzam się jednak z tobą, że nie jest to zgodne z filozofią uniksową.
uniq
nie miał tej opcji (isort
nie miał-u
wtedy).Na moim PDP-11 użyłem małego programu, który pobierałby jeden parametr:
Gdyby
whatever
już istniał, zapisywałby wszystko od standardowego pliku do pliku tymczasowego, którego nazwę zmieniono dopierowhatever
po wyschnięciu wejścia standardowego. W ten sposób możeszrenac
przekierować 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).
źródło
apt
ludzie z GNU / Linuxem o smaku mogą mieć przepisaną wersję funkcjonalnościrenac
, z programem o nazwiesponge
(zman
: wchłanianie standardowego wejścia i zapisywanie do pliku), package
moreutils`.sponge
niemoreutils
zostały utworzone przez GNU.