Hieronder wordt een set voorbeelden gegeven voor de wat meer gebruikelijke
shells. We beginnen met zsh aangezien het diverse mogelijkheden
biedt die onze taak er veel eenvoudiger op maken.
We zullen vervolgens steeds moeilijkere voorbeelden doorwerken.
In alle voorbeelden testen we de omgevingsvariabele $TERM
om er zeker van te zijn dat we de escapes alleen toepassen op xterms.
We testen op $TERM=xterm*; het jokerteken wordt gebruikt omdat
een aantal varianten (zoals rxvt) deze omgevingsvariabele in kan
stellen op $TERM=xterm-color.
We zouden een extra opmerking over C-shellafgeleiden, zoals
tcsh en csh moeten maken. In C shells, worden
ongedefinieerde variabelen als fatale fouten beschouwd.
Daarom is het nodig voor het testen van de variabele $TERM,
te testen op het bestaan ervan. Om dit te bereiken moet je de voorbeelden
hieronder wijzigen in zoiets als:
if ($?TERM) then
...
endif
(Wij vinden dit één van de vele redenen om geen gebruik te
maken van C-shells. Zie
Csh Programming Considered Harmful voor een
nuttige bespreking).
De voorbeelden hierna zouden kunnen worden gebruikt door ze te plaatsen
in het van toepassing zijnde shell-initialisatiebestand; d.w.z.
één die bij het opstarten door interactieve shells wordt
ingelezen. In de meeste gevallen heeft deze een naam zoals in
.shellrc (b.v. .zshrc, .tcshrc, enz).
zsh biedt de volgende functies en uitbreidingen, waar
we gebruik van zullen maken:
precmd () een functie die vóór iedere prompt wordt uitgevoerd
chpwd () een functie die wordt uitgevoerd wanneer de directory wijzigt
\e escape sequence voor escape (ESC)
\a escape sequence voor bell (BEL)
%n extraheert naar $USERNAME
%m extraheert naar hostnaam tot aan de eerste '.'
%~ extraheert naar directory, $HOME wordt vervangen door '~'
Er zijn nog heel wat meer uitbreidingen beschikbaar: zie de
zshmisc man page.
Dus het volgende zal de xterm titel instellen op
"gebruikersnaam@hostnaam: directory":
case $TERM in
xterm*)
precmd () {print -Pn "\e]0;%n@%m: %~\a"}
;;
esac
Dit zou ook bewerkstelligd kunnen worden door gebruik te maken van
chpwd() in plaats van precmd().
De ingebouwde opdracht print werkt net als
echo, maar geeft ons ook nog eens toegang tot de %
prompt escapes.
tcsh heeft een aantal functies en uitbreidingen die vergelijkbaar
zijn met die van zsh:
precmd () een functie die voor iedere prompt wordt uitgevoerd
cwdcmd () een functie die wordt uitgevoerd wanneer de directory wijzigt
%n extraheert naar gebruikersnaam
%m extraheert naar hostnaam
%~ extraheert naar directory, $HOME wordt vervangen door '~'
%# breidt uit naar '>' voor gewone gebruikers, '#' voor
%root-gebruikers
%{...%} voegt een string in als een letterlijke escape sequence
Helaas is er geen equivalente voor de opdracht print van zsh
die het ons toestaat prompt escapes in de titelstring te gebruiken,
dus het beste wat we kunnen doen is gebruik te maken van
shellvariabelen (in ~/.tcshrc):
switch ($TERM)
case "xterm*":
alias precmd 'echo -n "\033]0;${HOST}:$cwd\007"'
breaksw
endsw
Hierdoor krijg je echter het volledige pad van de directory in plaats
dat er gebruik wordt gemaakt van ~.
In plaats daarvan kun je de string in de prompt plaatsen:
switch ($TERM)
case "xterm*":
set prompt="%{\033]0;%n@%m:%~\007%}tcsh%# "
breaksw
default:
set prompt="tcsh%# "
breaksw
endsw
hiermee wordt de prompt ingesteld op "tcsh% ", en een xterm-titel
en ikoon "gebruikersnaam@hostnaam: directory". Houd in de gaten dat de "%{...%}" tussen escape sequences
moet worden geplaatst (en niet het laatste item in de prompt kan zijn:
zie de manpage van tcsh voor details).
bash voorziet in de variabele $PROMPT_COMMAND waaraan
de opdracht is toegekend welke vóór de weergave van de
prompt wordt uitgevoerd. Dit voorbeeld stelt de titel in op
gebruikersnaam@hostnaam: directory:
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
\033 is hier de tekencode voor ESC,
en \007 voor BEL.
De aanhalingstekens zijn hier belangrijk: variabelen worden geëxtraheerd
naar "...", en niet naar '...'.
Dus$PROMPT_COMMAND wordt op een niet geëxtraheerde waarde
ingesteld, en de variabelen binnen de "..." worden geëxtraheerd
wanneer $PROMPT_COMMAND wordt gebruikt.
$PWD produceert echter het volledige pad van de directory.
Als we de verkorte vorm
~ willen, moet we de escape string in de prompt opnemen,
wat maakt dat we voordeel kunnen hebben van de door in de shell voorziene
uitbreidingen op de prompt:
\u extraheert naar $USERNAME
\h extraheert naar hostnaam tot aan de eerste '.'
\w extraheert naar directory, $HOME wordt vervangen door '~'
\$ extraheert voor gewone gebruikers naar '$', '#' voor root
\[...\] sluit een reeks in met niet afdrukbare tekens
Dus het volgende produceert een prompt bash$ , en een xterm
titel gebruikersnaam@hostnaam: directory:
case $TERM in
xterm*)
PS1="\[\033]0;\u@\h: \w\007\]bash\\$ "
;;
*)
PS1="bash\\$ "
;;
esac
Let op het gebruik van \[...\], waarmee aan bash wordt
aangegeven de niet afdrukbare controletekens te negeren, wanneer de breedte
van de prompt wordt berekend. Anders onstaat er verwarring bij het plaatsen
van de cursor bij regelediting opdrachten.
ksh voorziet in weinig functies en uitbreidingen, dus moeten
we de escapestring in de prompt voegen, om het dynamisch te laten
bijwerken. Dit voorbeeld produceert een titel met
gebruikersnaam@hostnaam: directory en een prompt ksh$ .
case $TERM in
xterm*)
HOST=`hostname`
PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
;;
*)
PS1='ksh$ '
;;
esac
$PWD produceert echter het volledige pad van de directory.
We kunnen het voorvoegsel
$HOME/ van de directory verwijderen door gebruik te maken van
de constructie ${...##...}.
We kunnen ook gebruik maken van ${...%%...} om de hostnaaam
af te kappen:
HOST=`hostname`
HOST=${HOST%%.*}
PS1='^[]0;${USER}@${HOST}: ${PWD##${HOME}/}^Gksh$ '
De ^[ en ^G in de promptstring zijn enkele tekens voor
ESC en BEL (kan in emacs door het invoeren
van C-q ESC en C-q C-g).
Dit is in csh inderdaad erg moeilijk, en we komen ongeveer hierop
uit:
switch ($TERM)
case "xterm*":
set host=`hostname`
alias cd 'cd \!*; echo -n "^[]0;${user}@${host}: ${cwd}^Gcsh% "'
breaksw
default:
set prompt='csh% '
breaksw
endsw
waarbij we een alias voor de opdracht cd opdracht gebruiken om
de escape sequence te sturen.
De ^[ en ^G in de string zijn enkele tekens voor
ESC en BEL
(kunnen in emacs worden ingevoerd met C-q ESC en C-q C-g).
Opmerkingen: op een aantal systemen kan hostname -s worden
gebruikt om een afgekorte versie, in plaats van de fully-qualified
hostnaam te verkrijgen. Een aantal gebruikers met symlinked directory's
bemerken mogelijk dat `pwd` (achterwaartse aanhalingstekens voor
het uitvoeren van de opdracht pwd) een accurater pad teruggeeft dan
$pwd.