Kommandon och operatorer för Bash
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!