Hoe u uw bash-scripts hardwarebewust kunt maken

0
196

Het is moeilijk om scripts te schrijven die op verschillende Linux-computers kunnen worden uitgevoerd. Je kunt er niet van uitgaan dat ze dezelfde kenmerken zullen hebben. Met de opdracht getconf kunt u honderden besturingssysteem- en bestandssysteemwaarden controleren.

Hardware Aware Scripts

Als u ooit een script dat op verschillende Linux-machines moet draaien, heeft u misschien te maken gehad met het “Vreemd, het draait prima op mijn machine…” lastig. Kleine verschillen tussen computerarchitectuur, besturingssystemen en bestandssystemen op de doelcomputers kunnen ervoor zorgen dat uw scripts niet correct werken.

Als je scripts eenvoudig zijn en niets doen of proberen scharnieren te starten op compatibele hardware of bepaalde mogelijkheden van het bestandssysteem, dan heb je misschien nooit een probleem. Maar hoe ingewikkelder uw script wordt, des te kritischer zijn de details van de machine waarop het script draait. Het is ook vermeldenswaard dat op een enkele computer verschillende bestandssystemen kunnen worden geïnstalleerd, die op verschillende delen van de directorystructuur zijn geïnstalleerd. Omdat iets in de ene map werkt, wil dat nog niet zeggen dat het in een andere map op dezelfde manier zal werken.

Het getconf-commando kan rapporteren over letterlijk honderden verschillende besturingssysteem- en bestandssysteemkenmerken. Sommige hiervan hebben de vorm van waardeparen, waarbij de ene het systeemmaximum vasthoudt en de andere het minimum. Dit betekent dat je hardware- of bestandssysteemwaarden kunt testen om er zeker van te zijn dat je script dienovereenkomstig zal reageren.

Natuurlijk kan je script getconf niet gebruiken op de doelcomputer als het niet op die computer is geïnstalleerd. Alle distributies die werden getest bij het onderzoeken van dit artikel hadden getconf al geïnstalleerd, inclusief Ubuntu, Fedora en Manjaro. Interessant genoeg hadden ze ook allemaal dezelfde versie van getconf, versie 2.33.

Eerste stappen met het getconf-commando

Jij kan controleren of getconf op uw computer is geïnstalleerd en welke versie het is, door de optie –version te gebruiken.

getconf –version

Advertentie

Gebruik de -a om te zien over hoeveel items getconf kan rapporteren (alle) optie, en pijp deze door de wc-opdracht. Dit telt de regels, woorden en tekens in de uitvoer.

getconf -a | wc

Er zijn 320 regels in de uitvoer. Om de hele lijst op een overzichtelijke manier te zien, zullen we de uitvoer naar minder sturen.

getconf -a | less

Je kunt vooruit en achteruit scrollen naar de lijst om te zien wat getconf kan rapporteren.

Sommige items zijn duplicaten. Velen van hen kunnen worden aangeroepen met een kortere naam of met een langere POSIX-compatibele naam.

Rapporteren op enkele waarden

Om ervoor te zorgen dat getconf rapporteert over een enkele waarde, geeft u de naam van de waarde door aan getconf op de opdrachtregel. Merk op dat alle optienamen in hoofdletters zijn.

getconf LONG_BIT

Advertentie< br>

De optie LONG_BIT rapporteert of uw kernel en dus uw besturingssysteem 32-bits of 64-bits is. Er zijn geen andere parameters vereist voor deze opdracht, alleen de optie LONG_BIT zelf. Een andere eenvoudige waarde om over te rapporteren is LOGIN_NAME_MAX .

getconf LOGIN_NAME_MAX

Dat is een vreemd hoge maximale lengte voor een gebruikersnaam, maar het is waar. Als je echt een gebruikersaccount wilt maken met een belachelijk lange gebruikersnaam, dan zou dat kunnen. De hostnaam van deze computer heeft daarentegen een maximale lengte van 64 tekens:

getconf HOST_NAME_MAX

Gebruik de CHILD_MAX-optie om te zien hoeveel gelijktijdige processen een gebruikersaccount kan uitvoeren:

getconf CHILD_MAX

De OPEN_MAX-waarde geeft het maximale aantal bestanden terug dat een proces open kan hebben.

getconf OPEN_MAX

Om een ​​subset van de getconfvalues ​​te zien, kunnen we de -a (all) optie gebruiken om alle waarden te genereren, en grep gebruiken om degene uit te filteren waarin we geïnteresseerd zijn. Om bijvoorbeeld elke waarde te zien die & #8220;NAAM” gebruik in de titel:

getconf -a | grep NAME

Evenzo, om alle waarden met “GROUP' te zien 8221; gebruik in hun titel:

getconf -a | grep GROUP

Advertentie

Om de waarden te zien die “INT_” gebruik in hun titel:

getconf -a | grep _INT

Dit toont de maximale en minimale waarden die een integer-variabele kan bevatten op deze computer.

GERELATEERD: Zoeken met “grep” Strings in een bestand gebruiken

Getconf gebruiken met bestandssysteemwaarden

Wanneer u een van de opties gebruikt die betrekking hebben op bestandssysteemkenmerken, moet u getconf vertellen over welk bestandssysteem het moet rapporteren. U moet dit zelfs doen als u maar één harde schijf en één bestandssysteem erop hebt geïnstalleerd. Het getconf-commando neemt niets aan. Om aan te geven over welk bestandssysteem getconf moet rapporteren, moet u een pad naar een map in dat bestandssysteem opgeven.

Om de maximale lengte te zien voor een bestandsnaam voor het bestandssysteem dat aan de root van het bestand is gekoppeld systeemmapstructuur, typ:

getconf NAME_MAX/

Om het resultaat voor een ander bestandssysteem te zien, wijst u naar een map in het andere bestandssysteem. Zelfs als je geen verschillende bestandssystemen permanent in je directorystructuur hebt gemount, kun je merken dat er tijdelijk een ander bestandssysteem aan je directorystructuur is gekoppeld.

Dit is precies wat er gebeurt als je een USB-geheugenstick plaatst, zoals dit voorbeeld. De geheugenstick heet “PINK” en het is gemount op “/media/dave/.”

getconf NAME_MAX /media/dave/PINK/

Advertentie

We kunnen controleren welk bestandssysteem op de USB-geheugenstick staat door het df-commando te gebruiken om te zien op welk blokapparaat het is aangesloten. We gebruiken dan de opdracht lsblk met de optie -f (bestandssysteem).

df /media/dave/PINK lsblk -f /dev/sdb1

De geheugenstick is block device /dev/sdb1 en het bestandssysteem is FAT32. Dat is de reden waarom we verschillende resultaten krijgen voor twee mappen in dezelfde mappenboom. Ze bevinden zich in dezelfde directorystructuur, maar ze hebben verschillende onderliggende bestandssystemen.

GERELATEERD: Welk bestandssysteem moet ik gebruiken voor mijn USB-drive?< /strong>

Getconf gebruiken in scripts

We kunnen de uitvoer van getconf gemakkelijk opnemen in beslissingen in onze shell-scripts.

Als u bijvoorbeeld verschillende acties wilt uitvoeren, afhankelijk van of het script op een 32-bits of 64-bits besturingssysteem draait, kunt u een gedeelte van het script als dit gebruiken.

#!/bin/bash # are we on een 32- of 64-bits besturingssysteem? if [ $(getconf LONG_BIT) = “64” ] dan # 64 bit echo “64-bit machine.” else # 32-bits echo “32-bits machine.” fi

Het if-statement vergelijkt de uitvoer van het getconf LONG_BIT-commando met de waarde van “64.” Als ze overeenkomen, wordt de dan-clausule uitgevoerd, anders wordt de else-clausule uitgevoerd. U kunt versiespecifieke acties uitvoeren in de dan/elseclausules of variabelevlaggen instellen die elders in uw script kunnen worden gecontroleerd.

Kopieer de scripttekst naar een editor en sla uw bestand op als “hw -test.sh.” We zullen het script uitvoerbaar maken met het chmod commando en de -x (uitvoerbaar) optie.

chmod +x hw-test.sh

Advertentie

Wanneer we het script uitvoeren, vertelt het ons welke van de clausules zijn geactiveerd. Met deze techniek zou je elk van de getconf-waarden kunnen gebruiken om je script de juiste actie te laten ondernemen.

./hw-test.sh

Option Overkill

Het enorme aantal waarden waarover getconf kan rapporteren, kan overweldigend zijn. De man-pagina is verrassend kort. Als je verwacht dat het de opties opsomt en ze allemaal uitlegt, zul je teleurgesteld zijn.

Je zult enkele beschrijvingen vinden in de man-pagina's voor sysconf en confstr. Mogelijk moet u een paar tekens van de voorkant van de confstr-items afsnijden. Dit werkte bijvoorbeeld niet:

getconf _CS_GNU_LIBC_VERSION

maar dit wel:

getconf GNU_LIBC_VERSION

Je vindt ook enkele beschrijvingen in de “limieten. h” het dossier. Als u niet weet waar dat bestand zich op uw systeem bevindt, gebruik dan:

whereis limts.h

U kunt dan minder gebruiken om dat bestand te bekijken.