Bash-opdrachten en -operators
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!