tr a </ etc / hosts | sort -r | pr -d> / etc / hosts

9

W tej linii:

tr a A < /etc/hosts | sort -r |pr -d > /etc/hosts 

jaki byłby oczekiwany wynik? Wiem, że małe litery „a” zmieniłyby się na wielkie litery „A”, ale co dalej? Czy oryginalny plik zostałby zastąpiony, ponieważ przekierowanie prowadzi do tej samej nazwy pliku?

tdharrison
źródło
Powinieneś otrzymać bash: /etc/hosts: Permission deniedbłąd (zakładając, że twoja powłoka to bash), chyba że używasz tego jako root. /etc/hostsjest zwykle zapisywalny tylko przez root. Jeśli prowadzisz to jako root(czego naprawdę nie powinieneś), dostaniesz puste, /etc/hostsjak wyjaśnił Michael Homer.
arielf

Odpowiedzi:

17

Oczekiwany wynik to pusty /etc/hostsplik.

Przekierowanie > /etc/hostsnastępuje i obcina plik, zanim programy zaczną działać i trzacznie czytać z pliku.

Aby zapisać dane wyjściowe /etc/hosts, możesz albo pracować z kopią pliku (lub później przenieść plik wyjściowy na miejsce), albo użyć spongepolecenia z moreutils , które wchłonie standardowe dane wejściowe i zapisze w pliku:

tr a A < /etc/hosts | sort -r | pr -d | sponge /etc/hosts

W takim przypadku każda litera „a” /etc/hostszostanie zastąpiona literą „A”, wszystkie linie zostaną posortowane w odwrotnej kolejności zgodnie z ustawieniami regionalnymi , pusta linia zostanie wstawiona między każdą linią , a wynik zostanie wstawiony /etc/hosts.


Przydatne mogą być również:

Michael Homer
źródło
1
Dziękuję bardzo za wyjaśnienie, czego powinienem się spodziewać po sposobie, w jaki został napisany i jak można go napisać, aby osiągnąć oczekiwany rezultat.
tdharrison
moreutils to naprawdę świetny zestaw narzędzi
Robert Riedl