BASH Shell Settings for Sysadmin (optional)

Ian! D. Allen – www.idallen.com

Fall 2015 - September to December 2015 - Updated 2017-02-06 02:44 EST

1 Introduction to BASH Shell Settings for SysadminIndexup to index

This material is optional.

Shells have a number of options and settings that make doing system administration work easier. You can also define aliases and functions to create your own command names or set common options on commands that are useful to system administrators.

The settings described in this file are useful for systems administrators, but they can be confusing if you don’t know what they mean or how they work.

If you don’t know the meaning of a setting, don’t use it. You can RTFM in the bash man page for all BASH settings.

None of the settings in this file are needed for this course. Everything here is optional. Use it if you find it useful.

Tests and exams in this course presume no options or aliases. Do not answer questions on tests based on these options or aliases. Always presume that you have no aliases and that the shell is running with the default options.

A common mistake is to set failglob and/or noclobber and then get different error messages than the ones expected in tests and exams, where these options are not enabled. Don’t do that.

1.1 BASH Shell Options for System AdministratorsIndexup to index

Do not set any options that you do not understand!

Below are described several BASH shell options for a sysadmin that you might put in the interactive section of your .bashrc (below the exit if not interactive line):

shopt -s failglob
set -o ignoreeof
set -o noclobber
set -o notify
set -o nounset
set -o physical
set -o interactive-comments

Here are some quick explanations (RTFM man bash for details):

1.1.1 shopt -s failglobIndexup to index

Give an error message if a GLOB fails to match any pathnames, instead of silently returning the GLOB pattern unchanged. (If a sysadmin uses an unquoted GLOB pattern, s/he expects it to match something. If s/he doesn’t want the shell to see the GLOB characters, s/he puts quotes around the string.)

1.1.2 set -o ignoreeofIndexup to index

The shell will ignore ^D (EOF) at the prompt; type exit to exit.

1.1.3 set -o noclobberIndexup to index

Protects files from being overwritten by the shell when shell output >file redirection is used. As a sysadmin, I almost never use redirection to overwrite an existing file, so turning on this option prevents me from doing so accidentally:

$ rm -f foo
$ date >foo                # creates new file
$ date >foo                # silently overwrites existing file
$ ls   >foo                # silently overwrites existing file
$ who  >foo                # silently overwrites existing file
$ set -o noclobber
$ date >foo                # does not overwrite
bash: foo: cannot overwrite existing file
$ ls   >foo                # does not overwrite
bash: foo: cannot overwrite existing file
$ who  >foo                # does not overwrite
bash: foo: cannot overwrite existing file

With this option enabled, you must use the “force” syntax >|file (that’s a pipe character) to force overwriting an existing file using shell output redirection, e.g.

$ set -o noclobber
$ date >foo                 # does not overwrite
bash: foo: cannot overwrite existing file
$ date >| foo               # FORCED overwrite of existing file

1.1.4 set -o notifyIndexup to index

Notifies user immediately when a background job (started with & or bg) completes. Without this, you won’t be told that the background job is done until you push an ENTER.

1.1.5 set -o nounsetIndexup to index

Displays an error when expanding a variable that has not been set. Essential for detecting typing errors in variable names! Without this shell option set, your variable name typing mistakes go unnoticed and silently result in empty expansions:

$ foo=/tmp/somewhere
$ ln -s /etc/passwd $goo    # typing error silently does empty expansion
$ ls -l /tmp/somewhere      # desired symlink was not created
ls: cannot access /tmp/somewhere: No such file or directory
$ ls -l passwd              # created wrong symlink name in current dir
lrwxrwxrwx  1 me me 11 Jan 1 1:00 passwd -> /etc/passwd

With this option set, your variable name typing mistakes are immediately obvious:

$ set -o nounset
$ foo=/tmp/somewhere
$ ln -s /etc/passwd $goo    # typing error causes shell error now
bash: goo: unbound variable
$ ln -s /etc/passwd $foo    # fix the typing mistake
$ ls -l /tmp/somewhere
lrwxrwxrwx  1 me me 11 Jan 1 1:01 /tmp/somewhere -> /etc/passwd

1.1.6 set -o physicalIndexup to index

Expand all symbolic links in the output of pwd and when using cd so that you see and use the real physical directory names and paths. Essential for system administrators to know exactly where you are in the file system. Without -o physical, your real current working directory is hidden from you across symbolic links:

$ set +o physical    # turn OFF physical (NOT RECOMMENDED)
$ cd /tmp
$ ln -s -f /var/lib/vim/addons foo ; ls -l foo
lrwxrwxrwx 1 xxx xxx 19 Mar 16 15:17 foo -> /var/lib/vim/addons
$ cd foo ; pwd ; /bin/pwd       # use built-in pwd and external pwd
/tmp/foo                        # this is a lie - is not real location
/var/lib/vim/addons             # correct location from external pwd
$ ls ..                         # shows content of /var/lib/vim, not /tmp
addons
$ cd .. ; pwd    # incorrectly goes back to /tmp, not up to /var/lib/vim
/tmp

As you can see above, the built-in pwd shows your current working directory incorrectly, and cd .. doesn’t behave correctly, based on your actual current working directory. Confusingly, ls .. and cd .. access different directories!

With -o physical all the above problems go away. The ls .. and cd .. both work as expected:

$ set -o physical    # turn ON physical
$ cd /tmp
$ ln -s -f /var/lib/vim/addons foo ; ls -l foo
lrwxrwxrwx 1 xxx xxx 19 Mar 16 15:17 foo -> /var/lib/vim/addons
$ cd foo ; pwd ; /bin/pwd       # use built-in pwd and external pwd
/var/lib/vim/addons             # correct location from built-in pwd
/var/lib/vim/addons             # correct location from external pwd
$ ls ..                         # shows content of /var/lib/vim, as expected
addons
$ cd .. ; pwd    # correctly goes up to /var/lib/vim, as expected
/var/lib/vim

Read this for a Full Discussion of option Physical

1.1.7 set -o interactive-commentsIndexup to index

Allow # to comment out any following text when typed interactively, e.g. echo a b # this text is not seen

1.2 BASH Shell Aliases for System AdministratorsIndexup to index

Do not set any aliases that you do not understand!

If you don’t know the meaning of an alias, don’t use it. You can RTFM in command man pages to learn about options to commands.

Below are described several BASH shell aliases for a sysadmin that you might put in the interactive section of your .bashrc (below the exit if not interactive line):

alias l='less'
alias mv='mv -i'
alias cp='cp -i -p'
alias ls='ls -abp --color=auto'
alias grep='grep --color=auto'
alias fgrep='grep -F --color=auto'

RTFM to understand what each alias does.

DO NOT alias rm to rm -i, since it requires you to confirm every removal and quickly loses any protective value as you get used to always typing yes without thinking.

1.3 BASH History Settings for System AdministratorsIndexup to index

Do not change any history settings that you do not understand!

Many of these useful settings may already be set by your instructor. Don’t change anything that is already working!

As system administrators, having a long history of previous commands available is useful. The number of commands to keep in memory and number of commands to save to disk (in the .bash_history file) are controlled by the BASH shell variables HISTSIZE and HISTFILESIZE.

Having all your shells append their history, rather than overwrite the history file, is also useful. Having the shells append the history after each command, instead of waiting until the shell exits, is also helpful.

Below are some suggested settings to preserve a long history. Many of these may already be set in your account by your instructor:

export HISTSIZE=2000
export HISTFILESIZE=1000000
export HISTCONTROL=ignoredups
export HISTTIMEFORMAT=
export PROMPT_COMMAND='history -a'
shopt -s cmdhist
shopt -s histappend

See man bash for the details on all the above variables and options.

2 Summary of .bash_profile and .bashrcIndexup to index

Do not set any options or aliases in your .bashrc that you do not understand! If you don’t know the meaning of a setting, don’t use it. You can RTFM in the bash man page for all BASH settings, and RTFM in command man pages to learn about options to commands.

  1. Your .bashrc file must not produce any output when read by a non-interactive shell. File transfer programs will fail if your .bashrc file produces output that corrupts the file transfer.

  2. Your profile files are not re-read by your current shell after you edit them – you have to tell your current shell to re-read the file to make the new content take effect in the current shell, e.g. type source ./.bashrc

  3. Do not set the PS1 prompt string in any start-up file unless it is already set, indicating an interactive shell. Do not produce any output in any start-up file unless the shell is interactive (has PS1 set non-empty). The exit if not interactive line ensures this.

  4. You can choose any PS1 prompt string you like.

Author: 
| Ian! D. Allen, BA, MMath  -  idallen@idallen.ca  -  Ottawa, Ontario, Canada
| Home Page: http://idallen.com/   Contact Improv: http://contactimprov.ca/
| College professor (Free/Libre GNU+Linux) at: http://teaching.idallen.com/
| Defend digital freedom:  http://eff.org/  and have fun:  http://fools.ca/

Plain Text - plain text version of this page in Pandoc Markdown format

Campaign for non-browser-specific HTML   Valid XHTML 1.0 Transitional   Valid CSS!   Creative Commons by nc sa 3.0   Hacker Ideals Emblem   Author Ian! D. Allen