Verder Terug Inhoud

12. Voorbeeldprompts

12.1 Voorbeelden op het Web

In de loop van de tijd hebben veel mensen me uitstekende voorbeelden gemaild, en ik heb er zelf ook een aantal interessante geschreven. Er zijn er veel te veel om hier in op te nemen, dus ik heb alle voorbeelden bijelkaar op een webpage geplaatst die kan worden bekeken op http://www.interlog.com/~giles/bashprompt/prompts. Op Webpages kan ik ook afbeeldingen invoegen, wat ik in een standaard HOWTO niet kan doen. Alle voorbeelden die hierin staan, behalve die van Bradley Alexander "Prompts Depending on Connection Types" kunnen ook op het web worden bekeken.

12.2 Een "Lichtgewicht" Prompt



function proml {
local BLUE="\[\033[0;34m\]"
local RED="\[\033[0;31m\]"
local LIGHT_RED="\[\033[1;31m\]"
local WHITE="\[\033[1;37m\]"
local NO_COLOUR="\[\033[0m\]"
case $TERM in
    xterm*)
        TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        TITLEBAR=""
        ;;
esac

PS1="${TITLEBAR}\
$BLUE[$RED\$(date +%H%M)$BLUE]\
$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
$WHITE\$$NO_COLOUR "
PS2='> '
PS4='+ '
}

12.3 Elite van Bashprompt Themes

Merk op dat hier een VGA-font voor is vereist.



# Aangemaakt door KrON van windowmaker op IRC
# Gewijzigd door Spidey 08/06
function elite {
PS1="\[\033[31m\]\332\304\[\033[34m\](\[\033[31m\]\u\[\033[34m\]@\[\033[31m\]\h\
\[\033[34m\])\[\033[31m\]-\[\033[34m\](\[\033[31m\]\$(date +%I:%M%P)\
\[\033[34m\]-:-\[\033[31m\]\$(date +%m)\[\033[34m\033[31m\]/\$(date +%d)\
\[\033[34m\])\[\033[31m\]\304-\[\033[34m]\\371\[\033[31m\]-\371\371\
\[\033[34m\]\372\n\[\033[31m\]\300\304\[\033[34m\](\[\033[31m\]\W\[\033[34m\])\
\[\033[31m\]\304\371\[\033[34m\]\372\[\033[00m\]"
PS2="> "
}

12.4 Een "Power User" Prompt

Ik maak echt gebruik van deze prompt, maar het resulteert in opmerkelijke onderbrekingen bij het verschijnen van de prompt op een single-user PII-400, dus ik zou je aan willen raden het echt op een multi-user P-100 of iets dergelijks te gebruiken ... Bekijk het om ideeën op te doen, in plaats van het als een praktische prompt te beschouwen.



#!/bin/bash
#----------------------------------------------------------------------
#       POWER USER PROMPT "pprom2"
#----------------------------------------------------------------------
#
#   Aangemaakt augustus 98, Laatst gewijzigd 9 november 98 door Giles
#
#   Probleem: als de load afneemt, geeft het aan "1.35down-.08", get rid 
#   of the negative

function prompt_command
{
#   Creëer TotalMeg variabele: som van zichtbare bestandsgroottes in
#   huidige directory
local TotalBytes=0
for Bytes in $(ls -l | grep "^-" | cut -c30-41)
do
    let TotalBytes=$TotalBytes+$Bytes
done
TotalMeg=$(echo -e "scale=3 \nx=$TotalBytes/1048576\n if (x<1) {print \"0\"} \n print x \nquit" | bc)

#      Dit wordt gebruikt om het verschil in load waarden te berekenen
#      waarin voorzien door het "uptime" commando.  "uptime" geeft load 
#      gemiddelden op 1, 5, en 15 minuten markeringen.
#
local one=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
local five=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\).*/\2/" -e "s/ //g")
local diff1_5=$(echo -e "scale = scale ($one) \nx=$one - $five\n if (x>0) {print \"up\"} else {print \"down\"}\n print x \nquit \n" | bc)
loaddiff="$(echo -n "${one}${diff1_5}")"

#   Tel zichtbare bestanden:
let files=$(ls -l | grep "^-" | wc -l | tr -d " ")
let hiddenfiles=$(ls -l -d .* | grep "^-" | wc -l | tr -d " ")
let executables=$(ls -l | grep ^-..x | wc -l | tr -d " ")
let directories=$(ls -l | grep "^d" | wc -l | tr -d " ")
let hiddendirectories=$(ls -l -d .* | grep "^d" | wc -l | tr -d " ")-2
let linktemp=$(ls -l | grep "^l" | wc -l | tr -d " ")
if [ "$linktemp" -eq "0" ]
then
    links=""
else
    links=" ${linktemp}l"
fi
unset linktemp
let devicetemp=$(ls -l | grep "^[bc]" | wc -l | tr -d " ")
if [ "$devicetemp" -eq "0" ]
then
    devices=""
else
    devices=" ${devicetemp}bc"
fi
unset devicetemp

}

PROMPT_COMMAND=prompt_command

function pprom2 {

local        BLUE="\[\033[0;34m\]"
local  LIGHT_GRAY="\[\033[0;37m\]"
local LIGHT_GREEN="\[\033[1;32m\]"
local  LIGHT_BLUE="\[\033[1;34m\]"
local  LIGHT_CYAN="\[\033[1;36m\]"
local      YELLOW="\[\033[1;33m\]"
local       WHITE="\[\033[1;37m\]"
local         RED="\[\033[0;31m\]"
local   NO_COLOUR="\[\033[0m\]"

case $TERM in
    xterm*)
        TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        TITLEBAR=""
        ;;
esac

PS1="$TITLEBAR\
$BLUE[$RED\$(date +%H%M)$BLUE]\
$BLUE[$RED\u@\h$BLUE]\
$BLUE[\
$LIGHT_GRAY\${files}.\${hiddenfiles}-\
$LIGHT_GREEN\${executables}x \
$LIGHT_GRAY(\${TotalMeg}Mb) \
$LIGHT_BLUE\${directories}.\
\${hiddendirectories}d\
$LIGHT_CYAN\${links}\
$YELLOW\${devices}\
$BLUE]\
$BLUE[${WHITE}\${loaddiff}$BLUE]\
$BLUE[\
$WHITE\$(ps ax | wc -l | sed -e \"s: ::g\")proc\
$BLUE]\
\n\
$BLUE[$RED\$PWD$BLUE]\
$WHITE\$\
\
$NO_COLOUR "
PS2='> '
PS4='+ '
}

12.5 Prompt Afhankelijk van het Type Verbinding

Bradley M Alexander (storm@tux.org) had het uitstekende idee om zijn gebruikers er aan te herinneren van welke verbinding ze op zijn computer(s) gebruik maakte, dus codeerde hij prompts in een kleur afhankelijk van het type verbinding. Hier is het bashrc dat hij me leverde:



# /etc/bashrc

# Systeemomvattende functies en aliassen
# Omgevingszaken gaan in /etc/profile

# Om onbekende reden weigert bash in een aantal situaties waar ik niet
# uit kom, PS1 te erven.
# Als PS1 hierin wordt geplaatst, ben je er zeker van dat het iedere keer
# wordt geladen.

# Stel prompts in. Kleurcode voor logins. Rood voor root, wit voor 
# gebruikerslogins, groen voor ssh-sessies, cyaan voor telnet,
# magenta met rood "(ssh)" voor ssh + su, magenta voor telnet.
THIS_TTY=tty`ps aux | grep $$ | grep bash | awk '{ print $7 }'`
SESS_SRC=`who | grep $THIS_TTY | awk '{ print $6 }'`

SSH_FLAG=0
SSH_IP=`echo $SSH_CLIENT | awk '{ print $1 }'`
if [ $SSH_IP ] ; then
  SSH_FLAG=1
fi
SSH2_IP=`echo $SSH2_CLIENT | awk '{ print $1 }'`
if [ $SSH2_IP ] ; then
  SSH_FLAG=1
fi
if [ $SSH_FLAG -eq 1 ] ; then
  CONN=ssh
elif [ -z $SESS_SRC ] ; then
  CONN=lcl
elif [ $SESS_SRC = "(:0.0)" -o $SESS_SRC = "" ] ; then
  CONN=lcl
else
  CONN=tel
fi

# Okay...Wie zijn we nu?
if [ `/usr/bin/whoami` = "root" ] ; then
  USR=priv
else
  USR=nopriv
fi

#Stel een aantal prompts in...
if [ $CONN = lcl -a $USR = nopriv ] ; then
  PS1="[\u \W]\\$ "
elif [ $CONN = lcl -a $USR = priv ] ; then
  PS1="\[\033[01;31m\][\w]\\$\[\033[00m\] "
elif [ $CONN = tel -a $USR = nopriv ] ; then
  PS1="\[\033[01;34m\][\u@\h \W]\\$\[\033[00m\] "
elif [ $CONN = tel -a $USR = priv ] ; then
  PS1="\[\033[01;30;45m\][\u@\h \W]\\$\[\033[00m\] "
elif [ $CONN = ssh -a $USR = nopriv ] ; then
  PS1="\[\033[01;32m\][\u@\h \W]\\$\[\033[00m\] "
elif [ $CONN = ssh -a $USR = priv ] ; then
  PS1="\[\033[01;35m\][\u@\h \W]\\$\[\033[00m\] "
fi

# PS1="[\u@\h \W]\\$ "
export PS1
alias which="type -path"
alias dir="ls -lF --color"
alias dirs="ls -lFS --color"
alias h=history

12.6 Een Prompt ter Breedte van Je Term

Een vriend klaagde dat hij een prompt, die qua lengte bleef wijzigen, dit omdat $PWD er in voorkwam, niet prettig vond. Ik schreef dus een prompt die de grootte exact aan de breedte van je term wijzigde, met de werkdirectory in de bovenste regel van twee regels.



#!/bin/bash

#   termbrede prompt
#      door Giles - aangemaakt 2 November 98
#
#   De bedoeling hier is dat de bovenste van de uit twee regels bestaande
#   prompt altijd even breed is als de breedte van je term. Doe dit door
#   de breedte van de tekstelementen te berekenen, en vul het zonodig
#   uit of kap $PWD aan de linkerkant af. 
#

function prompt_command {

TERMWIDTH=${COLUMNS}

#   Bereken de breedte van de prompt:

hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
#   "whoami" en "pwd" sluiten een afsluitende newline in
usernam=$(whoami)
let usersize=$(echo -n $usernam | wc -c | tr -d " ")
newPWD="${PWD}"
let pwdsize=$(echo -n ${newPWD} | wc -c | tr -d " ")
#   Voeg alle accessoires hieronder toe ...
let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})--" \
                 | wc -c | tr -d " ")
let fillsize=${TERMWIDTH}-${promptsize}
fill=""
while [ "$fillsize" -gt "0" ] 
do 
   fill="${fill}-"
   let fillsize=${fillsize}-1
done

if [ "$fillsize" -lt "0" ]
then
   let cut=3-${fillsize}
   newPWD="...$(echo -n $PWD | sed -e "s/\(^.\{$cut\}\)\(.*\)/\2/")"
fi
}

PROMPT_COMMAND=prompt_command

function termwide {

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local WHITE="\[\033[1;37m\]"
local NO_COLOUR="\[\033[0m\]"

local LIGHT_BLUE="\[\033[1;34m\]"
local YELLOW="\[\033[1;33m\]"

case $TERM in
    xterm*)
        TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        TITLEBAR=""
        ;;
esac

PS1="$TITLEBAR\
$YELLOW-$LIGHT_BLUE-(\
$YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
${LIGHT_BLUE})-${YELLOW}-\${fill}${LIGHT_BLUE}-(\
$YELLOW\${newPWD}\
$LIGHT_BLUE)-$YELLOW-\
\n\
$YELLOW-$LIGHT_BLUE-(\
$YELLOW\$(date +%H%M)$LIGHT_BLUE:$YELLOW\$(date \"+%a,%d %b %y\")\
$LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)-\
$YELLOW-\
$NO_COLOUR " 

PS2="$LIGHT_BLUE-$YELLOW-$YELLOW-$NO_COLOUR "

}

12.7 De Elegant Useless Clock Prompt

Dit is één van de meer aantrekkelijke (en nutteloze) prompts die ik heb gemaakt. Omdat veel van de X-terminal emulators het bewaren en herstellen van de positie van de cursor niet implementeren, kun je als alternatief de cursor onderaan de terminal verankeren als je een klok in de bovenste rechterhoek plaatst. Dit bouwt voort op het idee van de "termbrede" prompt van hiervoor, een lijn tekenend aan de rechterkant van het scherm van de prompt tot aan de klok. Een VGA-font is vereist.

Noot: Er is hier een vreemde substitutie, waardoor het waarschijnlijk niet juist wordt afgedrukt, als het vanuit SGML naar andere formaten is omgezet. Ik moest het schermteken voor \304 substitueren. Ik zou normaal gesproken gewoon de reeks "\304" hebben opgenomen, maar het was nodig in dit geval deze subsitutie te maken.



#!/bin/bash

#   Voor deze prompt is een VGA-font vereist. De prompt wordt aan de
#   onderkant van de terminal verankerd, vult op ter breedte van de terminal
#   en tekent een verticale lijn aan de rechterkant van de terminal
#   waarbij het zichzelf koppelt aan een klok in de rechterbovenhoek van
#   de terminal.

function prompt_command {
#   Bereken de breedte van de prompt:
hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//")
#   "whoami" en "pwd" nemen een afsluitende newline op
usernam=$(whoami)
newPWD="${PWD}"
#   Voeg alle accesoires hieronder in ...
let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})-----" \
                 | wc -c | tr -d " ")
#   Zoek uit hoeveel er tussen user@host en PWD moet worden ingevoegd (of
#   hoeveel van PWD te verwijderen)
let fillsize=${COLUMNS}-${promptsize}
fill=""
#   Maak de opvuller als de prompt niet zo breed is als de terminal:
while [ "$fillsize" -gt "0" ] 
do 
   fill="${fill}Ä"
   # De A met de umlaut erboven (het verschijnt als een lange streep als
   # je een VGA-font gebruikt) is \304, maar ik knipte het en plakte het in
   # omdat Bash slechts één substitutie uitvoert en dat is
   # in dit geval het plaatsen van $fill in de prompt.
   let fillsize=${fillsize}-1
done
#   Kap PWD aan de rechterkant af als de prompt breder wordt dan de terminal:
if [ "$fillsize" -lt "0" ]
then
   let cutt=3-${fillsize}
   newPWD="...$(echo -n $PWD | sed -e "s/\(^.\{$cutt\}\)\(.*\)/\2/")"
fi
#
#   Maak de klok en de balk die aan de rechterkant van de term draait
#
local LIGHT_BLUE="\033[1;34m"
local     YELLOW="\033[1;33m"
#   Positioneer de cursor om de klok weer te geven:
echo -en "\033[2;$((${COLUMNS}-9))H"
echo -en "$LIGHT_BLUE($YELLOW$(date +%H%M)$LIGHT_BLUE)\304$YELLOW\304\304\277"
local i=${LINES}
echo -en "\033[2;${COLUMNS}H"
#  Print verticale streepjes:
while [ $i -ge 4 ]
do
   echo -en "\033[$(($i-1));${COLUMNS}H\263"
   let i=$i-1
done

let prompt_line=${LINES}-1
#   Dit is nodig omdat een \${LINES} binnen een Bash mathematische
#   expressie (d.w.z. $(())) niet schijnt te werken.
}

PROMPT_COMMAND=prompt_command

function clock3 {
local LIGHT_BLUE="\[\033[1;34m\]"
local     YELLOW="\[\033[1;33m\]"
local      WHITE="\[\033[1;37m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local  NO_COLOUR="\[\033[0m\]"

case $TERM in
    xterm*)
        TITLEBAR='\[\033]0;\u@\h:\w\007\]'
        ;;
    *)
        TITLEBAR=""
        ;;
esac

PS1="$TITLEBAR\
\[\033[\${prompt_line};0H\]
$YELLOW\332$LIGHT_BLUE\304(\
$YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\
${LIGHT_BLUE})\304${YELLOW}\304\${fill}${LIGHT_BLUE}\304(\
$YELLOW\${newPWD}\
$LIGHT_BLUE)\304$YELLOW\304\304\304\331\
\n\
$YELLOW\300$LIGHT_BLUE\304(\
$YELLOW\$(date \"+%a,%d %b %y\")\
$LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)\304\
$YELLOW\304\
$LIGHT_GRAY " 

PS2="$LIGHT_BLUE\304$YELLOW\304$YELLOW\304$NO_COLOUR "

}


Verder Terug Inhoud