Bash-kommandoer og -operatorer
Alle shellsprog har de mest anvendte kommandoer. Lad os begynde at bygge dit Bash-repertoire ved at undersøge de mest anvendte kommandoer.
Bash-kommandoer
Lad os se på almindelige Bash-kommandoer, og hvordan du bruger dem.
kommandoen ls
ls
viser indholdet af den aktuelle mappe eller den mappe, der er angivet i et argument til kommandoen. I sig selv vises filerne og mapperne i den aktuelle mappe:
ls
Filer og mapper, hvis navne starter med et punktum, skjules som standard. Hvis du vil medtage disse elementer i en mappeliste, skal du bruge et -a
flag:
ls -a
Hvis du vil have endnu flere oplysninger om filerne og mapperne i den aktuelle mappe, skal du bruge et -l
flag:
ls -l
Her er et eksempel på output fra en mappe, der indeholder en håndfuld JPEGs og PNGs og en undermappe med navnet 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
Hver linje indeholder detaljerede oplysninger om den tilsvarende fil eller mappe. Disse oplysninger omfatter de tilladelser, der er tildelt den, dens ejer, dens størrelse i byte, sidste gang den blev ændret, og navnet på filen eller mappen.
kommandoen cat
Lad os antage, at du vil se, hvad der er i en fil. Det kan du bruge kommandoen cat
til. Outputtet giver ikke meget mening, medmindre filen er en tekstfil. Følgende kommando viser indholdet af den os-release-fil fil, der er gemt i mappen /etc:
cat /etc/os-release
Dette er en nyttig kommando, fordi den fortæller dig, hvilken Linux-distribution du kører:
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
Den /etc mappe er en særlig en i Linux. Den indeholder systemkonfigurationsfiler. Du vil ikke slette nogen filer fra denne mappe, medmindre du ved, hvad du foretager dig.
kommandoen sudo
Nogle Bash-kommandoer kan kun køres af rodbrugeren. en systemadministrator eller superbruger. Hvis du prøver en af disse kommandoer uden tilstrækkelige rettigheder, mislykkes det. Det er f.eks. kun brugere, der er logget på som superbruger, der kan bruge cat
til at få vist indholdet af /etc/at.deny:
cat /etc/at.deny
at.benægte er en særlig fil, der bestemmer, hvem der kan bruge andre Bash-kommandoer til at sende job til senere udførelse.
Du vil ikke køre som rod det meste af tiden. Det er for farligt. Hvis du vil køre kommandoer, der kræver administratorrettigheder uden at logge på som superbruger, skal du foranstille kommandoerne med sudo
:
sudo cat /etc/at.deny
sudo
står for "superbruger do". Når du bruger den, fortæller du shell'en, at for denne ene kommando handler du med rodbrugerens tilladelsesniveau.
kommandoerne cd
, mkdir
og rmdir
cd
står for "change directory", og det gør præcis, hvad navnet antyder: Det ændrer den aktuelle mappe til en anden mappe. Det giver dig mulighed for at flytte fra én mappe til en anden på samme måde som dens modpart i Windows. Følgende kommando ændres til en undermappe i den aktuelle mappe med navnet ordrer:
cd orders
Du kan flytte en mappe op ved at angive ..
som mappenavn:
cd ..
Denne kommando ændres til din hjemmemappe. den, du lander i, første gang du logger på:
cd ~
Du kan oprette mapper ved hjælp af kommandoen mkdir
. Følgende kommando opretter en undermappe med navnet ordrer, der i den aktuelle arbejdsmappe:
mkdir orders
Hvis du vil oprette en undermappe og en anden undermappe under den med én kommando, skal du bruge flaget --parents
:
mkdir --parents orders/2019
Kommandoen rmdir
sletter (fjerner) en mappe, men kun hvis den er tom. Hvis den ikke er tom, får du i stedet vist en advarsel. Heldigvis kan du bruge kommandoen rm
til at slette mapper, der ikke er tomme, sammen med flaget -r
(rekursiv). Kommandoen vil derefter se sådan ud, rm -r
.
kommandoen rm
Kommandoen rm
er en forkortelse for "remove". Som forventet sletter rm
filer. Så denne kommando sætter en stopper for 0001.jpg:
rm 0001.jpg
Og denne kommando sletter alle filerne i den aktuelle mappe:
rm *
Vær på vagt over for rm
. Det er en farlig kommando.
Når du kører rm
med et -i
flag, kan du tænke, før du sletter:
rm -i *
Gør det til en vane at inkludere -i
i hver rm
kommando, og du kan undgå at blive offer for en af Linux's største fadæser. Den frygtede rm -rf /
kommando sletter alle filer på et helt drev. Det fungerer ved rekursivt at slette alle rodens undermapper og deres undermapper. Flaget -f
(for "force") er med til at løse problemet ved at undertrykke prompter.
Gør det ikke.
Hvis du vil slette en undermappe med navnet ordrer, der ikke er tom, kan du bruge kommandoen rm
på følgende måde:
rm -r orders
Dette sletter de ordrer undermappe og alt i den, herunder andre undermapper.
kommandoen cp
Kommandoen cp
kopierer ikke kun filer, men hele mapper (og undermapper), hvis du vil. Hvis du vil oprette en kopi af 0001.jpg med navnet 0002.jpg, skal du bruge denne kommando:
cp 0001.jpg 0002.jpg
Hvis 0002.jpg allerede findes, erstatter Bash den uovervåget. Det er fantastisk, hvis det er, hvad du havde til hensigt, men ikke så vidunderligt, hvis du ikke var klar over du var ved at overskrive den gamle version.
Hvis du bruger flaget -i
(til "interaktiv"), advarer Bash dig heldigvis, før du sletter eksisterende filer. Dette er sikrere:
cp -i 0001.jpg 0002.jpg
Du kan bruge jokertegn til at kopiere flere filer på én gang. Hvis du vil kopiere alle filerne i den aktuelle mappe til en undermappe med navnet billeder, skal du gøre følgende:
cp * photos
Hvis du vil kopiere alle filerne i en undermappe med navnet fotos til en undermappe med navnet billeder, skal du gøre følgende:
cp photos/* images
Dette forudsætter, at de billeder mappe allerede findes. Hvis den ikke gør det, kan du oprette den og kopiere indholdet af fotos mappen ved hjælp af denne kommando:
cp -r photos images
-r
står for "rekursiv". En ekstra fordel ved -r
flag er, at hvis fotos indeholder sine egne undermapper, kopieres de også til de billeder mappe.
kommandoen ps
Kommandoen ps
giver dig et snapshot af alle de processer, der kører i øjeblikket. Uden argumenter viser den i sig selv alle dine shellprocesser. med andre ord, ikke meget. Men det er en anden historie, når du inkluderer et -e
flag:
ps -e
-e
lister alle kørende processer, og der er typisk mange af dem.
Hvis du vil have et mere omfattende indblik i, hvilke processer der kører i systemet, skal du bruge flaget -ef
:
ps -ef
Dette flag viser navnene på alle kørende processer, deres procesidentifikationsnumre (PID'er), pid'erne for deres forældre (PPID'er), og hvornår de begyndte (STIME). Den viser også, hvilken terminal de er knyttet til (TTY), hvor meget CPU-tid de har reoleret op (TIME) og deres fulde stinavne. Her er et forkortet eksempel:
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]
Som en sidebemærkning kan du finde dokumentation, der viser, ps
bruges på denne måde:
ps aux
ps aux
og ps -ef
er ens. Denne dualitet sporer tilbage til historiske forskelle mellem POSIX Unix-systemer (hvoraf Linux er et) og BSD Unix-systemer (hvoraf den mest almindelige er macOS). I starten brugte POSIX -ef
, mens BSD krævede aux
. I dag accepterer begge operativsystemfamilier begge formater.
Dette fungerer som en glimrende påmindelse om, hvorfor du bør se nærmere på manualen for alle Linux-kommandoer. At lære Bash er som at lære engelsk som andet sprog. Der er mange undtagelser fra reglerne.
kommandoen w
Brugerne kommer, brugerne går, og nogle gange får du brugere, du slet ikke ønsker. Når en medarbejder forlader virksomheden for at forfølge andre muligheder, opfordres sysadmin til at sikre, at arbejderen ikke længere kan logge på virksomhedens computersystemer. Sysadmins forventes også at vide, hvem der er logget på, og hvem der ikke skal være.
Linux leverer kommandoen w
(for "hvem") for at finde ud af, hvem der er på dine servere. Den viser oplysninger om de brugere, der i øjeblikket er på computersystemet, og disse brugeres aktiviteter.
w
viser brugernavne, deres IP-adresser, hvornår de loggede på, hvilke processer de kører i øjeblikket, og hvor meget tid disse processer bruger. Det er et værdifuldt værktøj til sysadmins.
Bash I/O-operatorer
Du kan gøre meget i Linux bare ved at udøve Bash kommandoer og deres mange muligheder. Men du kan virkelig få arbejdet fra hånden, når du kombinerer kommandoer ved hjælp af I/O-operatorer:
-
<
til omdirigering af input til en anden kilde end tastaturet -
>
til at omdirigere output til en anden destination end skærmen -
>>
for at gøre det samme, men ved at tilføje i stedet for at overskrive -
|
til rørføring af output fra én kommando til input fra en anden
Lad os antage, at du vil vise alt i den aktuelle mappe, men hente outputtet i en fil med navnet listing.txt. Følgende kommando gør netop det:
ls > listing.txt
Hvis listing.txt allerede findes, overskrives det. Hvis du i stedet bruger operatoren >>
, føjes outputtet fra ls
til det, der allerede findes i listing.txt:
ls >> listing.txt
Røroperatoren er effektiv (og bruges ofte). Den omdirigerer outputtet fra den første kommando til inputtet for den anden kommando. Lad os sige, at du bruger cat
til at få vist indholdet af en stor fil, men indholdet ruller for hurtigt, så du kan læse det. Du kan gøre outputtet mere overskueligt ved at sende resultaterne til en anden kommando, f.eks. more
. Følgende kommando viser alle de processer, der kører i øjeblikket. Men når skærmen er fuld, afbrydes outputtet midlertidigt, indtil du vælger Angiv for at få vist den næste linje:
ps -ef | more
Du kan også sende output til head
for kun at se de første flere linjer:
ps -ef | head
Eller lad os antage, at du vil filtrere outputtet, så det kun indeholder de linjer, der indeholder ordet "daemon". En måde at gøre det på er ved at sende outputtet fra ps
til Linux's nyttige grep
værktøj:
ps -ef | grep daemon
Outputtet kan se sådan ud:
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 også bruge filer som input. Standardinput kommer som standard fra tastaturet, men det kan også omdirigeres. Hvis du vil hente input fra en fil i stedet for tastaturet, skal du bruge operatoren <
. En almindelig sysadmin-opgave er at sortere indholdet af en fil. Som navnet antyder, sorterer sort
tekst i alfabetisk rækkefølge:
sort < file.txt
Hvis du vil gemme de sorterede resultater i en ny fil, kan du omdirigere input og output:
sort < file.txt > sorted_file.txt
Du kan bruge I/O-operatorer til at sammenkæde Linux-kommandoer efter behov. Overvej følgende kommando:
cat file.txt | fmt | pr | lpr
Outputtet fra cat
går til fmt
, outputtet fra fmt
går til pr
osv.
fmt
formaterer resultaterne i et ryddeligt afsnit.
pr
sideinddeler resultaterne. Og lpr
sender det sideinddelte output til printeren. Alt i en enkelt linje!