Unix to fascynujący system operacyjny. Pierwotnie pomyślany w Bell Labs w późnych latach 1960-tych, został zrodzony z frustracji z OS znanym jako „Multics” (multipleksowane information and computing service). Unix ma już ponad 50 lat (!), a implementacja Linuksa zasila ogromne połacie Internetu.
więc — dlaczego Unix jest tak popularny?
moim zdaniem sukces Uniksa wynika z filozoficznego podejścia do rozwoju. Filozofia Uniksa została udokumentowana przez Douga Mcilroya w Bell System Technical Journal w 1978:
1. Spraw, aby każdy program robił jedną rzecz dobrze. Aby wykonać nową pracę, zamiast komplikować stare programy, dodając nowe „funkcje”.
2. Spodziewaj się, że wyjście każdego programu stanie się wejściem do innego, jeszcze nieznanego, programu. Nie zaśmiecaj danych wyjściowych obcymi informacjami. Unikaj rygorystycznie kolumnowych lub binarnych formatów wejściowych. Nie nalegaj na interakcję.
3. Projektuj i buduj oprogramowanie, nawet systemy operacyjne, aby wypróbować je wcześnie, najlepiej w ciągu kilku tygodni. Nie wahaj się wyrzucić niezdarnych części i odbudować je.
4. Użyj narzędzi zamiast niewykwalifikowanej pomocy, aby złagodzić zadanie programistyczne, nawet jeśli musisz objechać, aby zbudować narzędzia i spodziewać się wyrzucenia niektórych z nich po zakończeniu ich używania.
to było ponad 40 lat temu i oddaje solidne (zasada pojedynczej odpowiedzialności, Otwarte/Zamknięte), mikroserwisy, funkcjonalne potoki, zwinność i ducha DevOps!
aby uzyskać więcej szczegółów na temat filozofii Uniksa, przeczytaj tę książkę (bezpłatnie dostępną tutaj, ale kup kopię, aby wesprzeć autora!).
spójrzmy na kilka przykładów filozofii Uniksa w działaniu.
spraw, aby każdy program robił jedną rzecz dobrze. Aby wykonać nową pracę, zamiast komplikować stare programy, dodając nowe „funkcje”.
cat
robi dokładnie jedną rzecz. Łączy pliki i wyświetla je na standardowym wyjściu. To wszystko. Nie robi paginacji. Nie oferuje funkcji wyszukiwania. Robi dokładnie to, co jest napisane na puszce i nic więcej.
tr
jest podobny. Robi „texttual replacement” poprzez czytanie od wejścia, dokonywanie wszelkich tłumaczeń i pisanie do wyjścia.
tr -d aeiouAEIOU < file # Display file without vowels
tr eao 340 < file # Partially leet speak file
true
i false
to chyba najlepsze przykłady na zrobienie jednej rzeczy dobrze. true
nic nie robi, z powodzeniem! false
nic nie robi.
false && echo Hi # does nothing
true && echi Hi # Prints Hi
skład
„oczekuj, że wyjście każdego programu stanie się wejściem do innego”
w Uniksie większość operacji ma możliwość odczytu i zapisu na standardowe wyjście w dobrze zrozumiałym formacie tekstowym. Za pomocą kilku poleceń, takich jak |
, >
i <
możemy przekazać wyjście jednego programu do drugiego. Spójrzmy na kilka przykładów:
w tym przykładzie używamy cat
, aby wypisać zawartość pliku i przekazać dane wyjściowe do wc
, który może policzyć liczbę linii w pliku.
cat foo.txt | wc -l
w tym przykładzie używamy history
, aby znaleźć nasze najczęściej używane polecenia, łącząc je z cut
, sort
, uniq
i head
.
history | cut -f5 -d" " | sort -rn | uniq -c | sort -rn | head
xargs
jest najlepszym swiss – army knife pozwalającym na tworzenie poleceń ze standardowego wyjścia. Użyjmy go do usunięcia wszystkich”.pliki tmp ” w bieżącym katalogu po użyciu find
, aby je zlokalizować.
find -type f *.tmp | xargs rm
wszystko jest plikiem
w Uniksie wszystko jest plikiem (a dokładniej wszystko jest strumieniem bajtów). Oznacza to, że te same API/polecenia mogą być używane do odczytu napędu CD-ROM, zapisu gniazda sieciowego lub wyszukiwania informacji o procesorze.
na przykład, cały system plików /proc
w Linuksie nie jest tak naprawdę plikami — jest to dynamiczny widok informacji, które są ujawniane jako kilka deskryptorów plików.
kilka przykładów:
cat /proc/cpuinfo # Displays your CPU info exposed as a filefoo > /dev/null # Redirect output into a file called
# null (which discards everything)od -vAn -N1 -td1 < /dev/urandom # Display a random 1 byte number
# (via https://unix.stackexchange.com/a/268960
Automatyzacja
na długo przed „automate-all-the-things” był Unix, errr, automatyzacja wszystkich rzeczy
cron
(więcej tutaj) automatyzuje wszystkie rzeczy przez ostatnie 40 + lat. Zadania Cron to zaplanowane skrypty, które mogą być uruchamiane w ustalonych godzinach lub stałych odstępach czasu.
każdy użytkownik systemu Unix ma zestaw zaplanowanych zadań, widocznych za pomocą polecenia crontab
. Plik jest w bardzo prostym formacie, który podaje datę i godzinę uruchomienia skryptu.
polecenie at
jest bardziej przyjazną alternatywą, oto przykład odpalenia polecenia na 1145 31 stycznia (stąd).
echo "cc -o foo foo.c" | at 1145 jan 31
Puppet, Chef, CFEngine, Ansible — wszystkie te narzędzia DevOps i stworzone na systemach opartych na Uniksie.