Bash is een GNU-product, de "Bourne Again SHell" en afgeleid van de Bourne Shell. Op de meeste computers is het de standaard commandoregel-interface. Het munt uit in interactiviteit, ondersteunt het bewerken van de commandoregel, aanvullen en herroepen van commando's. Het biedt ook ondersteuning voor het configureren van prompts. De meeste mensen realiseren zich dit wel, maar weten niet hoeveel er mee kan worden gedaan.
De meeste Linux-systemen hebben een standaardprompt in één kleur (gewoonlijk grijs) welke je gebruikersnaam, de computernaam waarop je aan het werken bent en een indicatie van je huidige werkdirectory aangeeft. Dit is allemaal nuttige informatie, maar je kunt veel meer met de prompt. Alle soorten informatie kan worden getoond (tty-nummer, tijd, datum, load, aantal gebruikers, uptime ...) en de prompt kan gebruik maken van ANSI-kleuren, óf om het interessant te doen lijken, óf om bepaalde informatie er uit te laten springen. Ook de titelbalk van een Xterm kun je manipuleren om wat van deze informatie weer te geven.
Buiten dat het er gaaf uit ziet, is het vaak handig om systeeminformatie bij te houden. Een idee, waarvan ik weet dat het sommige mensen aanspreekt, is dat het mogelijk is om de prompt op verschillende computers in andere kleuren te laten verschijnen. Als je op verscheidene verschillende computers diverse Xterms open hebt, of je bent geneigd te vergeten op welke computer je aan het werk bent en de verkeerde bestanden verwijdert (of de server afsluit in plaats van het werkstation), zul je dit een geweldige manier vinden om je er aan te herinneren op welke computer je werkt.
Zelf vind ik het handig om informatie over mijn computer en werkomgeving continu beschikbaar te hebben. En ik hou van de uitdaging uit te zoeken hoe de maximale hoeveelheid aan gegevens in de kleinst mogelijke ruimte te plaatsen waarbij de leesbaarheid behouden blijft.
De weergave van de prompt wordt door de shell-variabele PS1 geregeld. Continuering van commando's wordt weergegeven door de PS2-string, welke op exact dezelfde wijze kan worden gewijzigd zoals hier besproken. Aangezien het beheren ervan exact hetzelfde is, en het niet zo "interessant" is, zal ik voornamelijk de PS1-string wijzigen. (Er zijn ook PS3- en PS4-strings. Deze worden door de gemiddelde gebruiker nooit opgemerkt. Zie de man page van Bash als je in hun doeleinden bent geïnteresseerd). Om de wijze hoe de prompt er uitziet te wijzigen, verander je de PS1-variabele. Je kunt de PS1-strings direct achter de prompt invoeren om ermee te experimenteren en de resultaten onmiddellijk te zien (dit heeft alleen effect op je huidige sessie en de wijzigingen worden ongedaan gemaakt als je uitlogt). Als je een blijvende wijziging van de prompt wilt, kijk dan in de sectie onder Permanent instellen van de PS?-Strings.
Voordat we gaan beginnen is het belangrijk er aan te denken, dat de PS1-string net als elke andere omgevingsvariabele in de omgeving is opgeslagen. Als je het achter de commandoregel wijzigt, zal je prompt veranderen. Voordat je enige veranderingen aanbrengt, kun je de huidige prompt in een andere omgevingsvariabele bewaren:
[giles@nikola giles]$ SAVE=$PS1
[giles@nikola giles]$
De eenvoudigste prompt zou uit een enkel teken kunnen bestaan, zoals:
[giles@nikola giles]$ PS1=$
$ls
bin mail
$
Door ze op de commandoregel in te voeren, wordt de beste manier getoond waarop je met basisprompts kunt experimenteren. Merk op dat de tekst die door de gebruiker werd ingetikt, onmiddellijk achter de prompt verschijnt. Ik geef de voorkeur aan het gebruik van:
$PS1="$ "
$ ls
bin mail
$
waardoor een spatie achter de prompt wordt geforceerd, wat het beter leesbaar maakt. Roep gewoon de variabele op die je hebt opgeslagen om de oorspronkelijke prompt te herstellen:
$ PS1=$SAVE
[giles@nikola giles]$
Er worden door de Bash-shell een heleboel escape sequences geboden om in de prompt in te voegen. Vanuit de man page van Bash 2.02:
Wanneer interactief uitgevoerd, toont bash de primaire prompt PS1 als
het gereed is een commando in te lezen, en de secundaire prompt PS2 als
het meer invoer nodig heeft om het commando te completeren.
Met Bash is het mogelijk deze prompt-strings te wijzigen door een aantal
speciale tekens beginnend met een escape-teken, de backslash, in te voegen,
die als volgt zijn gecodeerd:
\a een ASCII bell teken (07)
\d de datum in "Dag van de Week Maand Datum" formaat
(d.w.z., "Tue May 26")
\e een ASCII escape character (033)
\h de hostname tot aan de eerste `.'
\H de hostname
\n nieuwe regel
\r carriage return
\s de naam van de shell, de basename van $0
(het deel volgend na de laatste slash)
\t de huidige tijd in het 24-uurs HH:MM:SS formaat
\T de huidige tijd in het 12-uurs HH:MM:SS formaat
\@ de huidige tijd in 12-uurs am/pm formaat
\u de gebruikersnaam van de huidige gebruiker
\v de versie van bash (d.w.z. 2.00)
\V de release van bash, versie + patchlevel
(d.w.z. 2.00.0)
\w de huidige werkdirectory
\W de basename van de huidige werkdirectory
\! het historienummer van dit commando
\# het commandonummer van dit commando
\$ als de effectieve UID is 0, een #, anders een $
\nnn het teken corresponderend met het octale nummer nnn
\\ een backslash
\[ begin een reeks niet-afdrukbare tekens,
die kunnen worden gebruikt om een terminal besturingsreeks
in de prompt in te sluiten
\] eindig een reeks niet-afdrukbare tekens
Verder gaan bij waar we waren gebleven:
[giles@nikola giles]$ PS1="\u@\h \W> "
giles@nikola giles> ls
bin mail
giles@nikola giles>
Dit lijkt voor de meeste Linux-distributies op de standaard. Ik wilde dat het er iets anders uitzag, dus ik wijzigde dit in:
giles@nikola giles> PS1="[\t][\u@\h:\w]\$ "
[21:52:01][giles@nikola:~]$ ls
bin mail
[21:52:15][giles@nikola:~]$
Mensen en distributies plaatsen hun PS?-strings op verschillende locaties. De meest gebruikelijke locaties zijn /etc/profile, /etc/bashrc, ~/.bash_profile, en ~/.bashrc . Johan Kullstam ( johan19@idt.net) schrijft:
de PS1-string zou in .bashrc moeten worden ingesteld. Dit omdat niet-interactieve bash'es buiten hun boekje gaan door PS1 te unsetten. De man page van bash vertelt hoe de aanwezigheid of afwezigheid van PS1 een goede manier is om er achter te komen of men zich in een interactieve dan wel niet-interactieve (b.v. script) bash-sessie bevindt.
de manier waarop ik dit realiseerde is, dat startx een bash-script is. Dit betekent dat startx je prompt zal wissen. als je PS1 in .profile (of .bash_profile) instelt, op de console inlogt en X via startx opstart, wordt je PS1 in het proces gewist en blijf je achter met de standaardprompt.
één oplossing is xterms en rxvts met de -ls optie op te starten, om ze te dwingen .profile in te lezen. maar elke keer dat er een shell wordt aangeroepen via een niet-interactief shell-script gaat de tussenliggende PS1 verloren. system(3) gebruikt sh -c welke, indien sh bash is, PS1 zal killen. een betere manier is om de PS1 definitie in .bashrc te plaatsen. deze wordt iedere keer gelezen als bash start en is de plaats waarin interactieve zaken (bv PS1) zouden moeten staan.
daarom zou moeten worden benadrukt dat PS1=..blah.. in .bashrc behoort te staan en niet in .profile.
Ik probeerde het probleem dat hij uitlegde te herhalen en ik constateerde een ander probleem: mijn PROMPT_COMMAND variabele (welke later zal worden geïntroduceerd) was verdwenen. Mijn kennis op dit gebied is wat zwak, dus ik ga ervoor wat Johan zegt.