diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/Bash-Prompt-HOWTO.sgml b/LDP/howto/docbook/Bash-Prompt-HOWTO/Bash-Prompt-HOWTO.sgml new file mode 100644 index 00000000..248ac103 --- /dev/null +++ b/LDP/howto/docbook/Bash-Prompt-HOWTO/Bash-Prompt-HOWTO.sgml @@ -0,0 +1,4080 @@ + + + + + +Bash Prompt HOWTO + $Revision$, $Date$ + + +1998 +1999 +2000 +2001 +Giles Orr + + + + +Permission is granted to copy, distribute and/or modify this document under +the terms of the GNU Free Documentation License, Version 1.1 or any later +version published by the Free Software Foundation; with no Invariant +Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy +of the license is included in the section entitled "GNU Free Documentation +License". + + + + + +Giles +Orr + + +giles at shelluser dot net + + + + + + +Creating and controlling terminal and xterm prompts is discussed, +including incorporating standard escape sequences to give username, +current working directory, time, etc. Further suggestions are made +on how to modify xterm title bars, use external functions to provide +prompt information, and how to use ANSI colours. + + + + + + + + + + + + +Introduction and Administrivia + + +Introduction + + +I've been maintaining this document for three and a half years (I believe +the first submitted version was January 1998). I've received a lot of +e-mail, almost all of it positive with a lot of great suggestions, and I've +had a really good time doing this. Thanks to everyone for the support, +suggestions, and translations! + + + + +I've had several requests both from individuals and the LDP group to issue +a new version of this document, and it's long past due (a year and a half +since the last version) - for which I apologize. Converting this monster +to DocBook format was a daunting task, and then when I realized that I +could now include images, I decided I needed to include all the cool +examples that currently reside on my homepage. Adding these is a slow +process, especially since I'm improving the code as I go, so only a few are +included so far. This document will probably always feel incomplete to me +... I think however that it's reasonably sound from a technical point of +view (although I have some mailed in fixes that aren't in here yet +- if you've heard from me, they'll be in here soon!) so I'm going to post + it and hope I can get to another version soon. + + + + +One other revision of note: this document (as requested by the LDP) is now +under the GFDL. Enjoy. + + + + + + +Revision History + + + + + + v0.89 + 2001-08-20 + go + Added clockt example, several example images added, + improved laptop power code, minor tweaks. + + + + v0.85 + 2001-07-31 + go + Major revisions, plus change from Linuxdoc to DocBook. + + + + + v0.76 + 1999-12-31 + go + + + + + v0.60 + 1998-01-07 + go + Initial public release? + + + + + + + + +Requirements + + +You will need Bash. This should be easy: it's the default shell for just +about every Linux distribution I know of. The commonest version is now +2.0.x. Version 1.14.7 was the standard for a long time, but has mostly +been replaced. I've been using Bash 2.0.x for quite a while now. With +recent revisions of the HOWTO (later than July 2001) I've been using a lot +of code (mainly ${} substitutions) that I believe is specific to 2.x and +may not work with Bash 1.x. You can check your Bash version by typing +echo $BASH_VERSION at the prompt. On my machine, it +responds with 2.04.21(1)-release. + + + + +Shell programming experience would be good, but isn't essential: the more +you know, the more complex the prompts you'll be able to create. I assume +a basic knowledge of shell programming and Unix utilities as I go through +this tutorial. However, my own shell programming skills are limited, so I +give a lot of examples and explanation that may appear unnecessary to an +experienced shell programmer. + + + + + + +How To Use This Document + + +I include a lot of examples and explanatory text. Different parts will be +of varying usefulness to different people. This has grown long enough that +reading it straight through would be difficult - just read the sections you +need, backtrack as necessary. + + + + + +Document Versions, Comments and Suggestions + + +This is a learning experience for me. I've come to know a fair bit about +what can be done to create interesting and useful Bash Prompts, but I need +your input to correct and improve this document. I no longer make code +checks against older versions of Bash, let me know of any incompatibilities +you find. + + + + +The latest version of this document should always be available at + +http://www.shelluser.net/~giles/bashprompt/. The latest official +release should always be at http://www.linuxdoc.org. Please +check these +out, and feel free to e-mail me at giles at shelluser dot net +with suggestions. + + + +I use the Linux Documentation Project HOWTOs almost exclusively in the HTML +format, so when I convert this from DocBook SGML (its native format), HTML +is the only format I check thoroughly. If there are problems with other +formats, I may not know about them and I'd appreciate a note about them. + + + + +There are issues with the PDF and RTF conversions (as of December 2000), +including big problems with example code wrapping around the screen and +getting mangled. I always keep my examples less than 80 characters wide, +but the PDF version seems to wrap around 60. Please use online examples if +the code in these versions don't work for you. But they do look very +pretty. + + + + + + +Translations + + +It has proven quite difficult for me to keep track of the people who are +translating this HOWTO. This list is out of date and incomplete: I include +it for what it's worth, knowing that some of the links will always be +broken. + + + + +If you are working on a translation, please notify me - especially if it's +available at a linkable URL. Thanks. + + + + +Chinese: translation in progress by Allen Huang +lancelot@tomail.com.tw. I will include a URL when I have it. + + + +Dutch: translation is in progress by +Ellen Bokhorst bokkie@nl.linux.org, and it is available +at +http://www.nl.linux.org/doc/HOWTO. + + + +German: translation is in progress by Thomas +Keil, thomas@h-preissler.de. + + + +Italian: by Daniel Dui, +ddui@iee.org, +available at +http://www.crs4.it/~dui/linux.html. + + + +Japanese: http://www.jf.linux.or.jp/JF/JF-ftp/other-formats/Bash-Prompt/Bash-Prompt-HOWTO.html, +provided by Akira Endo, akendo@t3.rim.or.jp. As of +January 2000, This web site seems to be down, and Akira's e-mail +doesn't work. I hope that they will resurface. + + + +Norwegian: translation in progress by Sigmund Kyrre Ås +as@stud.ntnu.no. It will be +available at + +http://www.linux.no/nldp/dokumentasjon/howto.html. + + + +Portuguese: translation is in progress by Mário +Gamito, mario.gamito@mail.telepac.pt. + + + +Spanish: translation by Iosu Santurtún +iosu@bigfoot.com at +http://mipagina.euskaltel.es/iosus/linux/Bash-Prompt-HOWTO.html. + + + +Many thanks to all of them! URLs will be included as they're available. + + + + + +Problems + + +This is a list of problems I've noticed while programming prompts. Don't +start reading here, and don't let this list discourage you - +these are mostly quite minor details. Just check back if you run into +anything odd. + + + + + + +Many Bash features (such as math within $(()) among others) are +compile time options. If you're using a binary distribution such as comes +with a standard Linux distribution, all such features should be compiled +in. But if you're working on someone else's system, this is worth keeping +in mind if something you expected to work doesn't. Some notes about this +in Learning the Bash Shell, p.260-262. + + + + + + +The terminal screen manager "screen" doesn't always get along with +ANSI colours. I'm not a screen expert, unfortunately. Versions older than +3.7.6 may cause problems, but newer versions seem to work well in all cases. +Old versions reduce all prompt colours to the standard +foreground colour in X terminals. + + + + + + +Xdefaults files can override colours. Look in +~/.Xdefaults for +lines referring to XTerm*background +and XTerm*foreground (or possibly +XTerm*Background and +XTerm*Foreground). + + + + + + +One of the prompts mentioned in this document uses the output of +"jobs" - as discussed at that time, "jobs" output to a pipe is broken in +Bash 2.02. + + + + + + +ANSI cursor movement escape sequences aren't all implemented in all X +terminals. That's discussed in its own section. + + + + + + +Some nice looking pseudo-graphics can be created by using a VGA font +rather than standard Linux fonts. Unfortunately, these effects look awful +if you don't use a VGA font, and there's no way to detect within a term +what kind of font it's using. + + + + + + +Things that work under Bash 1.14.7 don't necessarily work the +same under 2.0+, or vice versa. + + + + + + +I often use the code PS1="...\\$${NO_COLOUR} " at +the end of my PS1 string. The \\$ is +replaced by a "$" for a normal user, and a "#" if you are root, and the +${NO_COLOUR} is an escape sequence that stops any colour +modifications made by the prompt. However, I've had problems seeing the +"#" when I'm root. I believe this is because Bash doesn't like two dollar +signs in a row. Use PS1="...\\$ ${NO_COLOUR}" +instead. I'm still trying to figure out how to get rid of that extra +space. + + + + + + + + + +Credits/Bibliography + + +In producing this document, I have borrowed heavily from the work of the +Bashprompt project at http://bash.current.nu/ (this site +has been removed from its server as of July 2001 but Robert Current, the +admin, assures me it will reappear soon). Other +sources used include the xterm Title mini-HOWTO by Ric +Lister, available at +http://www.linuxdoc.org/HOWTO/mini/Xterm-Title.html, Ansi +Prompts by Keebler, available at +http://www.ncal.verio.com/~keebler/ansi.html (now deceased), +How to make a Bash Prompt Theme by Stephen Webb, +available at +http://bash.current.nu/bash/HOWTO.html, and X ANSI +Fonts by Stumpy, available at +http://home.earthlink.net/~us5zahns/enl/ansifont.html. + + + + +Also of immense help were several conversations and e-mails from Dan, +who used to work at Georgia College & State University, whose knowledge +of Unix far exceeds mine. He's given me several excellent suggestions, +and ideas of his have led to some interesting prompts. + + + + +Three books that have been very useful while programming prompts are +Linux in a Nutshell by Jessica Heckman Perry +(O'Reilly, 3rd ed., 2000), Learning the Bash Shell by +Cameron Newham and Bill Rosenblatt (O'Reilly, 2nd ed., 1998) and +Unix Shell Programming by Lowell +Jay Arthur (Wiley, 1986. This is the first edition, the fourth came out in +1997). + + + + + + +Disclaimer + + +This document is available for free, and, while I have done the best I can +to make it accurate and up to date, I take no responsibility for any +problems you may encounter resulting from the use of this document. + + + + + + + + + +Bash and Bash Prompts + + +What is Bash? + + +Descended from the Bourne Shell, Bash is a GNU product, the +"Bourne Again SHell." It's the standard command +line interface on most Linux machines. It excels at interactivity, +supporting command line editing, completion, and recall. It also supports +configurable prompts - most people realize this, but don't know how much +can be done. + + + + + +What Can Tweaking Your Bash Prompt Do For You? + + +Most Linux systems have a default prompt in one colour (usually gray) that +tells you your user name, the name of the machine you're working on, and +some indication of your current working directory. This is all useful +information, but you can do much more with the prompt: all sorts of +information can be displayed (tty number, time, date, load, number of +users, uptime ...) and the prompt can use ANSI colours, either to make it +look interesting, or to make certain information stand out. You can also +manipulate the title bar of an Xterm to reflect some of this information. + + + + + +Why Bother? + + +Beyond looking cool, it's often useful to keep track of system information. +One idea that I know appeals to some people is that it makes it possible to +put prompts on different machines in different colours. If you have +several Xterms open on several different machines, or if you tend to forget +what machine you're working on and delete the wrong files (or shut down the +server instead of the workstation), you'll find this a great way to +remember what machine you're on. + + + +For myself, I like the utility of having information about my machine +and work environment available all the time. And I like the challenge of +trying to figure out how to put the maximum amount of information into the +smallest possible space while maintaining readability. + + + + + +The First Step + + +The appearance of the prompt is governed by the shell variable PS1. +Command continuations are indicated by the PS2 string, which can be +modified in exactly the same ways discussed here - since controlling it is +exactly the same, and it isn't as "interesting," I'll mostly be modifying +the PS1 string. (There are also PS3 and PS4 strings. These are never seen +by the average user - see the Bash man page if you're interested in their +purpose.) To change the way the prompt looks, you change the PS1 variable. +For experimentation purposes, you can enter the PS1 strings directly at the +prompt, and see the results immediately (this only affects your current +session, and the changes go away when you log out). If you want to make a +change to the prompt permanent, look at the section below +. + + + +Before we get started, it's important to remember that the PS1 string is +stored in the environment like any other environment variable. If you +modify it at the command line, your prompt will change. Before you make +any changes, you can save your current prompt to another environment +variable: + + + +[giles@nikola giles]$ SAVE=$PS1 +[giles@nikola giles]$ + + + +The simplest prompt would be a single character, such as: + + + +[giles@nikola giles]$ PS1=$ +$ls +bin mail +$ + + + +This demonstrates the best way to experiment with basic prompts, entering +them at the command line. Notice that the text entered by the user +appears immediately after the prompt: I prefer to use + + + +$PS1="$ " +$ ls +bin mail +$ + + + +which forces a space after the prompt, making it more readable. To restore +your original prompt, just call up the variable you stored: + + + +$ PS1=$SAVE +[giles@nikola giles]$ + + + + + +Bash Prompt Escape Sequences + + +There are a lot of escape sequences offered by the Bash shell for +insertion in the prompt. From the Bash 2.04 man page: + + + + When executing interactively, bash displays the primary + prompt PS1 when it is ready to read a command, and the + secondary prompt PS2 when it needs more input to complete + a command. Bash allows these prompt strings to be cus­ + tomized by inserting a number of backslash-escaped special + characters that are decoded as follows: + \a an ASCII bell character (07) + \d the date in "Weekday Month Date" format + (e.g., "Tue May 26") + \e an ASCII escape character (033) + \h the hostname up to the first `.' + \H the hostname + \j the number of jobs currently managed by the + shell + \l the basename of the shell's terminal device + name + \n newline + \r carriage return + \s the name of the shell, the basename of $0 + (the portion following the final slash) + \t the current time in 24-hour HH:MM:SS format + \T the current time in 12-hour HH:MM:SS format + \@ the current time in 12-hour am/pm format + \u the username of the current user + \v the version of bash (e.g., 2.00) + \V the release of bash, version + patchlevel + (e.g., 2.00.0) + \w the current working directory + \W the basename of the current working direc­ + tory + \! the history number of this command + \# the command number of this command + \$ if the effective UID is 0, a #, otherwise a + $ + \nnn the character corresponding to the octal + number nnn + \\ a backslash + \[ begin a sequence of non-printing characters, + which could be used to embed a terminal con­ + trol sequence into the prompt + \] end a sequence of non-printing characters + + + +For long-time users, note the new \j and +\l sequences: these are new in 2.03 or 2.04. + + + +Continuing where we left off: + + + +[giles@nikola giles]$ PS1="\u@\h \W> " +giles@nikola giles> ls +bin mail +giles@nikola giles> + + + +This is similar to the default on most Linux distributions. I wanted a +slightly different appearance, so I changed this to: + + + +giles@nikola giles> PS1="[\t][\u@\h:\w]\$ " +[21:52:01][giles@nikola:~]$ ls +bin mail +[21:52:15][giles@nikola:~]$ + + + + + +Setting the PS? Strings Permanently + + +Various people and distributions set their PS? strings in different places. +The most common places are /etc/profile, /etc/bashrc, ~/.bash_profile, and +~/.bashrc . Johan Kullstam (johan19@idt.net) writes: + + + +
+ +the PS1 string should be set in .bashrc. this is because +non-interactive bashes go out of their way to unset PS1. the bash man +page tells how the presence or absence of PS1 is a good way of knowing +whether one is in an interactive vs non-interactive (ie script) bash +session. + + + +the way i realized this is that startx is a bash script. what this +means is, startx will wipe out your prompt. when you set PS1 in +.profile (or .bash_profile), login at console, fire up X via startx, +your PS1 gets nuked in the process leaving you with the default +prompt. + + + +one workaround is to launch xterms and rxvts with the -ls option to +force them to read .profile. but any time a shell is called via a +non-interactive shell-script middleman PS1 is lost. system(3) uses sh +-c which if sh is bash will kill PS1. a better way is to place the +PS1 definition in .bashrc. this is read every time bash starts and is +where interactive things - eg PS1 should go. + + + +therefore it should be stressed that PS1=..blah.. should be in .bashrc +and not .profile. + + +
+ + +I tried to duplicate the problem he explains, and encountered a +different one: my PROMPT_COMMAND variable (which will be introduced later) +was blown away. My knowledge in this area is somewhat shaky, so I'm going +to go with what Johan says. + + +
+ +
+ + + + +Bash Programming and Shell Scripts + + +Variables + + +I'm not going to try to explain all the details of Bash scripting in +a section of this HOWTO, just the details pertaining to prompts. If +you want to know more about shell programming and Bash in general, I highly +recommend Learning the Bash Shell by Cameron Newham and Bill +Rosenblatt (O'Reilly, 1998). Oddly, my copy of this book is quite frayed. +Again, I'm going to assume that you know a fair +bit about Bash already. You can skip this section if you're only looking +for the basics, but remember it and refer back if you proceed much farther. + + + +Variables in Bash are assigned much as they are in any programming +language: + + + +testvar=5 +foo=zen +bar="bash prompt" + + + +Quotes are only needed in an assignment if a space (or special character, +discussed shortly) is a part of the variable. + + + +Variables are referenced slightly differently than they are assigned: + + + +> echo $testvar +5 +> echo $foo +zen +> echo ${bar} +bash prompt +> echo $NotAssigned + +> + + + +A variable can be referred to as $bar or ${bar}. The +braces are useful when it is unclear what is being referenced: if I write +$barley do I mean ${bar}ley or ${barley}? Note +also that referencing a value that hasn't been assigned doesn't generate an +error, instead returning nothing. + + + + + +Quotes and Special Characters + + +If you wish to include a special character in a variable, you will have to +quote it differently: + + + +> newvar=$testvar +> echo $newvar +5 +> newvar="$testvar" +> echo $newvar +5 +> newvar='$testvar' +> echo $newvar +$testvar +> newvar=\$testvar +> echo $newvar +$testvar +> + + + +The dollar sign isn't the only character that's special to the Bash shell, +but it's a simple example. An interesting step we can take to make use of +assigning a variable name to another variable name is to use eval +to dereference the stored variable name: + + + +> echo $testvar +5 +> echo $newvar +$testvar +> eval echo $newvar +5 +> + + + +Normally, the shell does only one round of substitutions on the expression +it is evaluating: if you say echo $newvar the shell will only go +so far as to determine that $newvar is equal to the text string +$testvar, it won't evaluate what $testvar is equal to. +eval forces that evaluation. + + + + + +Command Substitution + + +In almost all cases in this document, I use the $(<command>) +convention for command substitution: that is, + + + +$(date +%H%M) + + + +means "substitute the output from the date +%H%M command here." +This works in Bash 2.0+. In some older versions of Bash, prior to 1.14.7, +you may need to use backquotes (`date +%H%M`). +Backquotes can be used in Bash 2.0+, but are being phased out in favor of +$(), which nests better. If you're using an earlier version of Bash, you +can usually substitute backquotes where you see $(). If the command +substitution is escaped (ie. \$(command) ), then use backslashes to escape +BOTH your backquotes (ie. \'command\' ). + + + + + +Non-Printing Characters in Prompts + + +Many of the changes that can be made to Bash prompts that are discussed in +this HOWTO use non-printing characters. Changing the colour of the prompt +text, changing an Xterm title bar, and moving the cursor position all +require non-printing characters. + + + +If I want a very simple prompt consisting of a greater-than sign and a +space: + + + +[giles@nikola giles]$ PS1='> ' +> + + + +This is just a two character prompt. If I modify it so that it's a +bright yellow greater-than sign (colours are discussed in their own +section): + + + +> PS1='\033[1;33m>\033[0m ' +> + + + +This works fine - until you type in a large command line. Because the +prompt still only consists of two printing characters (a greater-than sign +and a space) but the shell thinks that this prompt is eleven characters +long (I think it counts '\033' , '[1' and '[0' as one character each). You +can see this by typing a really long command line - you will find that the +shell wraps the text before it gets to the edge of the terminal, and in +most cases wraps it badly. This is because it's confused about the actual +length of the prompt. + + + + +So use this instead: + + + + +> PS1='\[\033[1;33m\]>\[\033[0m\] ' + + + +This is more complex, but it works. Command lines wrap properly. What's +been done is to enclose the '\033[1;33m' that starts the yellow colour in +'\[' and '\]' which tells the shell "everything between these escaped +square brackets, including the brackets themselves, is a non-printing +character." The same is done with the '\033[0m' that ends the colour. + + + + + + +Sourcing a File + + +When a file is sourced (by typing either source filename or . +filename at the command line), the lines of code in the file are +executed as if they were printed at the command line. This is particularly +useful with complex prompts, to allow them to be stored in files and called +up by sourcing the file they are in. + + + +In examples, you will find that I often include #!/bin/bash at the +beginning of files including functions. This is not necessary if +you are sourcing a file, just as it isn't necessary to chmod +x a +file that is going to be sourced. I do this because it makes Vim (my +editor of choice, no flames please - you use what you like) think I'm +editing a shell script and turn on colour syntax highlighting. + + + + + +Functions, Aliases, and the Environment + + +As mentioned earlier, PS1, PS2, PS3, PS4, and PROMPT_COMMAND are all stored +in the Bash environment. For those of us coming from a DOS background, the +idea of tossing big hunks of code into the environment is horrifying, +because that DOS environment was small, and didn't exactly grow well. +There are probably practical limits to what you can and should put in the +environment, but I don't know what they are, and we're probably talking a +couple of orders of magnitude larger than what DOS users are used to. As +Dan put it: + + + +
+ +"In my interactive shell I have 62 aliases and 25 functions. My rule +of thumb is that if I need something solely for interactive use and +can handily write it in bash I make it a shell function (assuming +it can't be easily expressed as an alias). If these people are +worried about memory they don't need to be using bash. Bash is one +of the largest programs I run on my linux box (outside of Oracle). +Run top sometime and press 'M' to sort by memory - see how close +bash is to the top of the list. Heck, it's bigger than sendmail! +Tell 'em to go get ash or something." + +
+ + +I guess he was using console only the day he tried that: running X and X +apps, I have a lot of stuff larger than Bash. But the idea is the same: +the environment is something to be used, and don't worry about overfilling +it. + + + +I risk censure by Unix gurus when I say this (for the crime of +over-simplification), but functions are basically small shell scripts that +are loaded into the environment for the purpose of efficiency. Quoting Dan +again: Shell functions are about as efficient as they can be. It is the +approximate equivalent of sourcing a bash/bourne shell script save that no +file I/O need be done as the function is already in memory. The shell +functions are typically loaded from [.bashrc or .bash_profile] depending on +whether you want them only in the initial shell or in subshells as well. +Contrast this with running a shell script: Your shell forks, the child does +an exec, potentially the path is searched, the kernel opens the file and +examines enough bytes to determine how to run the file, in the case of a +shell script a shell must be started with the name of the script as its +argument, the shell then opens the file, reads it and executes the +statements. Compared to a shell function, everything other than executing +the statements can be considered unnecessary overhead. + + + +Aliases are simple to create: + + + +alias d="ls --color=tty --classify" +alias v="d --format=long" +alias rm="rm -i" + + + +Any arguments you pass to the alias are passed to the command line of the +aliased command (ls in the first two cases). Note that aliases can be +nested, and they can be used to make a normal unix command behave in a +different way. (I agree with the argument that you shouldn't use the +latter kind of aliases - if you get in the habit of relying on "rm *" to +ask you if you're sure, you may lose important files on a system that +doesn't use your alias.) + + + +Functions are used for more complex program structures. As a general rule, +use an alias for anything that can be done in one line. Functions differ +from shell scripts in that they are loaded into the environment so that +they work more quickly. As a general rule again, you would want to +keep functions relatively small, and any shell script that gets relatively +large should remain a shell script rather than turning it into a function. +Your decision to load something as a function is also going to depend on +how often you use it. If you use a small shell script infrequently, leave +it as a shell script. If you use it often, turn it into a function. + + + +To modify the behaviour of ls, you could do something like the +following: + + + +function lf +{ + ls --color=tty --classify $* + echo "$(ls -l $* | wc -l) files" +} + + + +This could readily be set as an alias, but for the sake of example, we'll +make it a function. If you type the text shown into a text file and then +source that file, the function will be in your environment, and be +immediately available at the command line without the overhead of a shell +script mentioned previously. The usefulness of this becomes more obvious +if you consider adding more functionality to the above function, such as +using an if statement to execute some special code when links are found in +the listing. + + +
+
+ + + + +External Commands + + +PROMPT_COMMAND + + +Bash provides an environment variable called PROMPT_COMMAND. +The contents of this variable are executed as a regular Bash command just +before Bash displays a prompt. + + + + +[21:55:01][giles@nikola:~] PS1="[\u@\h:\w]\$ " +[giles@nikola:~] PROMPT_COMMAND="date +%H%M" +2155 +[giles@nikola:~] d +bin mail +2156 +[giles@nikola:~] + + + +What happened above was that I changed PS1 to no longer include the +\t escape sequence (added in a previous section), so +the time was no longer a part of the prompt. Then I used date ++%H%M to display the time in a format I like better. But it +appears on a different line than the prompt. Tidying this up using +echo -n ... as shown below works with Bash 2.0+, but +appears not to work with Bash 1.14.7: apparently the prompt is drawn in a +different way, and the following method results in overlapping text. + + + + +2156 +[giles@nikola:~] PROMPT_COMMAND="echo -n [$(date +%H%M)]" +[2156][giles@nikola:~]$ +[2156][giles@nikola:~]$ d +bin mail +[2157][giles@nikola:~]$ unset PROMPT_COMMAND +[giles@nikola:~] + + + +echo -n ... controls the output of the +date command and +suppresses the trailing newline, allowing the prompt to appear all on one +line. At the end, I used the unset command to +remove the PROMPT_COMMAND environment variable. + + + + + +External Commands in the Prompt + + +You can use the output of regular Linux commands directly in the prompt as +well. Obviously, you don't want to insert a lot of material, or it will +create a large prompt. You also want to use a fast +command, because it's going to be executed every time your prompt appears +on the screen, and delays in the appearance of your prompt while you're +working can be very annoying. (Unlike the previous example that this +closely resembles, this does work with Bash 1.14.7.) + + + +[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ " +[2159][giles@nikola:~]$ ls +bin mail +[2200][giles@nikola:~]$ + + + +It's important to notice the backslash before the dollar sign of the +command substitution. Without it, the external command is executed exactly +once: when the PS1 string is read into the environment. For this prompt, +that would mean that it would display the same time no matter how long the +prompt was used. The backslash protects the contents of $() from immediate +shell interpretation, so date is called every time +a prompt is generated. + + + + +Linux comes with a lot of small utility programs like +date, grep, or wc +that allow you to manipulate data. If you find yourself trying to create +complex combinations of these programs within a prompt, it may be easier to +make an alias, function, or shell script of your own, and call it from the +prompt. Escape sequences are often required in bash shell scripts to +ensure that shell variables are expanded at the correct time (as seen above +with the date command): this is raised to another level within the prompt +PS1 line, and avoiding it by creating functions is a good idea. + + + + +An example of a small shell script used within a prompt is given below: + + + +#!/bin/bash +# lsbytesum - sum the number of bytes in a directory listing +TotalBytes=0 +for Bytes in $(ls -l | grep "^-" | awk '{ print $5 }') +do + let TotalBytes=$TotalBytes+$Bytes +done +TotalMeg=$(echo -e "scale=3 \n$TotalBytes/1048576 \nquit" | bc) +echo -n "$TotalMeg" + + + +I used to keep this as a function, it now lives as a shell script in my +~/bin directory, which is on my path. +Used in a prompt: + + + + +[2158][giles@nikola:~]$ PS1="[\u@\h:\w (\$(lsbytesum) Mb)]\$ " +[giles@nikola:~ (0 Mb)]$ cd /bin +[giles@nikola:/bin (4.498 Mb)]$ + + + + + +What to Put in Your Prompt + + +You'll find I put username, machine name, time, and current directory name +in most of my prompts. With the exception of the time, these are very +standard items to find in a prompt, and time is probably the next most +common addition. But what you include is entirely a matter of personal +taste. Here is an interesting example to help give you ideas. + + + +Dan's prompt is minimal but very effective, particularly for the way he +works. + + + +[giles@nikola:~]$ cur_tty=$(tty | sed -e "s/.*tty\(.*\)/\1/") +[giles@nikola:~]$ echo $cur_tty +p4 +[giles@nikola:~]$ PS1="\!,$cur_tty,\$?\$ " +1095,p4,0$ + + + +Dan doesn't like that having the current working directory can resize the +prompt drastically as you move through the directory tree, so he keeps +track of that in his head (or types "pwd"). He learned Unix with csh and +tcsh, so he uses his command history extensively (something many of us +weaned on Bash do not do), so the first item in the prompt is the history +number. The second item is the significant characters of the tty (the +output of "tty" is cropped with sed), an item that can be useful to +"screen" users. The third item is the exit value of the last +command/pipeline (note that this is rendered useless by any command +executed within the prompt - you could work around that by capturing it to +a variable and playing it back, though). Finally, the "\$" is a dollar +sign for a regular user, and switches to a hash mark ("#") if the user is +root. + + + + + + + + + +Saving Complex Prompts + + +As the prompts you use become more complex, it becomes more and more +cumbersome to type them in at the prompt, and more practical to make them +into some sort of text file. I have adopted the method used by the +Bashprompt package (discussed later in this document: ), which is to put the primary commands +for the prompt in one file with the PS1 string in particular defined within +a function of the same name as the file itself. It's not the only way to +do it, but it works well. Take the following example: + + + + +#!/bin/bash + +function tonka { + +# Named "Tonka" because of the colour scheme + +local WHITE="\[\033[1;37m\]" +local LIGHT_BLUE="\[\033[1;34m\]" +local YELLOW="\[\033[1;33m\]" +local NO_COLOUR="\[\033[0m\]" + +case $TERM in + xterm*|rxvt*) + TITLEBAR='\[\033]0;\u@\h:\w\007\]' + ;; + *) + TITLEBAR="" + ;; +esac + +PS1="$TITLEBAR\ +$YELLOW-$LIGHT_BLUE-(\ +$YELLOW\u$LIGHT_BLUE@$YELLOW\h\ +$LIGHT_BLUE)-(\ +$YELLOW\$PWD\ +$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 " + +} + + + + + +You can work with it as follows: + + + + +[giles@nikola:/bin (4.498 Mb)]$ cd +[giles@nikola:~ (0 Mb)]$ vim tonka +... +[giles@nikola:~ (0 Mb)]$ source tonka +[giles@nikola:~ (0 Mb)]$ tonka +[giles@nikola:~ (0 Mb)]$ unset tonka + + + + + +Move to the directory where you want to save the prompt + + + + + +Edit the prompt file with your preferred editor + + + + + +Enter the prompt text given above as "tonka" + + + + + +Read the prompt function into the environment + + + + + +Execute the prompt function + + + + + +Optionally, unclutter your environment by unsetting the function + + + + + + + + + + +ANSI Escape Sequences: Colours and Cursor Movement + + +Colours + + +As mentioned before, non-printing escape sequences have to be enclosed in +\[\033[ and \]. For colour +escape sequences, they should also be followed by a lowercase +m. + + + +If you try out the following prompts in an xterm and find that you aren't +seeing the colours named, check out your +~/.Xdefaults file (and +possibly its bretheren) for lines like +XTerm*Foreground: BlanchedAlmond. +This can be commented out by placing an exclamation mark ("!") in front of +it. Of course, this will also be dependent on what terminal emulator +you're using. This is the likeliest place that your term foreground +colours would be overridden. + + + +To include blue text in the prompt: + + + +PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ " + + + +The problem with this prompt is that the blue colour that starts with the +34 colour code is never switched back to the regular colour, so any text +you type after the prompt is still in the colour of the prompt. This is +also a dark shade of blue, so combining it with the +bold code might help: + + + +PS1="\[\033[1;34m\][\$(date +%H%M)][\u@\h:\w]$\[\033[0m\] " + + + +The prompt is now in light blue, and it ends by switching the colour +back to nothing (whatever foreground colour you had previously). + + + +Here are the rest of the colour equivalences: + + + +Black 0;30 Dark Gray 1;30 +Blue 0;34 Light Blue 1;34 +Green 0;32 Light Green 1;32 +Cyan 0;36 Light Cyan 1;36 +Red 0;31 Light Red 1;31 +Purple 0;35 Light Purple 1;35 +Brown 0;33 Yellow 1;33 +Light Gray 0;37 White 1;37 + + + +Daniel Dui (ddui@iee.org) points out that to be strictly accurate, we must +mention that the list above is for colours at the console. In an xterm, +the code 1;31 isn't "Light Red," but "Bold Red." +This is true of all the colours. + + + +You can also set background colours by using 44 for Blue background, 41 for +a Red background, etc. There are no bold background colours. Combinations +can be used, like Light Red text on a Blue background: +\[\033[44;1;31m\], although setting the colours +separately seems to work better (ie. +\[\033[44m\]\[\033[1;31m\]). Other codes +available include 4: Underscore, 5: Blink, 7: Inverse, and 8: Concealed. + + + + +Many people (myself included) object strongly to the +"blink" attribute because it's extremely distracting and irritating. +Fortunately, it doesn't work in any terminal emulators +that I'm aware of - but it will still work on the console. + + + + + +If you were wondering (as I did) "What use is a 'Concealed' attribute?!" - +I saw it used in an example shell script (not a prompt) to allow someone to +type in a password without it being echoed to the screen. However, this +attribute doesn't seem to be honoured by many terms other than "Xterm." + + + + + +Based on a prompt called "elite2" in the Bashprompt package (which I +have modified to work better on a standard console, rather than with the +special xterm fonts required to view the original properly), this is a +prompt I've used a lot: + + + +function elite +{ + +local GRAY="\[\033[1;30m\]" +local LIGHT_GRAY="\[\033[0;37m\]" +local CYAN="\[\033[0;36m\]" +local LIGHT_CYAN="\[\033[1;36m\]" +local NO_COLOUR="\[\033[0m\]" + +case $TERM in + xterm*|rxvt*) + local TITLEBAR='\[\033]0;\u@\h:\w\007\]' + ;; + *) + local TITLEBAR="" + ;; +esac + +local temp=$(tty) +local GRAD1=${temp:5} +PS1="$TITLEBAR\ +$GRAY-$CYAN-$LIGHT_CYAN(\ +$CYAN\u$GRAY@$CYAN\h\ +$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\ +$CYAN\#$GRAY/$CYAN$GRAD1\ +$LIGHT_CYAN)$CYAN-$LIGHT_CYAN(\ +$CYAN\$(date +%H%M)$GRAY/$CYAN\$(date +%d-%b-%y)\ +$LIGHT_CYAN)$CYAN-$GRAY-\ +$LIGHT_GRAY\n\ +$GRAY-$CYAN-$LIGHT_CYAN(\ +$CYAN\$$GRAY:$CYAN\w\ +$LIGHT_CYAN)$CYAN-$GRAY-$LIGHT_GRAY " +PS2="$LIGHT_CYAN-$CYAN-$GRAY-$NO_COLOUR " +} + + + +I define the colours as temporary shell variables in the name of +readability. It's easier to work with. The "GRAD1" variable is a check to +determine what terminal you're on. Like the test to determine if you're +working in an Xterm, it only needs to be done once. The prompt you see +look like this, except in colour: + + + +--(giles@gcsu202014)-(30/pts/6)-(0816/01-Aug-01)-- +--($:~/tmp)-- + + + +To help myself remember what colours are available, I wrote a script that +output all the colours to the screen. Daniel Crisman has supplied a much +nicer version which I include below: + + + +#!/bin/bash +# +# This file echoes a bunch of color codes to the +# terminal to demonstrate what's available. Each +# line is the color code of one forground color, +# out of 17 (default + 16 escapes), followed by a +# test use of that color on all nine background +# colors (default + 8 escapes). +# + +T='gYw' # The test text + +echo -e "\n 40m 41m 42m 43m\ + 44m 45m 46m 47m"; + +for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' \ + '1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' \ + ' 36m' '1;36m' ' 37m' '1;37m'; + do FG=${FGs// /} + echo -en " $FGs \033[$FG $T " + for BG in 40m 41m 42m 43m 44m 45m 46m 47m; + do echo -en "$EINS \033[$FG\033[$BG $T \033[0m"; + done + echo; +done +echo + + + + + + +Cursor Movement + + +ANSI escape sequences allow you to move the cursor around the screen at +will. This is more useful for full screen user interfaces generated by +shell scripts, but can also be used in prompts. The movement escape +sequences are as follows: + + + +- Position the Cursor: + \033[<L>;<C>H + Or + \033[<L>;<C>f + puts the cursor at line L and column C. +- Move the cursor up N lines: + \033[<N>A +- Move the cursor down N lines: + \033[<N>B +- Move the cursor forward N columns: + \033[<N>C +- Move the cursor backward N columns: + \033[<N>D + +- Clear the screen, move to (0,0): + \033[2J +- Erase to end of line: + \033[K + +- Save cursor position: + \033[s +- Restore cursor position: + \033[u + + + +The latter two codes are NOT honoured by many terminal emulators. The only +ones that I'm aware of that do are xterm and nxterm - even though the +majority of terminal emulators are based on xterm code. As far as I can +tell, rxvt, kvt, xiterm, and Eterm do not support them. They are supported +on the console. + + + +Try putting in the following line of code at the prompt (it's a little +clearer what it does if the prompt is several lines down the terminal when +you put this in): +echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D" +This should move the cursor seven lines up screen, print the word +" BASH ", and then return to where it +started to produce a normal prompt. This isn't a prompt: it's just a +demonstration of moving the cursor on screen, using colour to emphasize +what has been done. + + +Save this in a file called "clock": + + + +#!/bin/bash + +function prompt_command { +let prompt_x=$COLUMNS-5 +} + +PROMPT_COMMAND=prompt_command + +function clock { +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}\ +\[\033[s\033[1;\$(echo -n \${prompt_x})H\]\ +$BLUE[$LIGHT_RED\$(date +%H%M)$BLUE]\[\033[u\033[1A\] +$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\ +$WHITE\$$NO_COLOUR " +PS2='> ' +PS4='+ ' +} + + + +This prompt is fairly plain, except that it keeps a 24 hour clock in the +upper right corner of the terminal (even if the terminal is resized). This +will NOT work on the terminal emulators that I mentioned that don't accept +the save and restore cursor position codes. If you try to run this prompt +in any of those terminal emulators, the clock will appear correctly, but +the prompt will be trapped on the second line of the terminal. + + +See also for a +more extensive use of these codes. + + + + + + +Xterm Title Bar Manipulations + + +I'm not sure that these escape sequences strictly qualify as "ANSI Escape +Sequences," but in practice their use is almost identical so I've included +them in this chapter. + + + + +Non-printing escape sequences can be used to produce interesting effects in +prompts. To use these escape sequences, you need to enclose them in +\[ and \] (as discussed in +, telling Bash to ignore this material +while calculating the size of the prompt. Failing to include these +delimiters results in line editing code placing the cursor incorrectly +because it doesn't know the actual size of the prompt. Escape sequences +must also be preceded by \033[ in Bash prior to +version 2, or by either \033[ or +\e[ in later versions. + + + + +If you try to change the title bar of your Xterm with your prompt +when you're at the console, you'll produce garbage in your prompt. +To avoid this, test the TERM environment variable to tell if your prompt +is going to be in an Xterm. + + + + +function proml +{ +case $TERM in + xterm*) + local TITLEBAR='\[\033]0;\u@\h:\w\007\]' + ;; + *) + local TITLEBAR='' + ;; +esac + +PS1="${TITLEBAR}\ +[\$(date +%H%M)]\ +[\u@\h:\w]\ +\$ " +PS2='> ' +PS4='+ ' +} + + + +This is a function that can be incorporated into +~/.bashrc. The +function name could then be called to execute the function. The function, +like the PS1 string, is stored in the environment. Once the PS1 string is +set by the function, you can remove the function from the environment with +unset proml. Since the prompt can't +change from being in an Xterm +to being at the console, the TERM variable isn't tested every time the +prompt is generated. I used continuation markers (backslashes) in the +definition of the prompt, to allow it to be continued on multiple lines. +This improves readability, making it easier to modify and debug. + + + +The first step in creating this prompt is to test if the shell we're +starting is an xterm or not: if it is, the shell variable (${TITLEBAR}) is +defined. It consists of the appropriate escape sequences, and +\u@\h:\w, which puts +<user>@<machine>:<working directory> in the Xterm title +bar. This is particularly useful with minimized Xterms, making them more +rapidly identifiable. The other material in this prompt should be familiar +from previous prompts we've created. + + + + +The only drawback to manipulating the Xterm title bar like this occurs +when you log into a system on which you haven't set up the title bar hack: +the Xterm will continue to show the information from the previous system +that had the title bar hack in place. + + + + +A suggestion from Charles Lepple (clepple at negativezero dot +org) on setting the window title of the Xterm and the title of the +corresponding icon separately. He uses this under WindowMaker because the +title that's appropriate for an Xterm is usually too long for a 64x64 icon. +"\[\e]1;icon-title\007\e]2;main-title\007\]". He says to set this in the +prompt command because I tried putting the string in PS1, but it +causes flickering under some window managers because it results in setting +the prompt multiple times when you are editing a multi-line command (at +least under bash 1.4.x -- and I was too lazy to fully explore the reasons +behind it). I had no trouble with it in the PS1 string, but didn't +use any multi-line commands. He also points out that it works under xterm, +xwsh, and dtterm, but not gnome-terminal (which uses only the main title). +I also found it to work with rxvt, but not kterm. + + + + + + + +Colours and Cursor Movement With <command>tput</command> + + +As with so many things in Unix, there is more than one way to achieve the +same ends. A utility called tput can also be used to +move the cursor around the screen, get back information about the status of the +terminal, or set colours. man tput doesn't go into much +detail about the available commands, but Emilio Lopes e-mailed me to point +out that man terminfo will give you a +huge list of capabilities, many of which are device +independent, and therefore better than the escape sequences previously +mentioned. He suggested that I rewrite all the examples using +tput for this reason. He is correct that I should, but +I've had some trouble controlling it and getting it to do everything I want +it to. However, I did rewrite one prompt which you can see as an example: +. + + + + +Here is a list of tput capabilities that I have found useful: + + + +<command>tput</command> Colour Capabilities + + +tput setab [1-7] +Set a background colour using ANSI escape + + + +tput setb [1-7] +Set a background colour + + + +tput setaf [1-7] +Set a foreground colour using ANSI escape + + + +tput setf [1-7] +Set a foreground colour + + + + + +<command>tput</command> Text Mode Capabilities + + +tput bold +Set bold mode + + + +tput dim +turn on half-bright mode + + + +tput smul +begin underline mode + + + +tput rmul +exit underline mode + + + +tput rev +Turn on reverse mode + + + +tput smso +Enter standout mode (bold on rxvt) + + + +tput rmso +Exit standout mode + + + +tput sgr0 +Turn off all attributes (doesn't work quite as expected) + + + + + +<command>tput</command> Cursor Movement Capabilities + + +tput cup Y X +Move cursor to screen location X,Y (top left is 0,0) + + + +tput sc +Save the cursor position + + + +tput rc +Restore the cursor position + + + +tput lines +Output the number of lines of the terminal + + + +tput cols +Output the number of columns of the terminal + + + +tput cub N +Move N characters left + + + +tput cuf N +Move N characters right + + + +tput cub1 +move left one space + + + +tput cuf1 +non-destructive space (move right one space) + + + +tput ll +last line, first column (if no cup) + + + +tput cuu1 +up one line + + + + + + +<command>tput</command> Clear and Insert Capabilities + + +tput ech N +Erase N characters + + + +tput clear +clear screen and home cursor + + + +tput el1 +Clear to beginning of line + + + +tput el +clear to end of line + + + +tput ed +clear to end of screen + + + +tput ich N +insert N characters (moves rest of line forward!) + + + +tput il N +insert N lines + + + + + +This is by no means a complete list of what terminfo and +tput allow, in fact it's only the beginning. +man tput and man terminfo if you want +to know more. + + + + + + + + + + +Special Characters: Octal Escape Sequences + + +Outside of the characters that you can type on your keyboard, there are a +lot of other characters you can print on your screen. I've created a +script to allow you to check out what the font you're using has available +for you. The main command you need to use to utilize these characters is +"echo -e". The "-e" switch tells echo to enable interpretation of +backslash-escaped characters. What you see when you look at octal 200-400 +will be very different with a VGA font from what you will see with a +standard Linux font. Be warned that some of these escape sequences have +odd effects on your terminal, and I haven't tried to prevent them from +doing whatever they do. The linedraw and block characters that are used +heavily by the Bashprompt project are between octal 260 and 337 in the VGA +fonts. + + + +#!/bin/bash + +# Script: escgen + +function usage { + echo -e "\033[1;34mescgen\033[0m <lower_octal_value> [<higher_octal_value>]" + echo " Octal escape sequence generator: print all octal escape sequences" + echo " between the lower value and the upper value. If a second value" + echo " isn't supplied, print eight characters." + echo " 1998 - Giles Orr, no warranty." + exit 1 +} + +if [ "$#" -eq "0" ] +then + echo -e "\033[1;31mPlease supply one or two values.\033[0m" + usage +fi +let lower_val=${1} +if [ "$#" -eq "1" ] +then + # If they don't supply a closing value, give them eight characters. + upper_val=$(echo -e "obase=8 \n ibase=8 \n $lower_val+10 \n quit" | bc) +else + let upper_val=${2} +fi +if [ "$#" -gt "2" ] +then + echo -e "\033[1;31mPlease supply two values.\033[0m" + echo + usage +fi +if [ "${lower_val}" -gt "${upper_val}" ] +then + echo -e "\033[1;31m${lower_val} is larger than ${upper_val}." + echo + usage +fi +if [ "${upper_val}" -gt "777" ] + then + echo -e "\033[1;31mValues cannot exceed 777.\033[0m" + echo + usage +fi + +let i=$lower_val +let line_count=1 +let limit=$upper_val +while [ "$i" -lt "$limit" ] +do + octal_escape="\\$i" + echo -en "$i:'$octal_escape' " + if [ "$line_count" -gt "7" ] + then + echo + # Put a hard return in. + let line_count=0 + fi + let i=$(echo -e "obase=8 \n ibase=8 \n $i+1 \n quit" | bc) + let line_count=$line_count+1 +done +echo + + + + +You can also use xfd to display all the characters in +an X font, with the command xfd -fn <fontname>. +Clicking on any given +character will give you lots of information about that character, including +its octal value. The script given above will be useful on the console, and +if you aren't sure of the current font name. + + + + + + + + +The Bash Prompt Package + + +Availability + + +The Bash Prompt package was available at http://bash.current.nu/, and is the +work of several people, co-ordinated by Rob Current (aka BadLandZ). The +site was down in July 2001, but Rob Current assures me it will be back up +soon. The package is in beta, but offers a simple way of using multiple +prompts (or themes), allowing you to set prompts for login shells, and for +subshells (ie. putting PS1 strings in ~/.bash_profile +and ~/.bashrc). Most of the themes use the extended +VGA character set, so they look bad unless they're used with VGA fonts +(which aren't the default on most systems). Little work has been done on +this project recently: I hope there's some more progress. + + + + + + +Xterm Fonts + + +To use some of the most attractive prompts in the Bash Prompt package, you +need to get and install fonts that support the character sets expected by +the prompts. These are "VGA Fonts," which support different character sets +than regular Xterm fonts. Standard Xterm fonts support an extended +alphabet, including a lot of letters with accents. In VGA fonts, this +material is replaced by graphical characters - blocks, dots, lines. I +asked for an explanation of this difference, and Sérgio Vale e Pace +(space@gold.com.br) wrote me: + + +
+ +I love computer history so here goes: + + + +When IBM designed the first PC they needed some character codes to use, so +they got the ASCII character table (128 numbers, letters, and some +punctuation) and to fill a byte addressed table they added 128 more +characters. Since the PC was designed to be a home computer, they fill the +remaining 128 characters with dots, lines, points, etc, to be able to do +borders, and grayscale effects (remember that we are talking about 2 color +graphics). + + + +Time passes, PCs become a standard, IBM creates more powerful systems and +the VGA standard is born, along with 256 colour graphics, and IBM continues +to include their IBM-ASCII characters table. + + + +More time passes, IBM has lost their leadership in the PC market, and the +OS authors dicover that there are other languages in the world that use +non-english characters, so they add international alphabet support in their +systems. Since we now have bright and colorful screens, we can trash the +dots, lines, etc. and use their space for accented characters and some +greek letters, which you'll see in Linux. + + +
+ +
+ + +Changing the Xterm Font + + +Getting and installing these fonts is a somewhat involved process. First, +retrieve the font(s). Next, ensure they're .pcf or .pcf.gz files. If +they're .bdf files, investigate the "bdftopcf" command (ie. read the man +page). Drop the .pcf or .pcf.gz files into the +/usr/X11R6/lib/X11/fonts/misc +dir (this is the correct directory for RedHat +5.1 through 7.1, it may be different on other distributions). +cd to that directory, and run mkfontdir. +Then run xset fp rehash and/or restart your X font +server, whichever +applies to your situation. Sometimes it's a good idea to go into the +fonts.alias file in the same directory, and +create shorter alias names for the fonts. + + + +To use the new fonts, you start your Xterm program of choice with the +appropriate command to your Xterm, which can be found either in the man +page or by using the "--help" parameter on the command line. Popular terms +would be used as follows: + + + +xterm -font <fontname> + + + +OR + + + +xterm -fn <fontname> -fb <fontname-bold> +Eterm -F <fontname> +rxvt -fn <fontname> + + + +VGA fonts are available from Stumpy's ANSI Fonts +page at +http://home.earthlink.net/~us5zahns/enl/ansifont.html (which I have +borrowed from extensively while writing this). + + + +
+ + + + +Loading a Different Prompt + + +Loading a Different Prompt, Later + + +The explanations in this HOWTO have shown how to make PS1 environment +variables, or how to incorporate those PS1 and PS2 strings into functions +that could be called by ~/.bashrc or as a theme by the bashprompt +package. + + + +Using the bashprompt package, you would type bashprompt +-i to see a list of available themes. To set the prompt in +future login shells (primarily the console, but also telnet and Xterms, +depending on how your Xterms are set up), you would type +bashprompt -l themename. +bashprompt then modifies your +~/.bash_profile to call the requested theme when +it starts. To set the prompt in future subshells (usually Xterms, rxvt, +etc.), you type bashprompt -s themename, and +bashprompt modifies your ~/.bashrc file to call +the appropriate theme at startup. + + + + +See also for +Johan Kullstam's note regarding the importance of putting the PS? +strings in ~/.bashrc . + + + + + +Loading a Different Prompt, Immediately + + +You can change the prompt in your current terminal (using the example +"elite" function above) by typing source elite +followed by elite (assuming that the elite +function file is the working directory). This is somewhat cumbersome, and +leaves you with an extra function (elite) in your environment space - if +you want to clean up the environment, you would have to type +unset elite as well. This would seem like an +ideal candidate for a small shell script, but a script doesn't work here +because the script cannot change the environment of your current shell: it +can only change the environment of the subshell it runs in. As soon as the +script stops, the subshell goes away, and the changes the script made to +the environment are gone. What can change environment +variables of your current shell are environment functions. The bashprompt +package puts a function called callbashprompt into your +environment, and, while they don't document it, it can be called to load +any bashprompt theme on the fly. It looks in the theme directory it +installed (the theme you're calling has to be there), sources the function +you asked for, loads the function, and then unsets the function, thus +keeping your environment uncluttered. callbashprompt +wasn't intended to be used this way, and has no error checking, but if you +keep that in mind, it works quite well. + + + + + + +Loading Different Prompts in Different X Terms + + +If you have a specific prompt to go with a particular project, or some +reason to load different prompts at different times, you can use multiple +bashrc files instead of always using your ~/.bashrc +file. The Bash command is something like bash --rcfile +/home/giles/.bashprompt/bashrc/bashrcdan, which will start a +new version of Bash in your current terminal. To use this in combination +with a Window Manager menuing system, use a command like rxvt -e +bash --rcfile /home/giles/.bashprompt/bashrc/bashrcdan. The +exact command you use will be dependent on the syntax of your X term of +choice and the location of the bashrc file you're using. + + + + + + + + + + + +Loading Prompt Colours Dynamically + + +A "Proof of Concept" Example + + +This is a "proof of concept" more than an attractive prompt: changing +colours within the prompt dynamically. In this example, the colour of the +host name changes depending on the load (as a warning). + + + +#!/bin/bash +# "hostloadcolour" - 17 October 98, by Giles +# +# The idea here is to change the colour of the host name in the prompt, +# depending on a threshold load value. + +# THRESHOLD_LOAD is the value of the one minute load (multiplied +# by one hundred) at which you want +# the prompt to change from COLOUR_LOW to COLOUR_HIGH +THRESHOLD_LOAD=200 +COLOUR_LOW='1;34' + # light blue +COLOUR_HIGH='1;31' + # light red + +function prompt_command { +ONE=$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g") +# Apparently, "scale" in bc doesn't apply to multiplication, but does +# apply to division. +ONEHUNDRED=$(echo -e "scale=0 \n $ONE/0.01 \nquit \n" | bc) +if [ $ONEHUNDRED -gt $THRESHOLD_LOAD ] +then + HOST_COLOUR=$COLOUR_HIGH + # Light Red +else + HOST_COLOUR=$COLOUR_LOW + # Light Blue +fi +} + +function hostloadcolour { + +PROMPT_COMMAND=prompt_command +PS1="[$(date +%H%M)][\u@\[\033[\$(echo -n \$HOST_COLOUR)m\]\h\[\033[0m\]:\w]$ " +} + + + +Using your favorite editor, save this to a file named "hostloadcolour". If +you have the Bashprompt package installed, this will work as a theme. If you +don't, type source hostloadcolour and then hostloadcolour. +Either way, "prompt_command" becomes a function in your environment. +If you examine the code, you will notice that the colours ($COLOUR_HIGH and +$COLOUR_LOW) are set using only a partial colour code, ie. "1;34" instead of +"\[\033[1;34m\]", which I would have preferred. I have been unable to get +it to work with the complete code. Please let me know if you manage this. + + + + + + + + + +Prompt Code Snippets + + +This section shows how to put various pieces of information into the Bash +prompt. There are an infinite number of things that could be put in your +prompt. Feel free to send me examples, I'll try to include what I think +will be most widely used. If you have an alternate way to retrieve a piece +of information here, and feel your method is more efficient, please contact +me. It's easy to write bad code, I do it often, but it's great to write +elegant code, and a pleasure to read it. I manage it every once in a +while, and would love to have more of it to put in here. + + + + +To incorporate shell code in prompts, it has to be escaped. Usually, this +will mean putting it inside \$(<command>) so +that the output of command is substituted each time +the prompt is generated. + + + + +Please keep in mind that I develop and test this code on a single user +900 MHz Athlon with 256 meg of RAM, so the delay generated by these code +snippets doesn't usually mean much to me. To help with this, I recently +assembled a 25 MHz 486 SX with 16 meg of RAM, and you will see the output +of the "time" command for each snippet to indicate how much of a delay it +causes on a slower machine. + + + + +Built-in Escape Sequences + + +See for a complete +list of built-in escape sequences. This list is taken directly from the +Bash man page, so you can also look there. + + + + + +Date and Time + + +If you don't like the built-ins for date and time, extracting the same +information from the date command is relatively +easy. Examples already seen in this HOWTO include +date +%H%M, +which will put in the hour in 24 hour format, and the minute. +date "+%A, %d %B %Y" will give something like +"Sunday, 06 June 1999". For a full list +of the interpreted sequences, type date --help or +man date. + + + + +Relative speed: "date ..." takes about 0.12 seconds on an unloaded 486SX25. + + + + + + +Counting Files in the Current Directory + + +To determine how many files there are in the current directory, put in +ls -1 | wc -l. This uses wc +to do a count of the number of lines (-l) in the output of +ls -1. It doesn't count dotfiles. Please note that +ls -l (that's an "L" rather than a "1" as in the +previous examples) which I used in previous versions of this HOWTO will +actually give you a file count one greater than the actual count. Thanks +to Kam Nejad for this point. + + + + +If you want to count only files and NOT include symbolic links (just an +example of what else you could do), you could use ls -l | grep +-v ^l | wc -l (that's an "L" not a "1" this time, we want a +"long" listing here). grep checks for any line +beginning with "l" (indicating a link), and discards that line (-v). + + + + +Relative speed: "ls -1 /usr/bin/ | wc -l" takes about 1.03 seconds on an +unloaded 486SX25 (/usr/bin/ on this machine has 355 files). "ls -l +/usr/bin/ | grep -v ^l | wc -l" takes about 1.19 seconds. + + + + + + +Total Bytes in the Current Directory + + +If you want to know how much space the contents of the current directory +take up, you can use something like the following: + + + +let TotalBytes=0 + +for Bytes in $(ls -l | grep "^-" | awk '{ print $5 }') +do + let TotalBytes=$TotalBytes+$Bytes +done + +# The if...fi's give a more specific output in byte, kilobyte, megabyte, +# and gigabyte + +if [ $TotalBytes -lt 1024 ]; then + TotalSize=$(echo -e "scale=3 \n$TotalBytes \nquit" | bc) + suffix="b" +else if [ $TotalBytes -lt 1048576 ]; then + TotalSize=$(echo -e "scale=3 \n$TotalBytes/1024 \nquit" | bc) + suffix="kb" +else if [ $TotalBytes -lt 1073741824 ]; then + TotalSize=$(echo -e "scale=3 \n$TotalBytes/1048576 \nquit" | bc) + suffix="Mb" +else + TotalSize=$(echo -e "scale=3 \n$TotalBytes/1073741824 \nquit" | bc) + suffix="Gb" +fi +fi +fi + + + +Code courtesy (in part) of Sam Schmit (id at pt dot lu) and +his uncle Jean-Paul, who ironed out a fairly major bug in my original +code, and just generally cleaned it up. + + + +Relative speed: this process takes between 3.2 and 5.8 seconds in /usr/bin/ +(14.7 meg in the directory) on an unloaded 486SX25, depending on how much +of the information is cached (if you use this in a prompt, more or less of +it will be cached depending how long you work in the directory). + + + + + + +Checking the Current TTY + + +The tty command returns the filename of the +terminal connected to standard input. This comes in two formats on the +Linux systems I have used, either "/dev/tty4" or "/dev/pts/2". I've used +several methods over time, but the simplest I've found so far (probably +both Linux- and Bash-2.x specific) is temp=$(tty) ; echo +${temp:5}. This removes the first five characters of the +tty output, in this case "/dev/". + + + + +Previously, I used tty | sed -e "s:/dev/::", which +removes the leading "/dev/". Older systems (in my experience, RedHat +through 5.2) returned only filenames in the "/dev/tty4" format, so I used +tty | sed -e "s/.*tty\(.*\)/\1/". + + + + +An alternative method: +ps ax | grep $$ | awk '{ print $2 }'. + + + +Relative speed: the ${temp:5} method takes about 0.12 seconds on an +unloaded 486SX25, the sed-driven method takes about 0.19 seconds, the +awk-driven method takes about 0.79 seconds. + + + + + + +Stopped Jobs Count + + +Torben Fjerdingstad (tfj at fjerdingstad dot dk) wrote to +tell me that he often stops jobs and then forgets about them. He uses his +prompt to remind himself of stopped jobs. Apparently this is fairly +popular, because as of Bash 2.04, there is a standard escape sequence for +jobs managed by the shell: + + + + +[giles@zinfandel]$ export PS1='\W[\j]\$ ' +giles[0]$ man ls & +[1] 31899 +giles[1]$ xman & +[2] 31907 + +[1]+ Stopped man ls +giles[2]$ jobs +[1]+ Stopped man ls +[2]- Running xman & +giles[2]$ + + + +Note that this shows both stopped and running jobs. At the console, you +probably want the complete count, but in an xterm you're probably only +interested in the ones that are stopped. To display only these, you could +use something like the following: + + + +[giles@zinfandel]$ function stoppedjobs { +-- jobs -s | wc -l | sed -e "s/ //g" +-- } +[giles@zinfandel]$ export PS1='\W[`stoppedjobs`]\$ ' +giles[0]$ jobs +giles[0]$ man ls & +[1] 32212 + +[1]+ Stopped man ls +giles[0]$ man X & +[2] 32225 + +[2]+ Stopped man X +giles[2]$ jobs +[1]- Stopped man ls +[2]+ Stopped man X +giles[2]$ xman & +[3] 32246 +giles[2]$ sleep 300 & +[4] 32255 +giles[2]$ jobs +[1]- Stopped man ls +[2]+ Stopped man X +[3] Running xman & +[4] Running sleep 300 & + + + +This doesn't always show the stopped job in the prompt that follows +immediately after the command is executed - it probably depends on whether +the job is launched and put in the background before jobs +is run. + + + + +There is a known bug in Bash 2.02 that causes the jobs +command (a shell builtin) to return nothing to a pipe. If you try the +above under Bash 2.02, you will always get a "0" back regardless of how +many jobs you have stopped. This problem is fixed in 2.03. + + + + +Relative speed: 'jobs -s | wc -l | sed -e "s/ //g" ' takes about 0.24 +seconds on an unloaded 486SX25. + + + + + + +Load + + +The output of uptime can be used to determine both the +system load and uptime, but its output is exceptionally difficult to parse. +On a Linux system, this is made much easier to deal with by the existence +of the /proc/ file system. +cat /proc/loadavg will show you the one minute, five +minute, and fifteen minute load average, as well as a couple other numbers +I don't know the meaning of (anyone care to fill me in?). + + + + +Getting the one minute load average with a Bash construct is easy: +temp=$(cat /proc/loadavg) && echo ${temp%% *}. +Getting the five minute load average is a little more complex: +temp=$(cat /proc/loadavg) && temp=${temp#* } && echo ${temp%% +*}. There's probably a simpler way than that (anyone?) and +extending this method further to get the 15 minute average would be messy. +I'll figure it out sometime ... + + + + +A simpler, but more processor intensive method to get an individual number +such as the one minute load average, is to use awk: cat +/proc/loadavg | awk '{ print $1 }'. + + + + +For those without the /proc/ +filesystem, you can use +uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g" +and replace "\1" with "\2" or "\3" depending if you want the one minute, +five minute, or fifteen minute load average. This is a remarkably +ugly regular expression: send suggestions if you have a better one. + + + + +Relative speed: The shell-driven methods each take about 0.14 seconds on an +unloaded 486SX25. "cat /proc/loadavg | awk '{ print $1 }' " takes about +0.25 seconds. 'uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), +\(.*\...\)/\1/" -e "s/ //g" ' takes about 0.21 seconds. + + + + + + +Uptime + + +As with load, the data available through uptime is very +difficult to parse. Again, if you have the /proc/ filesystem, take advantage of it. I +wrote the following code to output just the time the system has been up: + + + + +#!/bin/bash +# +# upt - show just the system uptime, days, hours, and minutes + +let upSeconds="$(cat /proc/uptime) && echo ${temp%%.*})" +let secs=$((${upSeconds}%60)) +let mins=$((${upSeconds}/60%60)) +let hours=$((${upSeconds}/3600%24)) +let days=$((${upSeconds}/86400)) +if [ "${days}" -ne "0" ] +then + echo -n "${days}d" +fi +echo -n "${hours}h${mins}m" + + + +Output looks like "1h31m" if the system has been up less than a day, or +"14d17h3m" if it has been up more than a day. You can massage the output +to look the way you want it to. This evolved after an e-mail discussion +with David Osolkowski, who gave me some ideas. + + + + +Before I wrote that script, I had a couple emails with David O, who said +me and a couple guys got on irc and started hacking with sed and +got this: +uptime | sed -e 's/.* \(.* days,\)\? \(.*:..,\) .*/\1 \2/' -e's/,//g' -e 's/ days/d/' -e 's/ up //'. +It's ugly, and doesn't use regex nearly as well as it should, but it +works. It's pretty slow on a P75, though, so I removed it. +Considering how much uptime output varies depending on +how long a system has been up, I was impressed they managed as well as they +did. You can use this on systems without +/proc/ filesystem, but as he says, it +may be slow. + + + + +Relative speed: the "upt" script takes about 0.68 seconds on an unloaded +486SX25 (half that as a function). Contrary to David's guess, his use of +sed to parse the output of "uptime" takes only 0.22 seconds. + + + + + + +Number of Processes + + +ps ax | wc -l | tr -d " " OR +ps ax | wc -l | awk '{print $1}' +OR ps ax | wc -l | sed -e "s: ::g". In +each case, tr or awk or +sed is used to remove the undesirable whitespace. + + + +Relative speed: any one of these variants takes about 0.9 seconds on an +unloaded 486SX25. + + + + + + +Controlling the Size and Appearance of $PWD + + +Unix allows long file names, which can lead to the value of $PWD being very +long. Some people (notably the default RedHat prompt) choose to use the +basename of the current working directory (ie. "giles" if +$PWD="/home/giles"). I like more info than that, but it's often desirable +to limit the length of the directory name, and it makes the most sense to +truncate on the left. + + + +# How many characters of the $PWD should be kept +local pwdmaxlen=30 +# Indicator that there has been directory truncation: +#trunc_symbol="<" +local trunc_symbol="..." +if [ ${#PWD} -gt $pwdmaxlen ] +then + local pwdoffset=$(( ${#PWD} - $pwdmaxlen )) + newPWD="${trunc_symbol}${PWD:$pwdoffset:$pwdmaxlen}" +else + newPWD=${PWD} +fi + + + + +The above code can be executed as part of PROMPT_COMMAND, and the +environment variable generated (newPWD) can then +be included in the prompt. Thanks to Alexander Mikhailian +mikhailian at altern dot org who rewrote the code to utilize +new Bash functionality, thus speeding it up considerably. + + + + +Risto Juola (risto AT risto.net) wrote to say that he preferred to have the +"~" in the $newPWD, so he wrote another version: + + + + +pwd_length=20 + +DIR=`pwd` + +echo $DIR | grep "^$HOME" >> /dev/null + +if [ $? -eq 0 ] +then + CURRDIR=`echo $DIR | awk -F$HOME '{print $2}'` + newPWD="~$CURRDIR" + + if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ] + then + newPWD="~/..$(echo -n $PWD | sed -e "s/.*\(.\{$pwd_length\}\)/\1/")" + fi +elif [ "$DIR" = "$HOME" ] +then + newPWD="~" +elif [ $(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 + + + +Relative speed: the first version takes about 0.45 seconds on an +unloaded 486SX25. Risto's version takes about 0.80 to 0.95 seconds. The +variation in this case is due to whether or not truncation is required. + + + + + + +Laptop Power + + +If you have a laptop with APM installed, try the following PROMPT_COMMAND +to create an environment variable ${battery} you can +add to your prompt. This will indicate if AC power is connected and +percentage power remaining. AC power is indicated by a "^" (for on) and a +"v" (for off) before the percentage value. + + + + +function prompt_command { + # As much of the response of the "apm" command as is + # necessary to identify the given condition: + NO_AC_MESG="AC off" + AC_MESG="AC on" + + APMD_RESPONSE="$(apm)" + case ${APMD_RESPONSE} in + *${AC_MESG}*) + ACstat="^" + ;; + *${NO_AC_MESG}*) + ACstat="v" + ;; + esac + + battery="${temp##* }" + battery="${ACstat}${battery}" +} + + + + + +Having the Prompt Ignored on Cut and Paste + + +This one is weird but cool. Rory Toma rory at corp dot webtv dot +net wrote to suggest a prompt like this: : rory@demon +; . How is this useful? You can triple click on any previous +command (in Linux, +anyway) to highlight the whole line, then paste that line in front of +another prompt and the stuff between the ":" and the """ is ignored, +like so: + + + + +: 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 + + + +The prompt is a no-op, and if your PS2 is set to a space, multiple lines +can be cut and pasted as well. + + + + + +New Mail + + +Several people have sent me methods for checking whether or not they had +new e-mail. Most of them relied on programs that aren't on every system. +Then I received the following code from Henrik Veenpere: +cat $MAIL |grep -c ^Message-. This is simple and +elegant, and I like it. + + + + + + + + + + +Example Prompts + + +Examples on the Web + + +Over time, many people have e-mailed me excellent examples, and I've +written some interesting ones myself. There are too many to include here, +so I have put all of the examples together into some web pages which can be +seen at +http://www.shelluser.net/~giles/bashprompt/prompts/. Most of the +examples given here can also be seen on the web. + + + + + + + +A "Lightweight" 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*|rxvt*) + 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='+ ' +} + + + + + + + + + + + +[1745][giles@zinfandel:~/bin]$ + + + +The lightweight proml prompt, showing time, username, machine +name, and working directory in colour. It also modifies the title of +the terminal. + + + + + + + + +Dan's Prompt + + +Dan was a coworker of mine at the university I work at for a while. Dan +used csh and tcsh for a long time before moving to Bash, so he uses the +history number a lot. He uses "screen" a lot, and for that, it's helpful to +have the tty. The last part of his prompt is the return value of the last +executed command. Dan doesn't like having the $PWD in his prompt because it +makes the prompt grow and shrink too much. + + + + +#!/bin/bash +# Dan's prompt looks like this: +# 543,p3,0$ +# +PROMPT_COMMAND="" +function dan { +local cur_tty=$(temp=$(tty) ; echo ${temp:5}); +PS1="\!,$cur_tty,\$?\$ " +} + + + + + + + + + + + + +1004,pts/7,0$ + + + + + +Dan's prompt: history number, tty number, return value of the last executed +function. + + + + + + + + +Elite from Bashprompt Themes + + +Note that this requires a VGA font. + + + + +# Created by KrON from windowmaker on IRC +# Changed by 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="> " +} + + + + + + + + + + + + + + + + + +The elite prompt from the Bashprompt Themes. + + + + + + + + +A "Power User" Prompt + + +I actually did use this prompt for a while, but it results in noticeable +delays in the appearance of the prompt on a single-user PII-400, so I +wouldn't recommend using it on a multi-user P-100 or anything ... A +rewrite using newer Bash functionality might help, but look at +it for ideas rather than as a practical prompt. + + + + + + + + +#!/bin/bash +#---------------------------------------------------------------------- +# POWER USER PROMPT "pprom2" +#---------------------------------------------------------------------- +# +# Created August 98, Last Modified 9 November 98 by Giles +# +# Problem: when load is going down, it says "1.35down-.08", get rid +# of the negative + +function prompt_command +{ +# Create TotalMeg variable: sum of visible file sizes in current directory +local TotalBytes=0 +for Bytes in $(ls -l | grep "^-" | awk '{print $5}') +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) + +# This is used to calculate the differential in load values +# provided by the "uptime" command. "uptime" gives load +# averages at 1, 5, and 15 minute marks. +# +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}")" + +# Count visible files: +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='+ ' +} + + + + + + +Prompt Depending on Connection Type + + +Bradley M Alexander (storm@tux.org) had the excellent idea of reminding his +users what kind of connection they were using to his machine(s), so he +colour-codes prompts dependent on connection type. Here's the bashrc he +supplied to me: + + + + +# /etc/bashrc + +# System wide functions and aliases +# Environment stuff goes in /etc/profile + +# For some unknown reason bash refuses to inherit +# PS1 in some circumstances that I can't figure out. +# Putting PS1 here ensures that it gets loaded every time. + +# Set up prompts. Color code them for logins. Red for root, white for +# user logins, green for ssh sessions, cyan for telnet, +# magenta with red "(ssh)" for ssh + su, magenta for 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...Now who we be? +if [ `/usr/bin/whoami` = "root" ] ; then + USR=priv +else + USR=nopriv +fi + +#Set some prompts... +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 + + + + + + +A Prompt the Width of Your Term + + +A friend complained that he didn't like having a prompt that kept changing +size because it had $PWD in it, so I wrote this prompt that adjusts its +size to exactly the width of your term, with the working directory on the +top line of two. + + + + +#!/bin/bash +# termwide prompt with tty number +# by Giles - created 2 November 98, last tweaked 31 July 2001 +# +# This is a variant on "termwide" that incorporates the tty number. +# + +hostnam=$(hostname -s) +usernam=$(whoami) +temp="$(tty)" +# Chop off the first five chars of tty (ie /dev/): +cur_tty="${temp:5}" +unset temp + +function prompt_command { + +# Find the width of the prompt: +TERMWIDTH=${COLUMNS} + +# Add all the accessories below ... +local temp="--(${usernam}@${hostnam}:${cur_tty})---(${PWD})--" + +let fillsize=${TERMWIDTH}-${#temp} +if [ "$fillsize" -gt "0" ] +then + fill="-------------------------------------------------------------------------------------------------------------------------------------------" + # It's theoretically possible someone could need more + # dashes than above, but very unlikely! HOWTO users, + # the above should be ONE LINE, it may not cut and + # paste properly + fill="${fill:0:${fillsize}}" + newPWD="${PWD}" +fi + +if [ "$fillsize" -lt "0" ] +then + fill="" + let cut=3-${fillsize} + newPWD="...${PWD:${cut}}" +fi +} + +PROMPT_COMMAND=prompt_command + +function twtty { + +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*|rxvt*) + TITLEBAR='\[\033]0;\u@\h:\w\007\]' + ;; + *) + TITLEBAR="" + ;; +esac + +PS1="$TITLEBAR\ +$YELLOW-$LIGHT_BLUE-(\ +$YELLOW\$usernam$LIGHT_BLUE@$YELLOW\$hostnam$LIGHT_BLUE:$WHITE\$cur_tty\ +${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 " + +} + + + + + + + + + + + + + + + + + +The twtty prompt in action. + + + + + + + + + +The Floating Clock Prompt + + +I've rewritten this prompt several times. It was originally written using +octal escape sequences, but the ones I needed most for this (save and +restore cursor position) aren't honoured by one of the commonest terminal +emulators, rxvt. I rewrote it using tput, and that's +what you see here. The required tput codes seem to be +universally honoured. The body of the prompt is essentially the same as +the "Lightweight" prompt shown earlier, but a clock is kept floating in the +upper right corner of the term. It will reposition itself correctly even +if the term is resized. + + + + +#!/bin/bash + +# Rewrite of "clock" using tput + +function prompt_command { +# prompt_x is where to position the cursor to write the clock +let prompt_x=$(tput cols)-6 +# Move up one; not sure why we need to do this, but without this, I always +# got an extra blank line between prompts +tput cuu1 +tput sc +tput cup 0 ${prompt_x} +tput setaf 4 ; tput bold +echo -n "[" +tput setaf 1 +echo -n "$(date +%H%M)" +tput setaf 4 ; tput bold +echo -n "]" +tput rc +} + +PROMPT_COMMAND=prompt_command + +function clockt { +local BLUE="\[$(tput setaf 4 ; tput bold)\]" +local LIGHT_RED="\[$(tput setaf 1 ; tput bold)\]" +local WHITE="\[$(tput setaf 7 ; tput bold)\]" +local NO_COLOUR="\[$(tput sgr0)\]" +case $TERM in + xterm*|rxvt*) + TITLEBAR='\[\033]0;\u@\h:\w\007\]' + ;; + *) + TITLEBAR="" + ;; +esac + +PS1="${TITLEBAR}\ +$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\ +$WHITE\$$NO_COLOUR " +PS2='> ' +PS4='+ ' +} + + + + + + + + + + + + + + + + + +The floating clock prompt in action. The clock will stay in correct +position even if the term is resized. + + + + + + + + + +The Elegant Useless Clock Prompt + + +This is one of the more attractive (and useless) prompts I've made. +Because many X terminal emulators don't implement cursor position save and +restore, the alternative when putting a clock in the upper right corner is +to anchor the cursor at the bottom of the terminal. This builds on the +idea of the "termwide" prompt above, drawing a line up the right side of +the screen from the prompt to the clock. A VGA font is required. + + + +Note: There is an odd substitution in here, that may not print properly +being translated from SGML to other formats: I had to substitute the screen +character for \304 - I would normally have just included the sequence +"\304", but it was necessary to make this substitution in this case. + + + + +#!/bin/bash + +# This prompt requires a VGA font. The prompt is anchored at the bottom +# of the terminal, fills the width of the terminal, and draws a line up +# the right side of the terminal to attach itself to a clock in the upper +# right corner of the terminal. + +function prompt_command { +# Calculate the width of the prompt: +hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//") +# "whoami" and "pwd" include a trailing newline +usernam=$(whoami) +newPWD="${PWD}" +# Add all the accessories below ... +let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})-----" \ + | wc -c | tr -d " ") +# Figure out how much to add between user@host and PWD (or how much to +# remove from PWD) +let fillsize=${COLUMNS}-${promptsize} +fill="" +# Make the filler if prompt isn't as wide as the terminal: +while [ "$fillsize" -gt "0" ] +do + fill="${fill}Ä" + # The A with the umlaut over it (it will appear as a long dash if + # you're using a VGA font) is \304, but I cut and pasted it in + # because Bash will only do one substitution - which in this case is + # putting $fill in the prompt. + let fillsize=${fillsize}-1 +done +# Right-truncate PWD if the prompt is going to be wider than the terminal: +if [ "$fillsize" -lt "0" ] +then + let cutt=3-${fillsize} + newPWD="...$(echo -n $PWD | sed -e "s/\(^.\{$cutt\}\)\(.*\)/\2/")" +fi +# +# Create the clock and the bar that runs up the right side of the term +# +local LIGHT_BLUE="\033[1;34m" +local YELLOW="\033[1;33m" +# Position the cursor to print the clock: +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 vertical dashes down the side of the terminal: +while [ $i -ge 4 ] +do + echo -en "\033[$(($i-1));${COLUMNS}H\263" + let i=$i-1 +done + +let prompt_line=${LINES}-1 +# This is needed because doing \${LINES} inside a Bash mathematical +# expression (ie. $(())) doesn't seem to work. +} + +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 " + +} + + + + + + + +GNU Free Documentation License + + + + + + + Version 1.1, March 2000 + +
+ Copyright (C) 2000 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +
+ + + PREAMBLE + + The purpose of this License is to make a manual, textbook, + or other written document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by + others. + + This License is a kind of "copyleft", which means that + derivative works of the document must themselves be free in the + same sense. It complements the GNU General Public License, which + is a copyleft license designed for free software. + + We have designed this License in order to use it for manuals + for free software, because free software needs free documentation: + a free program should come with manuals providing the same + freedoms that the software does. But this License is not limited + to software manuals; it can be used for any textual work, + regardless of subject matter or whether it is published as a + printed book. We recommend this License principally for works + whose purpose is instruction or reference. + + + + APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work that + contains a notice placed by the copyright holder saying it can be + distributed under the terms of this License. The "Document", + below, refers to any such manual or work. Any member of the + public is a licensee, and is addressed as "you". + + A "Modified Version" of the Document means any work + containing the Document or a portion of it, either copied + verbatim, or with modifications and/or translated into another + language. + + A "Secondary Section" is a named appendix or a front-matter + section of the Document that deals exclusively with the + relationship of the publishers or authors of the Document to the + Document's overall subject (or to related matters) and contains + nothing that could fall directly within that overall subject. + (For example, if the Document is in part a textbook of + mathematics, a Secondary Section may not explain any mathematics.) + The relationship could be a matter of historical connection with + the subject or with related matters, or of legal, commercial, + philosophical, ethical or political position regarding + them. + + The "Invariant Sections" are certain Secondary Sections + whose titles are designated, as being those of Invariant Sections, + in the notice that says that the Document is released under this + License. + + The "Cover Texts" are certain short passages of text that + are listed, as Front-Cover Texts or Back-Cover Texts, in the + notice that says that the Document is released under this + License. + + A "Transparent" copy of the Document means a + machine-readable copy, represented in a format whose specification + is available to the general public, whose contents can be viewed + and edited directly and straightforwardly with generic text + editors or (for images composed of pixels) generic paint programs + or (for drawings) some widely available drawing editor, and that + is suitable for input to text formatters or for automatic + translation to a variety of formats suitable for input to text + formatters. A copy made in an otherwise Transparent file format + whose markup has been designed to thwart or discourage subsequent + modification by readers is not Transparent. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include + plain ASCII without markup, Texinfo input format, LaTeX input + format, SGML or XML using a publicly available DTD, and + standard-conforming simple HTML designed for human modification. + Opaque formats include PostScript, PDF, proprietary formats that + can be read and edited only by proprietary word processors, SGML + or XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page + itself, plus such following pages as are needed to hold, legibly, + the material this License requires to appear in the title page. + For works in formats which do not have any title page as such, + "Title Page" means the text near the most prominent appearance of + the work's title, preceding the beginning of the body of the + text. + + + + VERBATIM COPYING + + You may copy and distribute the Document in any medium, + either commercially or noncommercially, provided that this + License, the copyright notices, and the license notice saying this + License applies to the Document are reproduced in all copies, and + that you add no other conditions whatsoever to those of this + License. You may not use technical measures to obstruct or + control the reading or further copying of the copies you make or + distribute. However, you may accept compensation in exchange for + copies. If you distribute a large enough number of copies you + must also follow the conditions in section 3. + + You may also lend copies, under the same conditions stated + above, and you may publicly display copies. + + + + COPYING IN QUANTITY + + If you publish printed copies of the Document numbering more + than 100, and the Document's license notice requires Cover Texts, + you must enclose the copies in covers that carry, clearly and + legibly, all these Cover Texts: Front-Cover Texts on the front + cover, and Back-Cover Texts on the back cover. Both covers must + also clearly and legibly identify you as the publisher of these + copies. The front cover must present the full title with all + words of the title equally prominent and visible. You may add + other material on the covers in addition. Copying with changes + limited to the covers, as long as they preserve the title of the + Document and satisfy these conditions, can be treated as verbatim + copying in other respects. + + If the required texts for either cover are too voluminous to + fit legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a publicly-accessible + computer-network location containing a complete Transparent copy + of the Document, free of added material, which the general + network-using public has access to download anonymously at no + charge using public-standard network protocols. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the + authors of the Document well before redistributing any large + number of copies, to give them a chance to provide you with an + updated version of the Document. + + + + MODIFICATIONS + + You may copy and distribute a Modified Version of the + Document under the conditions of sections 2 and 3 above, provided + that you release the Modified Version under precisely this + License, with the Modified Version filling the role of the + Document, thus licensing distribution and modification of the + Modified Version to whoever possesses a copy of it. In addition, + you must do these things in the Modified Version: + + + Use in the Title Page + (and on the covers, if any) a title distinct from that of the + Document, and from those of previous versions (which should, if + there were any, be listed in the History section of the + Document). You may use the same title as a previous version if + the original publisher of that version gives permission. + + + List on the Title Page, + as authors, one or more persons or entities responsible for + authorship of the modifications in the Modified Version, + together with at least five of the principal authors of the + Document (all of its principal authors, if it has less than + five). + + + State on the Title page + the name of the publisher of the Modified Version, as the + publisher. + + + Preserve all the + copyright notices of the Document. + + + Add an appropriate + copyright notice for your modifications adjacent to the other + copyright notices. + + + Include, immediately + after the copyright notices, a license notice giving the public + permission to use the Modified Version under the terms of this + License, in the form shown in the Addendum below. + + + Preserve in that license + notice the full lists of Invariant Sections and required Cover + Texts given in the Document's license notice. + + + Include an unaltered + copy of this License. + + + Preserve the section + entitled "History", and its title, and add to it an item stating + at least the title, year, new authors, and publisher of the + Modified Version as given on the Title Page. If there is no + section entitled "History" in the Document, create one stating + the title, year, authors, and publisher of the Document as given + on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. + + + Preserve the network + location, if any, given in the Document for public access to a + Transparent copy of the Document, and likewise the network + locations given in the Document for previous versions it was + based on. These may be placed in the "History" section. You + may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. + + + In any section entitled + "Acknowledgements" or "Dedications", preserve the section's + title, and preserve in the section all the substance and tone of + each of the contributor acknowledgements and/or dedications + given therein. + + + Preserve all the + Invariant Sections of the Document, unaltered in their text and + in their titles. Section numbers or the equivalent are not + considered part of the section titles. + + + Delete any section + entitled "Endorsements". Such a section may not be included in + the Modified Version. + + + Do not retitle any + existing section as "Endorsements" or to conflict in title with + any Invariant Section. + + + + If the Modified Version includes new front-matter sections + or appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section entitled "Endorsements", provided it + contains nothing but endorsements of your Modified Version by + various parties--for example, statements of peer review or that + the text has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover + Text, and a passage of up to 25 words as a Back-Cover Text, to the + end of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by + this License give permission to use their names for publicity for + or to assert or imply endorsement of any Modified Version. + + + + COMBINING DOCUMENTS + + You may combine the Document with other documents released + under this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice. + + The combined work need only contain one copy of this + License, and multiple identical Invariant Sections may be replaced + with a single copy. If there are multiple Invariant Sections with + the same name but different contents, make the title of each such + section unique by adding at the end of it, in parentheses, the + name of the original author or publisher of that section if known, + or else a unique number. Make the same adjustment to the section + titles in the list of Invariant Sections in the license notice of + the combined work. + + In the combination, you must combine any sections entitled + "History" in the various original documents, forming one section + entitled "History"; likewise combine any sections entitled + "Acknowledgements", and any sections entitled "Dedications". You + must delete all sections entitled "Endorsements." + + + + COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and + other documents released under this License, and replace the + individual copies of this License in the various documents with a + single copy that is included in the collection, provided that you + follow the rules of this License for verbatim copying of each of + the documents in all other respects. + + You may extract a single document from such a collection, + and distribute it individually under this License, provided you + insert a copy of this License into the extracted document, and + follow this License in all other respects regarding verbatim + copying of that document. + + + + AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, does not as a whole count as a + Modified Version of the Document, provided no compilation + copyright is claimed for the compilation. Such a compilation is + called an "aggregate", and this License does not apply to the + other self-contained works thus compiled with the Document, on + account of their being thus compiled, if they are not themselves + derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to + these copies of the Document, then if the Document is less than + one quarter of the entire aggregate, the Document's Cover Texts + may be placed on covers that surround only the Document within the + aggregate. Otherwise they must appear on covers around the whole + aggregate. + + + + TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires + special permission from their copyright holders, but you may + include translations of some or all Invariant Sections in addition + to the original versions of these Invariant Sections. You may + include a translation of this License provided that you also + include the original English version of this License. In case of + a disagreement between the translation and the original English + version of this License, the original English version will + prevail. + + + + TERMINATION + + You may not copy, modify, sublicense, or distribute the + Document except as expressly provided for under this License. Any + other attempt to copy, modify, sublicense or distribute the + Document is void, and will automatically terminate your rights + under this License. However, parties who have received copies, or + rights, from you under this License will not have their licenses + terminated so long as such parties remain in full + compliance. + + + + FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised + versions of the GNU Free Documentation License from time to time. + Such new versions will be similar in spirit to the present + version, but may differ in detail to address new problems or + concerns. See http://www.gnu.org/copyleft/. + + Each version of the License is given a distinguishing + version number. If the Document specifies that a particular + numbered version of this License "or any later version" applies to + it, you have the option of following the terms and conditions + either of that specified version or of any later version that has + been published (not as a draft) by the Free Software Foundation. + If the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. + + + + How to use this License for your documents + + To use this License in a document you have written, include + a copy of the License in the document and put the following + copyright and license notices just after the title page: + +
+ Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + A copy of the license is included in the section entitled "GNU + Free Documentation License". +
+ + If you have no Invariant Sections, write "with no Invariant + Sections" instead of saying which ones are invariant. If you have + no Front-Cover Texts, write "no Front-Cover Texts" instead of + "Front-Cover Texts being LIST"; likewise for Back-Cover + Texts. + + If your document contains nontrivial examples of program + code, we recommend releasing these examples in parallel under your + choice of free software license, such as the GNU General Public + License, to permit their use in free software. +
+ +
+ + +
+ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/clockt.jpg b/LDP/howto/docbook/Bash-Prompt-HOWTO/clockt.jpg new file mode 100644 index 00000000..167d450a Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/clockt.jpg differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/clockt.png b/LDP/howto/docbook/Bash-Prompt-HOWTO/clockt.png new file mode 100644 index 00000000..22f7da88 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/clockt.png differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/dan.jpg b/LDP/howto/docbook/Bash-Prompt-HOWTO/dan.jpg new file mode 100644 index 00000000..78255bd7 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/dan.jpg differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/dan.png b/LDP/howto/docbook/Bash-Prompt-HOWTO/dan.png new file mode 100644 index 00000000..80600622 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/dan.png differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/elite.jpg b/LDP/howto/docbook/Bash-Prompt-HOWTO/elite.jpg new file mode 100644 index 00000000..19cabe06 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/elite.jpg differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/elite.png b/LDP/howto/docbook/Bash-Prompt-HOWTO/elite.png new file mode 100644 index 00000000..b5ceb870 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/elite.png differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/proml.jpg b/LDP/howto/docbook/Bash-Prompt-HOWTO/proml.jpg new file mode 100644 index 00000000..d6448c47 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/proml.jpg differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/proml.png b/LDP/howto/docbook/Bash-Prompt-HOWTO/proml.png new file mode 100644 index 00000000..431b3a2b Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/proml.png differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/twtty.jpg b/LDP/howto/docbook/Bash-Prompt-HOWTO/twtty.jpg new file mode 100644 index 00000000..acfbab5d Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/twtty.jpg differ diff --git a/LDP/howto/docbook/Bash-Prompt-HOWTO/twtty.png b/LDP/howto/docbook/Bash-Prompt-HOWTO/twtty.png new file mode 100644 index 00000000..120f9712 Binary files /dev/null and b/LDP/howto/docbook/Bash-Prompt-HOWTO/twtty.png differ diff --git a/LDP/howto/docbook/HOWTO-INDEX/howtoChap.sgml b/LDP/howto/docbook/HOWTO-INDEX/howtoChap.sgml index 880dbd30..0d0317c9 100644 --- a/LDP/howto/docbook/HOWTO-INDEX/howtoChap.sgml +++ b/LDP/howto/docbook/HOWTO-INDEX/howtoChap.sgml @@ -182,7 +182,7 @@ Bash-Prompt-HOWTO, Bash Prompt HOWTO -Updated: July 2001. +Updated: August 2001. Creating and controlling terminal and xterm prompts is discussed, including incorporating standard escape sequences to give username, current working directory, time, etc. @@ -405,7 +405,7 @@ potential effects of a security compromise. Cluster-HOWTO, Linux Cluster HOWTO -Updated: June 2001. +Updated: August 2001. How to set up high-performance Linux computing clusters. diff --git a/LDP/howto/docbook/HOWTO-INDEX/hwSect.sgml b/LDP/howto/docbook/HOWTO-INDEX/hwSect.sgml index 493f9544..3be416cc 100644 --- a/LDP/howto/docbook/HOWTO-INDEX/hwSect.sgml +++ b/LDP/howto/docbook/HOWTO-INDEX/hwSect.sgml @@ -100,7 +100,7 @@ various issues related to this. Cluster-HOWTO, Linux Cluster HOWTO -Updated: June 2001. +Updated: August 2001. How to set up high-performance Linux computing clusters. @@ -845,7 +845,7 @@ Linux-Modem-Sharing Modem sharing mini-HOWTO -Updated: July 2001. +Updated: August 2001. Describes how to setup a Linux system in order to share a modem attached to this system with other systems over a TCP/IP network. diff --git a/LDP/howto/docbook/HOWTO-INDEX/miniChap.sgml b/LDP/howto/docbook/HOWTO-INDEX/miniChap.sgml index 8f994e39..e04693c0 100644 --- a/LDP/howto/docbook/HOWTO-INDEX/miniChap.sgml +++ b/LDP/howto/docbook/HOWTO-INDEX/miniChap.sgml @@ -754,7 +754,7 @@ Linux-Modem-Sharing Modem sharing mini-HOWTO -Updated: July 2001. +Updated: August 2001. Describes how to setup a Linux system in order to share a modem attached to this system with other systems over a TCP/IP network. diff --git a/LDP/howto/docbook/HOWTO-INDEX/osSect.sgml b/LDP/howto/docbook/HOWTO-INDEX/osSect.sgml index 74603ec4..8e14f91c 100644 --- a/LDP/howto/docbook/HOWTO-INDEX/osSect.sgml +++ b/LDP/howto/docbook/HOWTO-INDEX/osSect.sgml @@ -986,7 +986,7 @@ Bash-Prompt-HOWTO, Bash Prompt HOWTO -Updated: July 2001. +Updated: August 2001. Creating and controlling terminal and xterm prompts is discussed, including incorporating standard escape sequences to give username, current working directory, time, etc.