May the source be with you, but remember the KISS principle ;-)
Home Switchboard Unix Administration Red Hat TCP/IP Networks Neoliberalism Toxic Managers
(slightly skeptical) Educational society promoting "Back to basics" movement against IT overcomplexity and  bastardization of classic Unix

Bash as interactive command interpreter


See also

Best Shell Books

Recommended Links Papers, ebooks  tutorials

Customizing Shell Dot Files: .profile, RC-file, and history

Advanced navigation

Command history reuse



Directory favorites


Brace Expansion

Bash customization

Command completion


Shell Prompts Customarization Annoying colors on Linux command line Process Substitution in Shell Strange Files Deletion and Renaming Input and output redirection Restricted Shell   Bourne Shell and portability
Debugging Pretty Printing Vi editing mode Readline and inputrc Scripts Collections Loops in Shell Pipes in Loops  

Pushd, popd

Regular Expressions

Classic Unix Tools

Sysadmin Horror Stories

Unix shells history

bash Tips and Tricks

Unix Shell Tips and Tricks


Bash has a long history of development and is now in version 4. As this is the dominant version we will cover it.  While it is mostly compatible with version 3.x it contain several useful enhancements such as autocd, option -p in declare statement, &>> and |& redirects, etc.

Bash as a login shell is defined in /etc/passwd file. If other shell is defined by your sysadmin you usually ask him/her to change. If not you can stull run bash envoking it yourself. To make bash as a default login shell, run the following command:

$ chsh -s /bin/bash

At the same time, no matter what version of bash is used typical user account in Linux is still in "stone age" often without customized prompts, useful aliases and functions. Instead of using environment modules many still  are redefining PATH and LD_LIBRARY_PATH directly in .bashrc

Listing Files

The ls (list) command shows the contents of the current directory. Although ls is a familiar command available on all Unix-like operating system, Linux uses the ls command from the GNU fileutils project and has many special switches and features.

$ ls

ls has switches that affect how the files are listed, including the level of detail, the sorting order, and the number of columns.

Most Linux distributions set up certain defaults for ls command. Red Hat, for example, has the -q  and -F  switches on by default. From the point of view of script writing, it's not safe to use the ls command in a script without specifying the appropriate switches because you can't be sure which defaults a particular distribution uses.

ls hides files that begin with a period. This is the Linux convention for configuration files, history files, and other files that a user isn't normally interested in. To see these files, use the -A (all) switch. Use -a (absolutely all) to show the implicit . and .. files as well.

$ ls -A
.bash_history  .bash_logout  .bash_profile  .bashrc  archive  orders.txt

The filenames can be printed in color to show the kind of file they are. The colors are defined in a file /etc/DIR_COLORS. You can customize the colors using a .dir_colors file in your own directory. The format of the file is described in the /etc/DIR_COLORS file.

To display the files without color and with symbols instead, use the --color and --classify (or -F) switches. (On most Linux distributions, this feature is turned on using aliases.)

$ ls --color=never --classify
archive/*  orders.txt

The classify symbols are directories (/), programs (*), symbolic links (@), pipes (|), and Unix domain socket files (=). These symbols are not a part of the name: They are hints as to the type of file. In this example, archive is a directory and is a program.

Another very important switch is --hide-control-chars (or -q). Linux filenames can contain any character, even control characters. It is possible to create a filename with hidden characters in the name. In these cases, you can't rename or delete the file unless you know what the hidden characters are. Contrary to what the name implies, the --hide-control-chars switch displays any unprintable characters in the filename as question marks, making their locations visible.

$ rm orders.txt
rm: orders.txt non-existent
$ ls --color=never --classify --hide-control-chars
archive/*  orde?rs.txt

A complete list of switches appears at the end of this chapter.

Build-in macros for directories

Born-shell family has special macros that expand to the home directory. They can be used only outside strings:

Getting Help

!!! bash help system is hopelessly outdated and not very informative. The same is true about man pages. you are better off browsing them from Internet. For example

Linux man pages

The Bash shell comes with a built-in help command to describe the various built-in Bash commands. The -s switch displays a summary for the command you specify.

$ help -s printf
printf: printf format [arguments]

Help only describes Bash commands. To get help on Linux commands, you need to use the man (manual) command.

$ man date

Linux divides its manual pages into a number of logical volumes. man displays any matching entries from any volume. Volume 1 contains the commands you can execute from the shell. To restrict your search to shell commands, use man 1.

$ man 1 date

If there are pages in more than one manual volume, only the page from the first volume that matches your search is displayed. To find matching pages across all manual volumes, use the -a (all) switch.

The -k switch searches the Linux manual for a particular keyword and lists all man pages referring to that keyword.

$ man 1 -k alias

The command help type gives you different information than man 1 type. The help type command tells you about Bash's built-in type command, whereas the man 1 type command tells you about the Linux type command. If you are not sure whether a command is a Bash command, always try the help command before using the man command.

Fixing the Display

There will be times when a Bash session becomes unusable.

Certain character sequences can lock your display, hide what you type, or change the characters being shown into strange symbols. This can happen, for example, when you're trying to display a binary file.

The reset command attempts to restore a Bash session to a safe, sane state.

If reset fails, you might also need to use stty sane to restore the session to a normal state.

The clear command clears the display and returns the cursor to the upper-left corner.

Working with Files

There are several Linux commands for removing, copying, and moving files.

mkdir (make directory) creates a new directory. Use mkdir to organize your files.

$ mkdir prototypes
$ ls -l
total 4
drwxr-xr-x   2 ken      users        4096 Jan 24 12:50 prototypes

There are two switches for mkdir:

$ mkdir --parents --mode=550 read_only/backup/january
$ ls -l
total 4
drwxr-xr-x   2 ken      users        4096 Jan 24 12:50 backup
drwxr-xr-x   3 ken      users        4096 Jan 24 12:51 read_only
$ ls -l read_only/backup
total 4
dr-xr-x---   2 ken      users        4096 Jan 24 12:51 january

The values for mode are discussed with the chmod command in Chapter 15, “Shell Security.” However, when --parents is used, the --mode affects only the final directory in the list.

RM and RMDIR commands

rmdir (remove directory) deletes a directory. The directory must be empty before it can be removed. There are two switches:

$ rmdir read_only
rmdir: read_only: Directory not empty
$ rmdir --parents read_only/backup/january/

The rm (remove) command permanently deletes files. If the file is a symbolic or hard link, it removes the link but leaves the file intact.

$ rm old_notes.txt
$ ls old_notes.txt
ls: old_notes.txt: No such file or directory

There are several switches for rm:

Using the --recursive and --force switches simultaneously removes all the specified files, including all subdirectories, without warning. Make sure you are deleting the correct files.

Some Linux distributions have the --interactive switch on by default so that rm requires that you confirm when you want to delete a particular file.

$ rm --interactive old_notes.txt
rm: remove 'old_notes.txt'? y

Normally rm won't delete a directory, but the --recursive switch deletes any directories encountered.

CP command

The cp (copy) command copies files from any location to another. If the final file listed is a directory, copy copies the other files into that directory.

!!! CP does not preserve a timestamp -- always use -p  or rsync. 

All switches.

-a, --archive
same as -dR --preserve=all
make a backup of each existing destination file
makes a backup; like --backup but does not accept an argument
copy contents of special files when recursive
same as --no-dereference --preserve=links
-f, --force
if an existing destination file cannot be opened, remove it and try again (redundant if the -n option is used)
-i, --interactive
prompt before overwrite (overrides a previous -n option)
follow command-line symbolic links in SOURCE
-l, --link
link files instead of copying
-L, --dereference
always follow symbolic links in SOURCE
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
-P, --no-dereference
never follow symbolic links in SOURCE
same as --preserve=mode,ownership,timestamps
preserve the specified attributes (default: mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all
same as --preserve=context
don't preserve the specified attributes
use full source file name under DIRECTORY
-R, -r, --recursive
copy directories recursively
control clone/CoW copies. See below.
remove each existing destination file before attempting to open it (contrast with --force)
control creation of sparse files. See below.
remove any trailing slashes from each SOURCE argument
-s, --symbolic-link
make symbolic links instead of copying
-S, --suffix=SUFFIX
override the usual backup suffix
-t, --target-directory=DIRECTORY
copy all SOURCE arguments into DIRECTORY
-T, --no-target-directory
treat DEST as a normal file
-u, --update
copy only when the SOURCE file is newer than the destination file or when the destination file is missing
-v, --verbose
explain what is being done
-x, --one-file-system
stay on this file system
-Z, --context=CONTEXT
set security context of copy to CONTEXT
display this help and exit
output version information and exit

There are many switches for cp—the complete list is in the reference section at the end of this chapter. Some common switches are as follows:

$ cp notes.txt old_notes.txt # copying
$ mkdir backup
$ cp old_notes.txt backup
$ ls backup

Like rm, some Linux distributions have --interactive on by default, warning when a file will be overwritten.

$ cp --interactive project_notes.txt old_notes
cp: overwrite 'old_notes/project_notes.txt'? n

MV Command

The mv (move) command moves and renames files. This is the same as making a copy of the file and deleting the original. Move also effectively renames a file by moving it to a new name in the same directory.

$ mv notes.txt project_notes.txt # renaming

The most common mv switches are similar to cp:

There is no --recursive switch. When move moves a directory, it moves the directory and all its contents automatically.

The namei (name inode) command lists all the components in a path, including any symbolic links.

$ namei files
f: files
 l files -> /home/ken/bash/scripts
 d /
 d home
 d ken
 d bash
 d scripts

In this case, the file named files is a symbolic link. Each of the files in the link path is a directory, marked with a d. Other file designations include l for symbolic link, s for socket, b for block device, c for character device, - for regular file, and ? for an error accessing a file in the path.

Complete file permissions, such as seen with ls -l, can be shown with the -m (mode) switch.

Working with people

The who command shows who is on the computer, which connection they are using, and when they signed on.

$ who
dhu        ttyp6        Mar 29 14:12
mchung     console      Apr  6 09:57
bgill      ttyp7        Apr  6 13:32

The w command provides even more information, including system statistics and what the users are currently running.

$ w
  3:18pm  up 9 days, 20:33,  3 users,  load average: 0.64, 0.66, 0.64
User     tty           login@  idle   JCPU   PCPU  what
dhu      ttyp6         2:12pm  4:28   8:01   8:01  csh
mchung   console       9:57am  5:10                sh
bgill    ttyp7         1:32pm    19                bash

Shell Aliases

Shell aliases are parameteless positional macros.  They are recognized only if they are the first in the command string and only in interactive sessions. General form

alias name='command'

The built-in alias command creates simple abbreviations for the current Bash session. To create an alias, use the alias command to assign a command and its switches a name.

$ alias lf='ls -qFl'
$ lf
-rw-r-----   1 kburtch    devgroup     10809 Apr  6 11:00 assets.txt
-rw-r-----   1 kburtch    devgroup      4713 Mar  9  2000 mailing_list.txt
My recommendation
alias ll=’/bin/ls -hAlF --group-directories-first’

alias command without parameters lists all active aliases. You should generally avoid self-aliased commands. But in some cases they are useful. For example, the command rm -i is often aliased as rm. The effect is that the -i option appears whenever you issue the rm command, whether or not you type the option. The -i option specifies that the shell will prompt for confirmation before deleting files. This helps avoid accidental deletion of files, which can be particularly hazardous when you're logged in as root. The alias ensures that you're prompted for confirmation even if you don't ask to be prompted. If you don't want to be prompted, you can issue a command like:

The same effect prduces typica  the alias with the -p switch.

Bash interprets an alias only once, allowing the aliasing of a command with its own name.

$ alias ls='ls -qF'  # Bash isn't confused

Normally, only the first word of a command is checked for an alias. As a special exception, if the last character in the alias string is a blank, Bash checks the next word in the command to see whether it is also an alias.

There is no method for giving arguments to an alias. If arguments are needed, define a more powerful shell function instead.

The built-in unalias command removes an alias. Use the -a switch to remove them all.

Most Linux distributions have aliases defined for common commands. dir, for example, is often an alias for ls. Some distributions define an alias for commands such as rm -i to force user prompting, which is not required by default. This can be a problem for some users such as experienced Unix programmers who are used to working with these features disabled. Use unalias to remove any aliases that you don't want to use.

Aliases mixed with shell functions can be confusing because aliases are expanded only when a line from a script is read. If aliases are used in a shell function, they are expanded when the shell function is defined, not when it is executed. For this reason, it is safer to avoid aliases altogether in shell scripts. However, they can be turned on in scripts using the shopt -s expand_aliases command.

rm -f files

where files specifies the files to be deleted. The -f option has an effect opposite that of the -i option; it forces deletion of files without prompting for confirmation. Because the command is aliased, the command actually executed is:

rm -i -f files

Here the -f option takes precedence over the -i option, because it occurs later in the command line.

If you want to remove a command alias, you can issue the unalias command:

unalias alias

where alias specifies the alias you want to remove. Aliases last only for the duration of a log in session, so you needn't bother to remove them before logging off. If you want an alias to be effective each time you log in, you can use a shell script. The next subsection shows you how to do so.

Your Session Profile

When you log into a computer and start a new Bash session, you might need to type several commands to customize your session. Perhaps you want to change the editing mode from emacs to vi, create new key bindings, or change your command-line prompt. Rather than typing these commands, Bash will run these commands for you each time you log on if they are saved in a special file. This file is called a profile file because it contains the commands to tailor the session to your particular requirements.

The original Bourne shell ran two profile files whenever a user logged on. First, a file called /etc/profile was the general profile file executed for all users. Second, if a file named .profile appeared in the user's home directory, this contained additional commands for each user. Bash mimics this behavior when it is started as sh instead of bash.

Bash extended the principle to run several profile files depending on the circumstances. In addition, Linux distributions often customize the general profile files to run additional commands stored in other scripts.

Bash differentiates between a login session and other instances. Bash runs as a login shell when a user or program first logs in or when a login is simulated with Bash's --login (or -l) switch. A login shell is not necessarily one that presents a user with a prompt. It only indicates that Bash is the top program in the current session, and when Bash completes its run, the login session will be over.

The login_shell shell option is turned on when you are in a login shell. This option can be used to verify that you are in a login shell.

$ shopt login_shell
login_shell     on

Bash runs as an interactive shell when it is started without a script or when the -i switch is used. An interactive shell presents the user with a command prompt. An interactive shell is not necessarily a login shell. A user can start a non-login interactive shell by typing bash at a Bash prompt, thus starting a new copy of Bash.

Whether the Bash session is interactive or a login shell determines which profile files are used. This way, Bash separates commands specifically for customizing an interactive session from the more general-purpose commands.

The /etc/profile file contains the setup commands and environment changes common to all users. A general profile file might look something like this:

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
# HOSTNAME is the result of running the hostname command
declare -x HOSTNAME=`/bin/hostname`
# No more than 1000 lines of Bash command history
declare -x HISTSIZE=1000
# If PostgreSQL is installed, add the Postgres commands
# to the user's PATH
If test -r /usr/bin/pgsql/bin ; then
   declare -x PATH="$PATH"":/usr/bin/pgsql/bin"
# end of general profile

Only the superuser can edit this file.  You should never touch it.

When Bash is used as a login shell, it executes the first file it finds named ~/.bash_profile, ~/.bash_login, or ~/.profile. When a session completes, Bash runs ~/.bash_logout, if it exists.

For example, both RHEL Linux uses ~/.bash_profile for the user's profile file. (You can check this by listing the files in your home directory.) By editing this file, you can add commands that will always execute when you log in.

# My profile

alias ll=’/bin/ls -hAlF --group-directories-first’
alias cp='cp -pi'

You can test your changes  by simulating a login using the command bash --login.

$ bash --login
Wed Feb  6 15:20:35 EST 2002
$ alias

$ logout

Running a new Bash interactive session without logging in will not run the profile file.

$ bash
$ logout
bash: logout: not login shell: use 'exit'
$ exit

Scripts will not normally execute the login profile scripts. Bash will load a profile for scripts if the BASH_ENV environment variable contains a pathname to a file to execute. However, you should avoid using BASH_ENV.

Setting the common environment for a set of scripts is usually done with the source  command, which is discussed in Chapter 14, “Functions and Script Execution.”

BASH_ENV has no effect on interactive sessions.

You can block running of the login profile files by using the --noprofile switch with bash

Bash also runs a different set of files for interactive sessions that are not also login sessions. Bash looks for a customization script called ~/.bashrc (Bash resources) and executes it instead of the login profile files. Aliased functions are only allowed in the resource files. A different resource file can be specified with the --init-file or --rcfile switch. A typical resource file might contain the following:

# /etc/bashrc
# My bashrc Resource File Customizations
printf "%s\n" ".bashrc has run"

Some distributions add lines to your login profile to source .bashrc -- to run the commands contained ~/.bashrc as well. This is not a feature of Bash, but a change made by your Linux distribution. You can add the following lines to the ~/.bashrc file to test its behavior:

# My bashrc Resource File Customizations
printf "%s\n" ".bashrc has run"

Test it from the command prompt by starting new sessions. In this case, SuSE Linux always runs the resource file.

$ bash --login
.bashrc has run
$ logout
$ bash
.bashrc has run
$ exit

As a result, you cannot be certain of the behavior of the resource file without checking your distribution.

Resource files can be suppressed with the --norc switch.

Your distribution can run other files as well during login:

Likewise, the general profile files can be customized:

Customizing Your Prompt

The default bash prompt is usually something uninformative that ends with $ and doesn’t tell you much, so you would like to customize it to show information you find useful.

The default prompt varies depending on your system. bash itself will show its major and minor version (\s-\v\$), for example, bash-3.00$. However, your operating system may have its own default, such as [user@host~]$ ([\u@\h\W]\$) .

Here are some examples of  useful prompts that will work with any bash version. The trailing \$ displays # if the effective UID is zero (i.e., you are root) and $ otherwise:

  1. Username@hostname, the date and time, and the current working directory:
    $ export PS1='[\u@\h \d \A] \w \$ '
    [userj@mybox Wed Dec 28 19:32] ~ $ cd /usr/local/bin/
    [userj@mybox Wed Dec 28 19:32] /usr/local/bin $
  2. Username@hostname, and the current working directory (\w):
    $ export PS1='[\u@\h \w] \$ '
    [userj@mybox] ~ $ cd /usr/local/bin/
    [userj@mybox] /usr/local/bin $
  3. Username@hostname, the exit status of the last command, and the current working directory. Note the exit status will be reset (and thus useless) if you execute any commands from within the prompt:
    $ export PS1='[\u@\h $? \w \$ '
    [userj@mybox 0 ~ $ cd /usr/local/bin/
    [userj@mybox 0 /usr/local/bin $ true
    [userj@mybox 0 /usr/local/bin $ false
    [userj@mybox 1 /usr/local/bin $ true
    [userj@mybox 0 /usr/local/bin $

See Shell Prompts Customarization for more information

Additional Dot files

there are additional dpt-scriptts that are run at the begining of the user session.  /etc/profile Executed each time when the user logs in

BASH can also use bash-specific shells:

  • ~/.bash_logout  Executed when the user logs out

See Dot files for more information.

More about shell variables

There are multiple system variable in shell, the variables that are set by the system.

For example, PATH variable.  Of cause you cal also set it yourself:


By default, shell variables are typeless and can have both athithmentic and non-numeric values.

You can see a list of system variables in you env by issuing the env command. Usually, the command produces more than a single screen of output. So, you can use a pipe redirector and the more  command to view the output one screen at a time:

env | more

Press the Space bar to see each successive page of output. You'll probably see several of the shell variables described below:

  • DISPLAY -- the X display to be used; for example, localhost:0
  • HOME -- the absolute path of the user's home directory
  • HOSTNAME -- the Internet name of the host
  • LOGNAME -- the user's login name
  • MAIL -- the absolute path of the user's mail file
  • PATH -- the search path (see next subsection)
  • SHELL -- the current shell (with the absolute path)
  • TERM -- the terminal type
  • USER -- the user's current username; may differ from the login name if the user executes the su  command

You can use the value of a shell variable in a command by preceding the name of the shell variable by a dollar sign ($). To avoid confusion with surrounding text, you can enclose the name of the shell variable within curly braces ({});  For example, you can change the current working directory to your home directory by issuing the command:

cd $HOME

An easy way to see the value of a shell variable is to specify the variable as the argument of the echo  command. For example, to see the value of the PATH shell variable, issue the command:

echo $PATH

To make the value of a shell variable available not just to the shell, but to programs invoked by using the shell, you must export the shell variable. To do so, use the export  command, which has the form:

export variable

where variable specifies the name of the variable to be exported. A shorthand form of the command lets you assign a value to a shell variable and export the variable in a single command:

export variable=value

You can remove the value associated with shell variable by giving the variable an empty value:


However, a shell variable with an empty value remains a shell variable and appears in the output of the set  command. To dispense with a shell variable, you can issue the unset  command:

unset variable

Once you unset the value of a variable, the variable no longer appears in the output of the set  command.

The Search Path

The special shell variable PATH holds a series of paths known collectively as the search path.  This is a very important varibale and that's why we will study it separately. Whenever you issue an external command, the shell searches paths that comprise the search path, seeking the program file that corresponds to the command. The startup scripts establish the initial value of the PATH shell variable, but you can modify its value to include any desired series of paths. You must use a colon (:) to separate each path of the search path.

For example, suppose that PATH has the following value:


You can add a new search directory, say /opt/bin, with the following command:


Now, the shell will look for external programs in /opt/bin/ as well as the default directories. However, it will look there last. If you prefer to check /opt/bin first, issue the following command instead:


The which command helps you work with the PATH shell variable. It checks the search path for the file specified as its argument and prints the name of the matching path, if any. For example, suppose you want to know where the program file for the wc  command resides. Issuing the command:

which wc

will tell you that the program file is /usr/bin/wc, or whatever other path is correct for your system.


Recommended Links

Google matched content

Softpanorama Recommended

Top articles


Top articles





Groupthink : Two Party System as Polyarchy : Corruption of Regulators : Bureaucracies : Understanding Micromanagers and Control Freaks : Toxic Managers :   Harvard Mafia : Diplomatic Communication : Surviving a Bad Performance Review : Insufficient Retirement Funds as Immanent Problem of Neoliberal Regime : PseudoScience : Who Rules America : Neoliberalism  : The Iron Law of Oligarchy : Libertarian Philosophy


War and Peace : Skeptical Finance : John Kenneth Galbraith :Talleyrand : Oscar Wilde : Otto Von Bismarck : Keynes : George Carlin : Skeptics : Propaganda  : SE quotes : Language Design and Programming Quotes : Random IT-related quotesSomerset Maugham : Marcus Aurelius : Kurt Vonnegut : Eric Hoffer : Winston Churchill : Napoleon Bonaparte : Ambrose BierceBernard Shaw : Mark Twain Quotes


Vol 25, No.12 (December, 2013) Rational Fools vs. Efficient Crooks The efficient markets hypothesis : Political Skeptic Bulletin, 2013 : Unemployment Bulletin, 2010 :  Vol 23, No.10 (October, 2011) An observation about corporate security departments : Slightly Skeptical Euromaydan Chronicles, June 2014 : Greenspan legacy bulletin, 2008 : Vol 25, No.10 (October, 2013) Cryptolocker Trojan (Win32/Crilock.A) : Vol 25, No.08 (August, 2013) Cloud providers as intelligence collection hubs : Financial Humor Bulletin, 2010 : Inequality Bulletin, 2009 : Financial Humor Bulletin, 2008 : Copyleft Problems Bulletin, 2004 : Financial Humor Bulletin, 2011 : Energy Bulletin, 2010 : Malware Protection Bulletin, 2010 : Vol 26, No.1 (January, 2013) Object-Oriented Cult : Political Skeptic Bulletin, 2011 : Vol 23, No.11 (November, 2011) Softpanorama classification of sysadmin horror stories : Vol 25, No.05 (May, 2013) Corporate bullshit as a communication method  : Vol 25, No.06 (June, 2013) A Note on the Relationship of Brooks Law and Conway Law


Fifty glorious years (1950-2000): the triumph of the US computer engineering : Donald Knuth : TAoCP and its Influence of Computer Science : Richard Stallman : Linus Torvalds  : Larry Wall  : John K. Ousterhout : CTSS : Multix OS Unix History : Unix shell history : VI editor : History of pipes concept : Solaris : MS DOSProgramming Languages History : PL/1 : Simula 67 : C : History of GCC developmentScripting Languages : Perl history   : OS History : Mail : DNS : SSH : CPU Instruction Sets : SPARC systems 1987-2006 : Norton Commander : Norton Utilities : Norton Ghost : Frontpage history : Malware Defense History : GNU Screen : OSS early history

Classic books:

The Peter Principle : Parkinson Law : 1984 : The Mythical Man-MonthHow to Solve It by George Polya : The Art of Computer Programming : The Elements of Programming Style : The Unix Hater’s Handbook : The Jargon file : The True Believer : Programming Pearls : The Good Soldier Svejk : The Power Elite

Most popular humor pages:

Manifest of the Softpanorama IT Slacker Society : Ten Commandments of the IT Slackers Society : Computer Humor Collection : BSD Logo Story : The Cuckoo's Egg : IT Slang : C++ Humor : ARE YOU A BBS ADDICT? : The Perl Purity Test : Object oriented programmers of all nations : Financial Humor : Financial Humor Bulletin, 2008 : Financial Humor Bulletin, 2010 : The Most Comprehensive Collection of Editor-related Humor : Programming Language Humor : Goldman Sachs related humor : Greenspan humor : C Humor : Scripting Humor : Real Programmers Humor : Web Humor : GPL-related Humor : OFM Humor : Politically Incorrect Humor : IDS Humor : "Linux Sucks" Humor : Russian Musical Humor : Best Russian Programmer Humor : Microsoft plans to buy Catholic Church : Richard Stallman Related Humor : Admin Humor : Perl-related Humor : Linus Torvalds Related humor : PseudoScience Related Humor : Networking Humor : Shell Humor : Financial Humor Bulletin, 2011 : Financial Humor Bulletin, 2012 : Financial Humor Bulletin, 2013 : Java Humor : Software Engineering Humor : Sun Solaris Related Humor : Education Humor : IBM Humor : Assembler-related Humor : VIM Humor : Computer Viruses Humor : Bright tomorrow is rescheduled to a day after tomorrow : Classic Computer Humor

The Last but not Least Technology is dominated by two types of people: those who understand what they do not manage and those who manage what they do not understand ~Archibald Putt. Ph.D

Copyright © 1996-2021 by Softpanorama Society. was initially created as a service to the (now defunct) UN Sustainable Development Networking Programme (SDNP) without any remuneration. This document is an industrial compilation designed and created exclusively for educational use and is distributed under the Softpanorama Content License. Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.

FAIR USE NOTICE This site contains copyrighted material the use of which has not always been specifically authorized by the copyright owner. We are making such material available to advance understanding of computer science, IT technology, economic, scientific, and social issues. We believe this constitutes a 'fair use' of any such copyrighted material as provided by section 107 of the US Copyright Law according to which such material can be distributed without profit exclusively for research and educational purposes.

This is a Spartan WHYFF (We Help You For Free) site written by people for whom English is not a native language. Grammar and spelling errors should be expected. The site contain some broken links as it develops like a living tree...

You can use PayPal to to buy a cup of coffee for authors of this site


The statements, views and opinions presented on this web page are those of the author (or referenced source) and are not endorsed by, nor do they necessarily reflect, the opinions of the Softpanorama society. We do not warrant the correctness of the information provided or its fitness for any purpose. The site uses AdSense so you need to be aware of Google privacy policy. You you do not want to be tracked by Google please disable Javascript for this site. This site is perfectly usable without Javascript.

Last modified: March, 12, 2019