NFsec Logo

Krótka historia poleceń “rm” oraz “rmdir”

15/07/2018 w Administracja Brak komentarzy.  (artykuł nr 663, ilość słów: 741)

W

przeciwieństwie do wielu podstawowych narzędzi systemów Unix i Linux, nazwa polecenia rm nie jest starsza niż sam Unix. W poprzednikach Uniksa – Compatible Time Sharing System (CTSS) i Multics, polecenie używane do usuwania plików nazywało się delete (w Multics opcjonalnie mogło zostać skrócone do dl). W systemie Unix nazwa rm została prawdopodobnie użyta, aby odzwierciedlić filozofię zmiany z usuwania plików na usuwanie wpisów, które prowadziły do ich pozycji.

Częścią Uniksa do czasu wydania jego pierwszej wersji podręcznika (3 listopada 1971 r.) było polecenie rmdir służące do usuwania katalogów. Dzisiaj polecenie rmdir wywołuje po prostu wywołanie systemowe rmdir() dla każdego z argumentów i zgłasza wszelkie popełnione błędy. Ale w 1971 roku nie było żadnego wywołania systemowego rmdir(), więc program rmdir musiał wykonywać całą pracę sam. Upewniał się, że usuwany katalog jest pusty, że jego uprawnienia są poprawne, a następnie usuwał specjalne dowiązania “.” oraz “..” tuż przed odłączeniem samego katalogu. Sytuacja ta utrzymywała się do 1983 roku, kiedy wprowadzenie nowego systemu plików Fast File System w 4.2BSD spowodowało, że za utworzenie i usuwanie katalogów stało się odpowiedzialne jądro systemu.

Wersja rm z 1971 roku nie posiadała żadnej z opcji, którą mają obecne wersje. Program ten też był skłonny usuwać pliki tylko do odczytu, chociaż w podręczniku napisano, że “prawdopodobnie powinien zapytać” przed tą czynnością. Późniejsza wersja została zmieniona tak, aby jednak zadawać pytanie. W nowej wersji, której strona manualna pochodzi z dnia 20 stycznia 1973 roku posiadała ona następujące opcje:

  • rm -f – nie pytaj przed usunięciem plików tylko do odczytu,
  • rm -r – rekursywnie usuwaj podkatalogi.

Sposób, w jaki opcja -r została zaimplementowana w tamtym czasie wyglądała mniej więcej tak: gdy polecenie rm napotykało katalog z plikami w środku, który miało usunąć – wchodziło do jego środka (poprzez wywołanie chdir) i uruchamiało kolejną instancję polecenia rm -r *, aby usunąć pierw jego zawartość. Wersja, która wykonywała rekursywne usuwanie w ramach pojedynczego procesu rm pojawiła się dopiero w siódmej edycji systemu Unix w 1979 roku. Posiadała ona również nową opcję:

  • rm -i – pytaj, czy każdy plik lub katalog ma zostać usunięty.

Umożliwiło to wpisanie rm -i * w celu interaktywnego usuwania wybranych plików z katalogu, w tym także tych, których nazwy zostały w jakiś sposób zmanipulowane do tego stopnia, że nie można było ich normalnie wskazać z klawiatury. Ta funkcja w rzeczywistości była potrzebna dużo wcześniej, ale przed siódmą edycją była wykonywana przez oddzielny, teraz już dawno porzucony program o nazwie dsw.

Nazwa dsw była bardziej tajemnicza niż jakakolwiek inna komenda, nawet w tym systemie operacyjnym, znanym z niejasnych nazw. W podręczniku z szóstej edycji można było znaleźć zabawną uwagę, że “nazwa dsw pochodzi ze starożytnej przeszłości, a jej etymologia jest zabawna”. W pierwszej edycji podręcznika widniało jeszcze zdanie “… ale jej nazwa jest niemniej jednak nierozważna”, ale zniknęło ono z późniejszych wersji podręczników.

Spekulacje na temat tego, co naprawdę mogła oznaczać nazwa dsw (delete s-t work? – usuń gównianą pracę, do svidaniya? – żegnaj na zawsze) zostały zakończone, gdy Denis Ritchie ujawnił w 1981 r. w ogłoszeniu na Usenet, że nazwa początkowo miała na celu “usunięcie z przełączników” (“delete from switches”). Było to odniesieniem do przełączników na przednim panelu komputera PDP-7, na którym działała najwcześniejsza wersja Uniksa (niektóre, późniejsze wersje sprzętowe również miały przełączniki konsoli, a od trzeciej do szóstej edycji uruchamiano wywołanie systemowe getcsw(), za pomocą którego programy mogły dowiedzieć się, w jakim celu zostały one ustawione).

Do użycia oryginalnego programu dsw ustawiano przełączniki na przednim panelu na określoną liczbę i uruchamiano polecenie dsw. Czytało ono tę liczbę jako liczbę wpisów z bieżącego katalogu, drukowało na terminalu ostatnią nazwę pliku jaką przeczytało i wywalało się zrzucając pamięć (ang. core dump). Mogliśmy wtedy usunąć plik z zrzutem pamięci poprzez ponowne uruchomienie programu dsw. Kiedy ten okropny interfejs użytkownika został zastąpiony bardziej sensownym, nazwa pozostała, dopóki cały program nie został zastąpiony przez polecenie rm -i.

Od tego momentu ewolucja polecenia rm została w dużej mierze przeprowadzona do końca. Nieco zmieniona wersja z 1 kwietnia 1981 roku, rozprowadzana w 4.2BSD wprowadziła terminator opcji “-“, aby ułatwić usuwanie plików, których nazwy zaczynały się od myślnika. Do zachowania spójności z innymi poleceniami, standard POSIX zmienił to na “–” i dodał kolejną opcję pisaną wielką literą “-R” w celu rekursywnego usuwania katalogów.

Więcej informacji: A Brief History of the ‘rm’ and ‘rmdir’ commands

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , , ,

Komentowanie tego wpisu jest zablokowane.