100% found this document useful (1 vote)
52 views

Environment Variables (03-08)

This document discusses how to customize the Bash shell environment through environment variables to make it more comfortable. It provides examples of setting variables like PS1 to customize the command prompt, PROMPT_COMMAND to update the window title, IGNOREEOF to ignore multiple Ctrl-D inputs, and others. It also discusses where these customizations need to be saved to make them permanent in login shells versus regular shells.

Uploaded by

api-3759734
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
52 views

Environment Variables (03-08)

This document discusses how to customize the Bash shell environment through environment variables to make it more comfortable. It provides examples of setting variables like PS1 to customize the command prompt, PROMPT_COMMAND to update the window title, IGNOREEOF to ignore multiple Ctrl-D inputs, and others. It also discusses where these customizations need to be saved to make them permanent in login shells versus regular shells.

Uploaded by

api-3759734
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 5

Make bash more comfortable through environment

variables

Consulting a manpage for bash can be a daunting read,


especially if you're not precisely sure what you're looking for.
But when you have the time to devote to it, the manpage for
bash is well worth the read. This is a shell just oozing with all
sorts of arcane (but wonderfully useful) features, most of
which are simply disabled by default.

Let's start by looking at some useful environment variables,


and some useful values to which to set them:
export PS1=`echo -ne
"\033[0;34m\u@\h:\033[0;36m\w\033[0;34m\$\033[0;37m "`

As you probably know, the PS1 variable sets the default


system prompt, and automatically interprets escape
sequences such as \u (for username) and \w (for the current
working directory.) As you may not know, it is possible to
encode ANSI escape sequences in your shell prompt, to give
your prompt a colorized appearance. We wrap the whole
string in backticks (`) in order to get echo to generate the
magic ASCII escape character. This is executed once, and
the result is stored in PS1. Let's look at that line again, with
boldface around everything that isn't an ANSI code:

export PS1=`echo -ne


"\033[0;34m\u@\h:\033[0;36m\w\033[0;34m\$\033
[0;37m "`
You should recognize the familiar \u@\h:\w\$prompt that
we've all grown to know and love. By changing the numbers
just after each semicolon, you can set the colors of each part
of the prompt to your heart's content.
Along the same lines, here's a handy command that is run
just before bash gives you a prompt:
export PROMPT_COMMAND='echo -ne
"\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

(We don't need backticks for this one, as bash is expecting it


to contain an actual command, not a string.) This time, the
escape sequence is the magic string that manipulates the
titlebar on most terminal windows (such as xterm, rxvt,
eterm, gnometerm, etc.). Anything after the semicolon and
before the \007 gets printed to your titlebar every time you
get a new prompt. In this case, we're displaying your
username, the host you're logged into, and the current
working directory. This is quite handy for being able to tell at
a glance (or even while within vim) to which machine you're
logged in, and to what directory you're about to save your
file. See [Hack #59] if you'd like to update your titlebar in real
time instead of at every new bash prompt.

Have you ever accidentally hit ^D too many times in a row,


only to find yourself logged out? You can tell bash to ignore
as many consecutive ^D hits as you like:
export IGNOREEOF=2

This makes bash follow the Snark rule ("What I tell you three
times is true") and only log you out if you hit ^D three times
in a row. If that's too few for you, feel free to set it to 101 and
bash will obligingly keep count for you.

Having a directory just off of your home that lies in your path
can be extremely useful (for keeping scripts, symlinks, and
other random pieces of code.) A traditional place to keep this
directory is in bin underneath your home directory. If you use
the ~ expansion facility in bash, like this:
export PATH=$PATH:~/bin

then the path will always be set properly, even if your home
directory ever gets moved (or if you decide you want to use
this same line on multiple machines with potentially different
home directories — as in movein.sh). See [Hack #72].

Did you know that just as commands are searched for in the
PATH variable (and manpages are searched for in the
MANPATH variable), directories are likewise searched for in
the CDPATH variable every time you issue a cd? By default,
it is only set to ".", but can be set to anything you like:
export CDPATH=.:~

This will make cd search not only the current directory, but
also your home directory for the directory you try to change
to. For example:
rob@caligula:~$ ls
bin/ devel/ incoming/ mail/ test/ stuff.txt
rob@caligula:~$ cd /usr/local/bin
rob@caligula:/usr/local/bin$ cd mail
bash: cd: mail: No such file or directory
rob@caligula:/usr/local/bin$ export CDPATH=.:~
rob@caligula:/usr/local/bin$ cd mail
/home/rob/mail
rob@caligula:~/mail$

You can put as many paths as you like to search for in


CDPATH, separating each with a : (just as with the PATH
and MANPATH variables.)

We all know about the up arrow and the history command.


But what happens if you accidentally type something
sensitive on the command line? Suppose you slip while
typing and accidentally type a password where you meant to
type a command. This accident will faithfully get recorded to
your ~/.bash_history file when you logout, where another
unscrupulous user might happen to find it. Editing your
.bash_history manually won't fix the problem, as the file gets
rewritten each time you log out.

To clear out your history quickly, try this from the command
line:
export HISTSIZE=0

This completely clears out the current bash history and will
write an empty .bash_history on logout. When you log back
in, your history will start over from scratch but will otherwise
work just as before. From now on, try to be more careful!

Do you have a problem with people logging into a machine,


then disconnecting their laptop and going home without
logging back out again? If you've ever run a w and seen a
bunch of idle users who have been logged in for several
days, try setting this in their environment:
export TMOUT=600

The TMOUT variable specifies the number of seconds that


bash will wait for input on a command line before logging the
user out automatically. This won't help if your users are
sitting in a vi window but will alleviate the problem of users
just sitting at an idle shell. Ten minutes might be a little short
for some users, but kindly remind them that if they don't like
the system default, they are free to reset the variable
themselves.

This brings up an interesting point: exactly where do you go


to make any of these environment changes permanent?
There are several files that bash consults when starting up,
depending on whether the shell was called at login or from
within another shell.
From bash(1), on login shells:

...it first reads and executes commands from the file


/etc/profile, if that file exists. After reading that file, it looks for
~/.bash_profile, ~/.bash_login, and ~/.profile, in that order,
and reads and executes commands from the first one that
exists and is readable . . . . When a login shell exits, bash
reads and executes commands from the file ~/.bash_logout,
if it exists.

For all other shells:

bash reads and executes commands from ~/.bashrc, if that


file exists.

For the full definition of what constitutes a login shell (and for
a whole bunch of information about the environment you
work in every day), consult bash(1).

You might also like