Unix är ett fascinerande operativsystem. Ursprungligen tänkt på Bell Labs i slutet av 1960-talet, var det bäras av frustration med OS som kallas ”multiplexed information and computing service). Unix är nu över 50 år gammal (!) och Linux-implementeringen Driver enorma delar av Internet.
så – varför är Unix så populärt?
i mitt sinne kommer Unix framgång från den filosofiska inställningen till utveckling. UNIX-filosofin dokumenteras av Doug McIlroy i Bell System Technical Journal i 1978:
1. Låt varje program göra en sak bra. För att göra ett nytt jobb, bygga på nytt snarare än att komplicera gamla program genom att lägga till nya ”funktioner”.
2. Förvänta dig att utmatningen från varje program blir ingången till ett annat, ännu okänt program. Rör inte ut med extern information. Undvik stringent columnar eller binära inmatningsformat. Insistera inte på interaktiv inmatning.
3. Designa och bygga programvara, Även operativsystem, som ska prövas tidigt, helst inom några veckor. Tveka inte att kasta bort de klumpiga delarna och bygga om dem.
4. Använd verktyg i stället för okvalificerad hjälp för att lätta en programmeringsuppgift, även om du måste omväg för att bygga verktygen och förvänta dig att kasta ut några av dem efter att du har använt dem.
detta var över 40 år sedan, och fångar fast (enda ansvar princip, öppen/stängd), microservices, funktionella rörledningar, agile och andan i DevOps!
för mycket mer detaljer om Unix-filosofin, läs den här boken (fritt tillgänglig här men köp en kopia för att stödja författaren!).
Låt oss titta på några exempel på Unix-filosofin i aktion.
gör varje program gör en sak bra. För att göra ett nytt jobb, bygga på nytt snarare än att komplicera gamla program genom att lägga till nya ”funktioner”.
cat
gör exakt en sak. Det sammanfogar filer och visar dem på standardutgång. Det är allt den gör. Det gör inte pagination. Det erbjuder inte sökfunktionalitet. Det gör bara exakt vad det står på tennet och inte mer.
tr
är liknande. Det gör ”textual replacement” genom att läsa från input, göra översättningar och skriva till output.
tr -d aeiouAEIOU < file # Display file without vowels
tr eao 340 < file # Partially leet speak file
true
och false
är kanske de bästa exemplen på att göra en sak bra. true
gör ingenting, framgångsrikt! false
gör ingenting.
false && echo Hi # does nothing
true && echi Hi # Prints Hi
sammansättning
”räkna utdata från varje program för att bli ingången till en annan”
i Unix har de flesta operationer förmågan att läsa och skriva till standardutmatning i ett väl förstått textformat. Med några kommandon, till exempel |
, >
och <
kan vi mata utmatningen från ett program till ett annat. Låt oss titta på några exempel:
i det här exemplet använder vi cat
för att mata ut innehållet i en fil och mata utmatningen till wc
vem kan räkna antalet rader i en fil.
cat foo.txt | wc -l
i det här exemplet använder vi history
för att hitta våra mest använda kommandon genom att kombinera den med cut
, sort
, uniq
och head
.
history | cut -f5 -d" " | sort -rn | uniq -c | sort -rn | head
xargs
är den ultimata swiss-army kniv så att du kan bygga upp kommandon från standard utgång. Låt oss använda den för att ta bort alla”.tmp ” – filer i den aktuella katalogen efter att ha använt find
för att hitta dem.
find -type f *.tmp | xargs rm
allt är en fil
i UNIX är allt en fil (eller mer exakt är allt en ström av byte). Det betyder att samma API: er/kommandon kan användas för att läsa en CD-ROM-enhet, skriva ett nätverksuttag eller ta reda på CPU-information.
till exempel är hela filsystemet /proc
på Linux inte riktigt filer — det är en dynamisk bild av information som exponeras som en massa filbeskrivningar.
några exempel:
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
långt innan ”automatisera-allt-saker”, Unix var där, fela, automatisera alla saker
cron
(mer här) har automatiserat alla saker under de senaste 40 + åren. Cron-jobb är schemalagda skript som kan köras vid fasta tider eller fasta intervall.
varje användare på ett Unix-system har en uppsättning schemalagda uppgifter, synliga med kommandot crontab
. Filen är i ett mycket enkelt format som ger datum och tid för skriptet som körs.
kommandot at
är ett vänligare alternativ, här är ett exempel på att skjuta ett kommando vid 1145 den 31 januari (härifrån).
echo "cc -o foo foo.c" | at 1145 jan 31
Puppet, Chef, CFEngine, Ansible-alla dessa DevOps-verktyg och födda och uppfödda på Unix-baserade system.