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.
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.
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.
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).
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.
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 }'
.
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.
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.
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.
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.
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.
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.
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.