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.
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='+ ' }
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="> " }
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='+ ' }
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
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 " }
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 " }