Kommandon och operatorer för Bash

Slutförd

Varje gränssnittsspråk har kommandon som används ofta. Nu ska vi börja bygga din Bash-repertoar genom att undersöka de vanligaste kommandona.

Bash-kommandon

Vi tittar på vanliga Bash-kommandon och hur de används.

ls kommando`

ls visar en lista med innehållet i den aktuella katalogen eller den katalog som anges i ett argument till kommandot. Ensamt visar kommandot en lista över filer och kataloger i den aktuella katalogen:

ls

Filer och kataloger vars namn börjar med en punkt döljs som standard. Om du vill inkludera dessa objekt i en kataloglista använder du flaggan -a:

ls -a

Om du vill få ännu mer information om filerna och katalogerna i den aktuella katalogen använder du flaggan -l:

ls -l

Här är några exempel på utdata från en katalog som innehåller några JPEG och PNG samt en underkatalog med namnet gifs:

-rw-rw-r-- 1 azureuser azureuser  473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser  473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser  423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser    4096 Jun 13 20:16 gifs

Varje rad innehåller detaljerad information om motsvarande fil eller katalog. Informationen omfattar de behörigheter som tilldelats till filen eller katalogen, ägare, storlek i byte, senaste gången den ändrades samt namnet.

cat kommando`

Anta att du vill se vad som finns i en fil. Du kan använda kommandot cat för att ta reda på det. Utdata blir dock inte särskilt begripliga såvida filen inte är en textfil. Följande kommando visar innehållet i filen os-release, som lagras i katalogen /etc:

cat /etc/os-release

Det här är ett användbart kommando eftersom det visar vilken Linux-distribution du kör:

NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Katalogen /etc är av särskild betydelse i Linux. Den innehåller filer för systemkonfigurationen. Du bör inte ta bort några filer från den här katalogen såvida du inte vet vad du gör.

sudo kommando`

Vissa Bash-kommandon kan bara köras av rotanvändaren. en systemadministratör eller superanvändare. Om du provar något av dessa kommandon utan behörighet misslyckas det. Till exempel kan endast användare som är inloggade som superanvändare använda cat för att visa innehållet i /etc/at.deny:

cat /etc/at.deny

at.deny är en särskild fil som avgör vem som kan använda andra Bash-kommandon för att skicka jobb för senare körning.

Du vill inte köra som rot för det mesta. Det är för farligt. Om du vill köra kommandon som kräver administratörsprivilegier utan att logga in som en superanvändare, kommer du att förorda kommandona med sudo:

sudo cat /etc/at.deny

sudo står för "superuser do". När du använder det berättar du för gränssnittet att för det här kommandot agerar du med behörighetsnivån root-user.

Kommandona cd, mkdir och rmdir

cd står för "change directory" (ändra katalog) och gör det namnet antyder: ändrar den aktuella katalogen till en annan katalog. Det gör att du kan gå från en katalog till en annan precis som motsvarigheten i Windows. Följande kommando går till en underkatalog i den aktuella katalogen med namnet orders:

cd orders

Du kan gå en katalog uppåt genom att ange .. som katalognamn:

cd ..

Det här kommandot ändras till din hemkatalog. den som du landar i när du först loggar in:

cd ~

Du kan skapa kataloger med hjälp av kommandot mkdir. Följande kommando skapar en underkatalog som heter orders i den aktuella arbetskatalogen:

mkdir orders

Om du vill skapa en underkatalog och en annan underkatalog under den med ett enda kommando använder du flaggan --parents:

mkdir --parents orders/2019

Kommandot rmdir tar bort (tar bort) en katalog, men bara om den är tom. Om den inte är tom får du en varning i stället. Som tur är kan du använda rm kommandot för att ta bort kataloger som inte är tomma i kombination med -r flaggan (rekursiv). Kommandot skulle då se ut så här, rm -r.

rm kommando`

Kommandot rm är en förkortning av "remove". Som förväntat rm tar bort filer. Det här kommandot gör processen kort med 0001.jpg:

rm 0001.jpg

Och det här kommandot tar bort alla filer i den aktuella katalogen:

rm *

Var försiktig med rm. Det är ett riskabelt kommando.

Genom att köra rm med flaggan -i kan du tänka efter innan du tar bort:

rm -i *

Gör det till en vana att inkludera -i i varje rm-kommando så undviker du förhoppningsvis en av de största fallgroparna i Linux. Det fruktade kommandot rm -rf / tar bort alla filer från en hel enhet. Det fungerar genom att rekursivt ta bort alla underkataloger för root och deras underkataloger. Flaggan -f (för "force", tvinga) gör problemet värre genom att blockera prompter. Gör inte detta.

Om du vill ta bort en underkatalog som heter orders och som inte är tom kan du använda kommandot rm så här:

rm -r orders

Detta tar bort underkatalogen orders och allt innehåll i den, inklusive andra underkataloger.

cp kommando`

Kommandot cp kopierar inte bara filer, utan hela kataloger (och underkataloger) om du vill. Om du vill göra en kopia av 0001.jpg med namnet 0002.jpg använder du följande kommando:

cp 0001.jpg 0002.jpg

Om 0002.jpg redan finns ersätter Bash den automatiskt. Det är utmärkt om det var vad du ville göra, men inte helt optimalt om du inte insåg att du höll på att skriva över den gamla versionen.

Lyckligtvis kan du använda flaggan -i (för "interaktiv") för att bli varnad av Bash innan du tar bort befintliga filer. Det här är säkrare:

cp -i 0001.jpg 0002.jpg

Du kan använda jokertecken för att kopiera flera filer samtidigt. Gör så här om du vill kopiera alla filer i den aktuella katalogen till en underkatalog som heter photos:

cp * photos

Gör så här om du vill kopiera alla filer i en underkatalog som heter photos till en underkatalog som heter images:

cp photos/* images

Detta förutsätter att katalogen images redan finns. Om den inte gör det kan du skapa den och kopiera innehållet i katalogen photos med hjälp av det här kommandot:

cp -r photos images

Står -r för "rekursiv". En extra fördel med -r flaggan är att om foton innehåller egna underkataloger kopieras även de till avbildningskatalogen.

ps kommando`

Kommandot ps visar en ögonblicksbild av alla processer som körs för närvarande. I sig själv, utan argument, visas alla dina gränssnittsprocesser. med andra ord, inte mycket. Annat blir det om du inkluderar flaggan -e:

ps -e

-e visar en lista över alla processer som körs, och det finns vanligtvis många sådana.

Om du vill ha en mer omfattande titt på vilka processer som körs i systemet använder du flaggan -ef:

ps -ef 

Den här flaggan visar namnen på alla processer som körs, deras processidentifieringsnummer (PID), PID för deras överordnade processer (PPID) samt när de började (STIME). Den visar även vilken terminal de är anslutna till (TTY) om det är tillämpligt, hur mycket CPU-tid de har använt (TIME) samt deras fullständiga sökvägsnamn. Här är ett förkortat exempel:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 13:35 ?        00:00:03 /sbin/init
root          2      0  0 13:35 ?        00:00:00 [kthreadd]
root          3      2  0 13:35 ?        00:00:00 [rcu_gp]
root          4      2  0 13:35 ?        00:00:00 [rcu_par_gp]
root          5      2  0 13:35 ?        00:00:00 [kworker/0:0-cgr]
root          6      2  0 13:35 ?        00:00:00 [kworker/0:0H-kb]
root          8      2  0 13:35 ?        00:00:00 [mm_percpu_wq]
root          9      2  0 13:35 ?        00:00:01 [ksoftirqd/0]
root         10      2  0 13:35 ?        00:00:02 [rcu_sched]

Ibland hittar du kanske dokumentation som visar att ps används på det här sättet:

ps aux

ps aux och ps -ef är desamma. Denna dualitet härrör från historiska skillnader mellan POSIX Unix-system (som Linux tillhör) och BSD Unix-system (varav det vanligaste är macOS). I början använde POSIX -ef medan BSD krävde aux. I dag accepterar båda de båda operativsystemsfamiljerna ettdera formatet.

Det här är en bra illustration av varför du bör titta närmare på manualen för alla Linux-kommandon. Att lära sig Bash är som att lära sig engelska som andraspråk. Det finns många undantag till reglerna.

w kommando`

Användare kommer och går, och ibland kommer det användare som inte ska vara i systemet. När en anställd lämnar för att söka andra möjligheter uppmanas sysadmin att se till att arbetaren inte längre kan logga in på företagets datorsystem. Sysadmins förväntas också veta vem som är inloggad och vem som inte ska vara det.

Linux har kommandot w (för "who", vem) som kan användas för att ta reda på vem som är inne på servrarna. Det visar information om de användare som är inne på datorsystemet samt dessa användares aktiviteter. w visar användarnamn, deras IP-adresser, när de loggade in, vilka processer som körs för närvarande samt hur lång tid dessa processer förbrukar. Det är ett värdefullt verktyg för systemadministratörer.

I/O-operatorer för Bash

Du kan få mycket gjort i Linux med bara Bash-kommandon och deras många alternativ. Men du kan utföra ännu mer genom att kombinera kommandon med hjälp av I/O-operatorer:

  • < för omdirigering av indata till en annan källa än tangentbordet
  • > för omdirigering av utdata till ett annat mål än skärmen
  • >> för att göra samma sak men med tillägg i stället för överskrivning
  • | för att skicka utdata från ett kommando till indata för ett annat

Anta att du vill visa allting i den aktuella katalogen men registrera utdata i en fil som heter listing.txt. Följande kommando gör precis det:

ls > listing.txt

Om listing.txt redan finns skrivs den över. Om du i stället använder operatorn >> läggs utdata från ls till i det som redan finns i listing.txt:

ls >> listing.txt

Röroperatören är kraftfull (och används ofta). Den omdirigerar utdata från det första kommandot till indata för det andra kommandot. Anta att du använder cat för att visa innehållet i en stor fil, men innehållet rullas förbi för snabbt för att du ska kunna läsa det. Du kan göra utdata mer hanterbara genom att skicka resultatet till ett annat kommando, till exempel more. Följande kommando visar alla processer som körs för tillfället. Men när skärmen är full pausas utdata tills du väljer Retur för att visa nästa rad:

ps -ef | more

Du kan även skicka utdata till head om du bara vill se de första raderna:

ps -ef | head

Eller anta att du vill filtrera utdata så att de endast innehåller de rader som innehåller ordet "daemon". Ett sätt att göra det är genom att skicka utdata från ps till Linux användbara grep verktyg:

ps -ef | grep daemon

Utdata kan se ut så här:

azureus+  52463  50702  0 23:28 pts/0    00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root        449      1  0 13:35 ?        00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root        988      1  0 13:35 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+   1002      1  0 13:35 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     1035      1  0 13:35 ?        00:00:00 /usr/sbin/atd -f
root       1037      1  0 13:35 ?        00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root       1039      1  0 13:35 ?        00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+  52477  50702  0 23:28 pts/0    00:00:00 grep --color=auto daemon

Du kan även använda filer som indata. Som standard kommer indata från tangentbordet, men även dessa kan omdirigeras. Om du vill hämta indata från en fil i stället för tangentbordet använder du operatorn <. En vanlig uppgift för systemadministratörer är att sortera innehållet i en fil. Som namnet föreslår sorterar sort text i alfabetisk ordning:

sort < file.txt

Om du vill spara det sorterade resultatet till en ny fil kan du omdirigera indata och utdata:

sort < file.txt > sorted_file.txt

Du kan använda I/O-operatorer för att kedja Linux-kommandon vid behov. Ta följande kommando som exempel:

cat file.txt | fmt | pr | lpr

Utdata från cat går till fmt, utdata från fmt går till pr och så vidare. fmt formaterar resultatet till ett prydligt stycke. pr sidbryter resultatet. Och lpr skickar sidbrutna utdata till skrivaren. Alla på en enda rad!