Unix este un sistem de operare fascinant. Inițial conceput de la Bell Labs la sfârșitul anilor 1960, a fost susținută de frustrare cu sistemul de operare cunoscut sub numele de „Multics” (informații multiplexate și servicii de calcul). Unix are acum peste 50 de ani (!) și implementarea Linux are puteri uriașe ale Internetului.
deci — de ce este Unix atât de popular?
în mintea mea, Succesul Unix vine de la abordarea filosofică a dezvoltării. Filosofia UNIX este documentată de Doug McIlroy în Jurnalul tehnic al sistemului Bell în 1978:
1. Faceți fiecare program să facă un lucru bine. Pentru a face un nou loc de muncă, construi din nou, mai degrabă decât complica programe vechi prin adăugarea de noi „caracteristici”.
2. Așteptați ca ieșirea fiecărui program să devină intrarea către un alt program, încă necunoscut. Nu dezordine de ieșire cu informații străine. Evitați formatele de intrare stringent columnare sau binare. Nu insistați asupra intrărilor interactive.
3. Proiectați și construiți software, chiar și sisteme de operare, pentru a fi încercat devreme, în mod ideal în câteva săptămâni. Nu ezitați să aruncați părțile stângace și să le reconstruiți.
4. Utilizați instrumente de preferință pentru ajutor necalificat pentru a ușura o sarcină de programare, chiar dacă trebuie să ocoliți pentru a construi instrumentele și așteptați să aruncați unele dintre ele după ce ați terminat de utilizat.
acest lucru a fost de peste 40 de ani în urmă, și surprinde SOLID (principiul responsabilitate unică, deschis/închis), microservicii, conducte funcționale, agil și spiritul DevOps!
pentru mai multe detalii despre filosofia Unix, citiți această carte (disponibilă gratuit aici, dar cumpărați o copie pentru a sprijini autorul!).
să ne uităm la câteva exemple ale filozofiei Unix în acțiune.
faceți ca fiecare program să facă un lucru bine. Pentru a face un nou loc de muncă, construi din nou, mai degrabă decât complica programe vechi prin adăugarea de noi „caracteristici”.
cat
face exact un singur lucru. Acesta concatenează fișiere și le afișează pe ieșire standard. Asta e tot ce face. Nu face paginare. Nu oferă funcționalitate de căutare. Doar face exact ceea ce spune pe tablă și nu mai mult.
tr
este similar. Ea face „înlocuire textual” prin citirea de la intrare, ceea ce face orice Traduceri și scris la ieșire.
tr -d aeiouAEIOU < file # Display file without vowels
tr eao 340 < file # Partially leet speak file
true
și false
sunt probabil cele mai bune exemple de a face un lucru bine. true
nu face nimic, cu succes! false
nu face nimic.
false && echo Hi # does nothing
true && echi Hi # Prints Hi
compoziție
„așteptați ca ieșirea fiecărui program să devină intrarea către altul”
în Unix, majoritatea operațiilor au capacitatea de a citi și scrie la ieșire standard într-un format textual bine înțeles. Cu câteva comenzi, cum ar fi |
, >
și <
putem alimenta ieșirea unui program la altul. Să ne uităm la câteva exemple:
în acest exemplu, folosim cat
pentru a scoate conținutul unui fișier și a alimenta ieșirea în wc
cine poate număra numărul de linii dintr-un fișier.
cat foo.txt | wc -l
în acest exemplu, folosim history
pentru a găsi comenzile noastre cele mai frecvent utilizate combinându-le cu cut
, sort
, uniq
și head
.
history | cut -f5 -d" " | sort -rn | uniq -c | sort -rn | head
xargs
este ultimul cuțit elvețian-armată care vă permite să construiți comenzi de la ieșirea standard. Să-l folosim pentru a șterge toate „.tmp ” fișiere în directorul curent după utilizarea find
pentru a le localiza.
find -type f *.tmp | xargs rm
totul este un fișier
în UNIX totul este un fișier (sau mai precis, totul este un flux de octeți). Aceasta înseamnă că aceleași API-uri/comenzi pot fi utilizate pentru citirea unei unități CD-ROM, scrierea unui soclu de rețea sau aflarea informațiilor CPU.
de exemplu, întregul sistem de fișiere /proc
de pe Linux nu este cu adevărat fișiere — este o vizualizare dinamică a informațiilor care este expusă ca o grămadă de descriptori de fișiere.
câteva exemple:
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
Automation
cu mult înainte de „automatizarea tuturor lucrurilor”, Unix era acolo, errr, automatizând toate lucrurile
cron
(mai multe aici) a automatizat toate lucrurile în ultimii 40 + ani. Lucrările Cron sunt scripturi programate care pot rula la ore fixe sau intervale fixe.
fiecare utilizator de pe un sistem Unix are un set de sarcini programate, vizibile folosind comanda crontab
. Fișierul este într-un format foarte simplu, care oferă data și ora scriptului care rulează.
comanda at
este o alternativă mai prietenoasă, iată un exemplu de tragere a unei comenzi la 1145 pe 31 Ianuarie (de aici).
echo "cc -o foo foo.c" | at 1145 jan 31
Puppet, Chef, CFEngine, Ansible — toate aceste instrumente DevOps și născute și crescute pe sisteme bazate pe Unix.