Bash-opdrachten en -operators

Voltooid

Elke shell-taal heeft enkele opdrachten die het vaakst worden gebruikt. Laten we beginnen met uw Bash-repertoire op te bouwen door de meestgebruikte opdrachten te bekijken.

Bash-opdrachten

Laten we eens kijken naar veelgebruikte Bash-opdrachten en hoe ze kunnen worden gebruikt.

ls opdracht

ls geeft een lijst weer van de inhoud van de huidige directory of de directory die wordt opgegeven in een argument van de opdracht. Op zichzelf worden de bestanden en directory's in de huidige directory weergegeven:

ls

Bestanden en directory's waarvan de naam met een punt begint, worden standaard verborgen. Als u deze items wilt opnemen in een lijst met directory's, gebruikt u de vlag -a:

ls -a

Als u nog meer informatie over de bestanden en directory's in de huidige directory wilt krijgen, gebruikt u de vlag -l:

ls -l

Hier volgt een voorbeeld van de uitvoer van een directory die een aantal JPEG's -en PNG's en een subdirectory met de naam gifs bevat:

-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

Elke regel bevat gedetailleerde informatie over het betreffende bestand of de betreffende directory. Deze informatie bevat de machtigingen die eraan zijn toegewezen, de eigenaar, de grootte in bytes, de laatste keer dat het bestand of de directory is gewijzigd, en de naam van het bestand of de directory.

cat opdracht

Stel dat u wilt zien wat er in een bestand zit. U kunt hiervoor de opdracht cat gebruiken. De uitvoer zal er niet erg zinnig uitzien, tenzij het een tekstbestand betreft. Met de volgende opdracht wordt de inhoud weergegeven van het bestand os-release dat zich in de directory /etc bevindt:

cat /etc/os-release

Dit is een nuttige opdracht, omdat u hiermee kunt zien welke Linux-distributie u gebruikt:

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

De directory /etc is een speciale directory in Linux. Deze directory bevat systeemconfiguratiebestanden. Verwijder geen bestanden uit deze directory, tenzij u weet wat u doet.

sudo opdracht

Sommige Bash-opdrachten kunnen alleen worden uitgevoerd door de hoofdgebruiker; een systeembeheerder of superuser. Als u een van deze opdrachten probeert uit te voeren zonder voldoende bevoegdheden, mislukt de bewerking. Alleen gebruikers die zijn aangemeld als superuser kunnen bijvoorbeeld cat gebruiken om de inhoud van /etc/at.denyweer te geven:

cat /etc/at.deny

at.deny is een speciaal bestand dat bepaalt wie andere Bash-opdrachten kan gebruiken om taken in te dienen voor latere uitvoering.

U wilt meestal niet als hoofdmap uitvoeren; Het is te gevaarlijk. Als u opdrachten wilt uitvoeren waarvoor beheerdersbevoegdheden zijn vereist zonder u aan te melden als supergebruiker, voert u de opdrachten voor met sudo:

sudo cat /etc/at.deny

sudo staat voor 'superuser do'. Wanneer u deze gebruikt, vertelt u de shell dat u voor deze ene opdracht werkt met het machtigingsniveau van de hoofdgebruiker.

De opdrachten cd, mkdir en rmdir

cd staat voor 'change directory' (directory wijzigen), en doet wat de naam aangeeft: de huidige directory wordt gewijzigd in een andere directory. Hiermee kunt u van de ene directory naar de andere gaan, net als met zijn tegenhanger in Windows. Met de volgende opdracht gaat u naar een subdirectory van de huidige directory met de naam orders:

cd orders

U kunt een directory omhoog gaan door .. op te geven als de directorynaam:

cd ..

Met deze opdracht wordt de basismap gewijzigd; het exemplaar waarin u zich aanmeldt wanneer u zich voor het eerst aanmeldt:

cd ~

U kunt directory's maken met behulp van de opdracht mkdir. Met de volgende opdracht maakt u een subdirectory met de naam orders in de huidige werkdirectory:

mkdir orders

Als u met één opdracht een subdirectory en een andere subdirectory daaronder wilt maken, gebruikt u de vlag --parents:

mkdir --parents orders/2019

Met de rmdir opdracht wordt een map verwijderd (verwijderd), maar alleen als deze leeg is. Als deze niet leeg is, krijgt u in plaats daarvan een waarschuwing. Gelukkig kunt u de rm opdracht gebruiken om mappen te verwijderen die niet leeg zijn in combinatie met de -r vlag (recursief). De opdracht ziet er dan zo uit, rm -r.

rm opdracht

De rm opdracht staat voor 'verwijderen'. Zoals u zou verwachten, rm verwijdert u bestanden. Met deze opdracht wordt een eind gemaakt aan 0001.jpg:

rm 0001.jpg

En met deze opdracht worden alle bestanden in de huidige directory verwijderd:

rm *

Wees voorzichtig met rm. Het is een gevaarlijke opdracht.

Als u rm uitvoert met de vlag -i, krijgt u de kans om na te denken voor u iets verwijdert:

rm -i *

Wen u aan -i op te nemen in elke rm-opdracht; dan voorkomt u dat u het slachtoffer wordt van een van de grootste blunders in Linux. Met de gevreesde opdracht rm -rf / wordt elk bestand op een geheel station verwijderd. De opdracht werkt door alle subdirectory's van de hoofddirectory en de subdirectory's daarvan recursief te verwijderen. Met de vlag -f (voor forceren) wordt het probleem verergerd doordat prompts worden onderdrukt. Doe dit niet.

Als u een subdirectory met de naam orders die niet leeg is wilt verwijderen, kunt u de opdracht rm op deze manier gebruiken:

rm -r orders

Hiermee wordt de subdirectory orders en alles erin verwijderd, inclusief andere subdirectory's.

cp opdracht

Met de opdracht cp worden niet alleen bestanden, maar hele directory's (en subdirectory's) gekopieerd, als u dat wilt. Als u van 0001. jpg een kopie wilt maken met de naam 0002.jpg, gebruikt u deze opdracht:

cp 0001.jpg 0002.jpg

Als 0002.jpg al bestaat, wordt het stilzwijgend door Bash vervangen. Dat is prima als het is wat u bedoelde, maar niet zo leuk als u niet besefte dat het oude bestand zou worden overschreven.

Gelukkig kunt u de vlag -i (interactief) gebruiken om Bash een waarschuwing te laten geven voordat bestaande bestanden worden verwijderd. Dit is veiliger:

cp -i 0001.jpg 0002.jpg

U kunt jokertekens gebruiken om meerdere bestanden tegelijk te kopiëren. Als u alle bestanden in de huidige directory wilt kopiëren naar een subdirectory met de naam photos, doet u dit:

cp * photos

Als u alle bestanden in de subdirectory photos wilt kopiëren naar een subdirectory met de naam images, doet u dit:

cp photos/* images

Hierbij wordt ervan uitgegaan dat de directory images al bestaat. Als dat niet zo is, kunt u deze directory maken en de inhoud van de directory photos ernaar kopiëren met behulp van deze opdracht:

cp -r photos images

De -r staat voor 'recursief'. Een extra voordeel van de -r vlag is dat als foto's submappen van zichzelf bevatten, ze ook worden gekopieerd naar de map met afbeeldingen .

ps opdracht

De opdracht ps maakt een momentopname van alle processen die momenteel worden uitgevoerd. Op zichzelf, zonder argumenten, worden al uw shell-processen weergegeven; met andere woorden, niet veel. Het is echter een ander verhaal wanneer u de vlag -e toevoegt:

ps -e

Met -e wordt er een lijst weergegeven van alle actieve processen, en dat zijn er meestal veel.

Voor een uitgebreidere weergave van de processen die op het systeem worden uitgevoerd, gebruikt u de vlag -ef:

ps -ef 

Met deze vlag wordt weergegeven: de namen van alle actieve processen, hun procesidentificatienummers (PID's), de PID's van hun bovenliggende processen (PPID's) en wanneer ze zijn begonnen (STIME). Ook wordt weergegeven aan welke terminal (TTY) ze eventueel zijn gekoppeld, hoeveel CPU-tijd ze hebben verbruikt (TIME) en de volledige padnamen. Hier volgt een verkort voorbeeld:

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]

U kunt ook documentatie vinden waarin ps op deze manier wordt gebruikt:

ps aux

ps aux en ps -ef zijn hetzelfde. Deze dualiteit kan worden herleid tot historische verschillen tussen POSIX Unix-systemen (waarvan Linux er een is) en BSD Unix-systemen (waarvan macOS het meestvoorkomende is). In het begin gebruikte POSIX -ef, en BSD vereiste aux. Tegenwoordig accepteren beide besturingssysteemfamilies beide notaties.

Dit is een goede herinnering waarom u de handleiding voor alle Linux-opdrachten goed moet bekijken. Het leren van Bash lijkt op het leren van Engels. Er zijn veel uitzonderingen op de regels.

w opdracht

Gebruikers komen, gebruiker gaan, en soms krijgt u gebruikers die u helemaal niet wilt hebben. Wanneer een werknemer vertrekt om andere mogelijkheden te volgen, wordt de systeembeheerder opgeroepen om ervoor te zorgen dat de werknemer zich niet meer kan aanmelden bij de computersystemen van het bedrijf. Sysadmins zullen ook weten wie er is aangemeld en wie dat niet zou moeten zijn.

Om erachter te komen wie zich op uw servers bevinden, heeft Linux de opdracht w (voor wie). Hiermee wordt informatie weergegeven over de gebruikers die zich momenteel op het computersysteem bevinden en over hun activiteiten. Met w wordt weergegeven wat de gebruikersnamen zijn, hun IP-adressen, wanneer ze zijn aangemeld, welke processen ze momenteel uitvoeren en hoeveel tijd die processen verbruiken. Het is een waardevol hulpmiddel voor systeembeheerders.

I/O-operators van Bash

U kunt veel doen in Linux door gebruik te maken van Bash-opdrachten en de vele opties daarvan. Maar u kunt echt werk verzetten wanneer u opdrachten combineert met I/O-operators:

  • < voor het omleiden van invoer naar een andere bron dan het toetsenbord
  • > voor het omleiden van uitvoer naar een andere bestemming dan het scherm
  • >> om hetzelfde te doen, maar met toevoegen in plaats van overschrijven
  • | voor het doorsluizen van de uitvoer van de ene opdracht naar de invoer van een andere

Stel dat u een lijst wilt maken van alles in de huidige directory en de uitvoer vastleggen in een bestand met de naam listing.txt. Dat kunt u doen met de volgende opdracht:

ls > listing.txt

Als listing.txt al bestaat, wordt het overschreven. Als u in plaats daarvan de operator >> gebruikt, wordt de uitvoer van ls toegevoegd aan de reeds bestaande inhoud van listing.txt:

ls >> listing.txt

De leidingenoperator is krachtig (en vaak gebruikt). Deze operator sluist de uitvoer van de eerste opdracht door naar invoer van de tweede opdracht. Stel dat u cat gebruikt om de inhoud van een groot bestand weer te geven, maar de inhoud schuift te snel voorbij om te lezen. U kunt de uitvoer beter beheersbaar maken door de resultaten door te sluizen naar een andere opdracht, zoals more. Met de volgende opdracht wordt een lijst gemaakt van alle processen die momenteel worden uitgevoerd. Maar zodra het scherm vol is, wordt de uitvoer onderbroken totdat u Enter selecteert om de volgende regel weer te geven:

ps -ef | more

U kunt de uitvoer ook doorsluizen naar head om alleen de eerste paar regels te zien:

ps -ef | head

Of stel dat u de uitvoer wilt filteren om alleen de regels op te nemen die het woord 'daemon' bevatten. Een van de manieren om dit te doen, is door de uitvoer van het handige grep hulpprogramma van ps Linux door te voeren:

ps -ef | grep daemon

De uitvoer zou er zo uit kunnen zien:

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

U kunt ook bestanden gebruiken als invoer. Normaal gesproken komt de standaardinvoer van het toetsenbord, maar dit kan ook worden omgeleid. Als u invoer wilt krijgen uit een bestand in plaats van het toetsenbord, gebruikt u de operator <. Een veelvoorkomende systeembeheertaak is het sorteren van de inhoud van een bestand. Zoals de naam suggereert, wordt met sort tekst in alfabetische volgorde gesorteerd:

sort < file.txt

Als u de gesorteerde resultaten wilt opslaan in een nieuw bestand, kunt u invoer en uitvoer omleiden:

sort < file.txt > sorted_file.txt

U kunt I/O-operators gebruiken om Linux-opdrachten naar behoefte te koppelen. Kijk eens naar de volgende opdracht:

cat file.txt | fmt | pr | lpr

De uitvoer van cat gaat naar fmt, de uitvoer van fmt gaat naar pr, enzovoort. fmt maakt de resultaten op in een nette alinea. pr pagineert de resultaten. En lpr stuurt de gepagineerde uitvoer naar de printer. Allemaal met één regel!