Verder Terug Inhoud

11. Prompt Code Fragmenten

Deze sectie toont hoe diverse stukjes informatie in de Bash-prompt kunnen worden gezet. Er zijn oneindig veel dingen die in je prompt gezet zouden kunnen worden. Stuur me gerust wat voorbeelden op. Ik zal datgene waarvan ik denk dat ze het meest zullen worden gebruikt, proberen in te voegen. Als je een alternatieve manier hebt om wat van de informatie hier, op te halen, en je het gevoel hebt dat jouw methode efficiënter is, neem dan alsjeblieft contact met me op. Het is heel makkelijk slechte code te schrijven. Ik doe dit vaak, maar het is geweldig om elegante code te schrijven, en een plezier het te lezen. Ik krijg het zo af en toe voor elkaar en zou het bijzonder prettig vinden er hiervan meer in te plaatsen.

Om shell-code in prompts op te nemen, moet er gebruik worden gemaakt van escape-tekens. Meestal betekent dit dat het tussen \$(<commando>) moet worden geplaatst, zodat de uitvoer van het commando iedere keer dat de prompt wordt gegenereerd, wordt gesubstitueerd.

11.1 Ingebouwde Escape Sequences

Zie Bash Prompt Escape Sequences voor een volledige lijst met ingebouwde escape sequences. Deze lijst is rechtsstreeks afkomstig uit de man page van Bash, dus je zou ook daarin kunnen kijken.

11.2 Datum en Tijd

Mocht je de interne commando's date en time niet prettig vinden, het extraheren van de informatie vanuit het date commando is relatief eenvoudig. Voorbeelden die reeds in deze HOWTO te zien waren, zijn date +%H%M, die het uur in 24-uurs formaat zet, en de minuut. date "+%A, %d %B %Y" geeft je iets als "Sunday, 06 June 1999". Typ date --help of man date voor een volledige lijst met geïnterpreteerde reeksen.

11.3 Tellen van Bestanden in de Huidige Directory

Om vast te stellen hoeveel bestanden er zich in de huidige directory bevinden, plaats je er ls -l | wc -l in. Dit maakt gebruik van wc (wordcount) om het aantal regels (-l) van de uitvoer van ls -l te tellen. Bestanden die met een punt beginnen worden niet meegeteld. Als je alleen de bestanden wilt meetellen en de symbolische links hierin NIET op wilt nemen (gewoon een voorbeeld hoe je het anders zou kunnen doen), zou je gebruik kunnen maken van ls -l | grep -v ^l | wc -l. Hier controleert grep iedere regel op een beginnende "l" (wat een link aangeeft) en verwerpt die regel (-v).

11.4 Totaal aantal Bytes in de Huidige Directory

Als je wilt weten hoeveel ruimte de inhoud van de huidige directory in beslag neemt, kun je iets als wat volgt gebruiken:


# Het commando sed vervangt alle spaties door slechts één spatie.
# cut -d" " -f5 : -d stelt een scheidingsteken vast, wat betekent dat (in dit
# geval) een spatie een nieuwe kolom begint.
# -f geeft aan dat een bepaalde kolom eruit moet worden genomen, wat in dit
# geval de vijfde kolom is

let TotalBytes=0

for Bytes in $(ls -l | grep "^-" | sed -e "s/ \+/ /g" | cut -d" " -f5)
do
   let TotalBytes=$TotalBytes+$Bytes
done

# De if...fi's geeft een specifieker uitvoer in byte, kilobyte, megabyte, 
# en gigabyte

if [ $TotalBytes -lt 1024 ]; then
   TotalSize=$(echo -e "scale=3 \n$TotalBytes \nquit" | bc)
else if [ $TotalBytes -lt 1048576 ]; then
   TotalSize=$(echo -e "scale=3 \n$TotalBytes/1024 \nquit" | bc)
else if [ $TotalBytes -lt 1073741824 ]; then
   TotalSize=$(echo -e "scale=3 \n$TotalBytes/1048576 \nquit" | bc)
else
   TotalSize=$(echo -e "scale=3 \n$TotalBytes/1073741824 \nquit" | bc)
fi
fi
fi

De code dankzij de welwillendheid van Sam Schmit (id@pt.lu) en zijn oom Jean-Paul, die een tamelijk belangrijke bug in mijn originele code glad streken, en het in het algemeen opschoonden.

11.5 Controleren op Huidige TTY

Het tty commando retourneert de bestandsnaam van de terminal die is verbonden met de standaardinvoer. Dit is er in twee formaten op de Linux systemen die ik heb gebruikt, óf "/dev/tty4" óf "/dev/pts/2". Ik ben hier een meer algemene oplossing voor gaan gebruiken: tty | sed -e "s:/dev/::", waarmee de voorafgaande "/dev/" wordt verwijderd. Oudere systemen (in mijn ervaring, tot aan RedHat 5.2) retourneerden alleen bestandnamen in het formaat "/dev/tty4", dus gebruikte ik tty | sed -e "s/.*tty\(.*\)/\1/".

Een alternatieve methode: ps aux | grep $$ | awk '{ print $7 }'.

11.6 Uitgestelde Job Telling

Om erachter te komen hoeveel uitgestelde taken je hebt, gebruik je jobs | wc -l | awk '{print $1}'. Overigens rekent awk spaties mee wat ruimte in een prompt verspilt. Als je netscape vanuit een xterm opstart, zal dat ook worden geteld. Als je dat wilt voorkomen en alleen gestopte jobs wilt tellen, gebruik je in plaats daarvan jobs -s. Typ help jobs voor meer informatie over jobs. jobs zal in Bash versie 2.02 nooit iets naar een pipe retourneren. Dit probleem is in geen enkele andere versie aanwezig.

11.7 Uptime en Load

Huidige load is afkomstig van het uptime commando. Wat ik thans gebruik is uptime | sed -e "s/.*load average: \(.*\...\), .*\..., .*\.../\1/" -e "s/ //g" wat extreem onhandig is, maar het werkt. Verbeteringen zijn welkom. uptime kan ook op vergelijkbare manier worden gebruikt om er achter te komen hoe lang de computer werkend is (vanzelfsprekend) en hoeveel gebruikers zijn ingelogd. De gegevens zouden kunnen worden verwerkt met sed om ze er uit te laten zien zoals je dat wilt.

11.8 Aantal Processen

ps ax | wc -l | tr -d " " OF ps ax | wc -l | awk '{print $1}' OF ps ax | wc -l | sed -e "s: ::g". In ieder geval, wordt tr of awk of sed gebruikt om de ongewenste spaties te verwijderen.

11.9 Beheren van de Breedte van $PWD

Unix staat lange bestandsnamen toe, wat er toe kan leiden dat de waarde van $PWD nogal lang wordt. Een aantal mensen (met name de standaard RedHat prompt) kozen ervoor de basename van de huidige werkdirectory te gebruiken (bv. "giles" als $PWD="/home/giles"). Ik wil graag wat meer informatie dan dat, maar het is vaak wenselijk de lengte van de directory binnen de perken te houden, en het is het meest zinvol aan de linkerkant af te kappen.


#   Hoeveel tekens van $PWD moeten bewaard blijven
local pwd_length=30
if [ $(echo -n $PWD | wc -c | tr -d " ") -gt $pwd_length ]
then
   newPWD="...$(echo -n $PWD | sed -e "s/.*\(.\{$pwd_length\}\)/\1/")"
else
   newPWD="$(echo -n $PWD)"
fi

De code hierboven kan worden uitgevoerd als onderdeel van PROMPT_COMMAND, en de gegenereerde omgevingsvariabele (newPWD) kan vervolgens in de prompt worden ingevoegd.

11.10 Laptop Power

Nogmaals, dit is niet elegant, maar het werkt (meestal). Als je een laptop hebt met daarop APM geïnstalleerd, probeer dan power=$(apm | sed -e "s/.*: \([1-9][0-9]*\)%/\1/" | tr -d " ") uitgevoerd vanaf PROMPT_COMMAND om een omgevingsvariabele aan te maken die je aan je prompt toe kunt voegen. Hiermee zal de resterende stroom worden weergegeven.

11.11 De Prompt Negeren bij Knippen en Plakken

Deze is vreemd maar gaaf. Rory Toma (rory@corp.webtv.net) schreef om een prompt als deze van de hand te doen : : rory@demon ; . Hoe is dit te gebruiken? Als je een commando achter de prompt typt (vreemd idee), dan kun je driemaal snel achtereen op die regel klikken (tenminste onder Linux) om de gehele regel op te lichten, en die regel dan voor een andere prompt plakken, en datgene tussen de ":" en de ":" en de """ wordt als volgt genegeerd:


: rory@demon ; uptime
  5:15pm  up 6 days, 23:04,  2 users,  load average: 0.00, 0.00, 0.00
: rory@demon ; : rory@demon ; uptime
  5:15pm  up 6 days, 23:04,  2 users,  load average: 0.00, 0.00, 0.00

Als PS2 op een spatie is ingesteld, kunnen bovendien meerdere regels worden geknipt en geplakt.

11.12 Het Apart Instellen van de Venstertitel en Ikoon-titel

Een suggestie van Charles Lepple (clepple@negativezero.org) over het apart instellen van de venstertitel van Xterm en de titel van het overeenkomstige ikoon. (kijk eerst in de eerdere sectie Xterm Titelbalk Manipulaties). Hij gebruikt dit onder WindowMaker omdat de titel die geschikt is voor een Xterm gewoonlijk te lang is voor een 64x64 ikoon. "\[\e]1;icon-title\007\e]2;main-title\007\]". Hij zegt dit in het prompt-commando in te stellen, omdat "Ik probeerde de string in PS1 te plaatsen, maar het veroorzaakte onder een aantal window managers geflikker omdat het resulteert in het meerdere malen instellen van de prompt wanneer je een uit meerdere regels bestaand commando gebruikt. (tenminste onder bash 1.4.x -- en ik was te lui om volledig uit te zoeken wat de redenen hiervoor waren)." Ik had er in de PS1-string geen problemen mee, maar maakte geen gebruik van uit meerdere regels bestaande commando's. Hij wees me er ook op dat het onder xterm, xwsh, en dtterm werkt, maar niet met de gnome-terminal (welke slechts gebruik maakt van de hoofdtitel). Ik kwam erachter dat het ook met rxvt werkte, maar niet met kterm.


Verder Terug Inhoud