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

RHCSA: Access a shell prompt and issue commands with correct syntax

News Notes on RHCSA Certification for RHEL 7 Recommended links Lecture notes for RHCSA certification for RHEL 7 The tar pit of Red Hat overcomplexity Systemd RHEL7 documentation Unix History with some Emphasis on Scripting Red Hat history
Understanding and using essential tools Access a shell prompt and issue commands with correct syntax Finding Help Managing files in RHEL Working with hard and soft links Working with archives and compressed files Using the Midnight Commander as file manager Text files processing Using redirection and pipes
Use grep and extended regular expressions to analyze text files Finding files and directories; mass operations on files Connecting to the server via ssh, using multiple consoles and screen command RHCSA: Managing local users and groups RHCSA: Introduction to Unix permissions model Introduction to Process Management Configuring network in RHEL7 Installation and configuration of KVM in RHEL7 VIM: Basic and intermediate set of command for syadmins
Managing Software Packages with yum and rpm Using yum Using rpm            
          Sysadmin Horror Stories Tips Humor Etc

Extracted from Professor Nikolai Bezroukov unpublished lecture notes.

Copyright 2010-2019, Dr. Nikolai Bezroukov. This is a fragment of the copyrighted unpublished work. All rights reserved.

Partially derived from:



Bash shell is the default shell in Linux -- the language and simultaneously the environment for a Linux administrator (console). It allows  users and administrators enter commands that are executed by the operating system. There are several other shells for Linux such as zsh, ksh93 and tcsh, but bash is the most common shell.  If desired, you can change the default shell for individual users in the /etc/passwd file. But for sysadmin knowledge of bash shell is a must as it might be the only shell available ih case of troubleshooting. We will provide just a brief overview of topics assuming that you already know the basics and was able to install Linux on your PC or VM. 

Bash shell simultaneously is a program that is invoked as part of the login process. This invocation of bash is called login shell. When you have properly identified yourself by logging in, the UNIX system prompt appears on your terminal screen. You can change the prompt from default to more meaningful.

When you type a command from the keyboard, the characters are echoed on the screen. The shell does not interpret the command until you press the RETURN key. This means that you can use the erase character (usually the DEL or BACKSPACE key) to correct typing mistakes. After you have entered a command line, the shell tries to identify and locate the program specified on the command line. If the command line that you entered is not valid, then an error message is returned. When a program is invoked and processing begun, the output it produces is sent to your screen, unless otherwise directed. To interrupt and cancel a program before it has completed, you can press the interrupt character ( CTRL-C). If the output of a command scrolls by the screen too fast, you can suspend the output by pressing the suspend character (usually CTRL-S) and resume it by pressing the resume character (usually CTRL-0).

The return of the system prompt signals that a command is finished and that you can enter another command. Familiarity with the power and flexibility of the bash
shell is essential to working productively in the Linux environment.

TIP: There are several good books about bash on Internet. you need to read one.  Among those that you can use we can mention

When you are working from a shell, an environment is created to ensure that system and user programs operate the right way. This environment consists of variables, which can be system or uyser defined. System variables have predefined names. among  them

Variables can be assigned values dynamically both from scripts such as /etc/profile and .bash_profile and console. An example of an important system variable is PATH which define the set of directories which will be searched for the name of external program (see below). System variable are usually exported, so the child processes can use them. For example let's redefine path so that it included you home bin directory and the current directory (which should be last in search so that files in this directory did not "shadow" legitimate executables, creating a possibility of security breach; don't do it for root):

export PATH=$PATH:~/bin:.

To determine the PATH for the current user account, run the echo $PATH command. Environment variables allow scripts and programs to get proper values at runtime.  Environment is unique for each users with some variable set by the system and some set in a user environment will differ.  the login name of the user si contained in the environment variable USER. To get the list the variables defined in your shell environment, type the env  command.  The value of PATH si different for root and for regular users, with root having  some sbin directories included in the path. The differences between the PATH for a regular user and one for a root user have narrowed in RHEL 7:

The directories in the PATH for regular users and the root administrative user are slightly different. But the differences matter because the directories are searched in order. For example, the system-config-keyboard command is available from both the /usr/bin and /usr/sbin directories. As you can see from the default PATH for regular and root users, the version that is run varies because of the differences in the PATH.

The PATH is determined globally by current settings in the /etc/profile file or by scripts in the /etc/profile.d directory. You might notice differences between the PATH as configured for User ID (UID) 0 and all other users. UID 0 corresponds to the root administrative user.

As well as the global settings, the PATH for individual users can be customized with an appropriate entry in that userís home directory, in the hidden files named ~/.bash_profile or ~/.profile.

You may create or set a shell variable by typing a name followed immediately by an equal sign (=). If the variable exists, you will modify it to assign the new value. Variables are case sensitive, so var1 and VAR1 are different variables. By convention, variables, particularly exported variables, are upper case, but this is not a requirement. There are also "system parameters" like $$ and $?. They may only be referenced; you cannot assign a value to them.

Default environment in Red Hat and CentOS 7 consists of a dozen of system variable including such important as PATH. 

[bezrounn@test01 ~]$ env
SSH_CLIENT= 1659 22
LESSOPEN=||/usr/bin/ %s

To read the value of a variable, a user can use the echo  command, followed by the name of the variable, as in echo $PATH, which reads the current value of the PATH variable and prints that on the screen.

Environment Configuration Files

When a user logs in, an environment is created for that user automatically. This happens based on four different files where some script code can be specified and where variables can be defined for use by one specific user:

As you have seen, in these files a difference is made between a login shell and a subshell. A login shell is the first shell that is opened for a user after the user has logged in. From the login shell, a user may run scripts, which will start a subshell of that login shell. Bash allows for the creation of a different environment in the login shell and in the subshell but to make sure the same settings are used in all shells, itís a good idea to include subshell settings in the login shell as well.

Executing Commands Interactively

When shell is used interactively it allow to type and execute commands one by one and displays the result of execution on the terminal. During exam much depends how good you are at using the command line. The shell interprets the command only if a user has entered it correctly.  Commands can be internal (built-in bash shell) and external -- executables in some system directory such as /bin, /sbin, /usr/bin. To find out whether a command is a bash internal, or an executable file on disk, you can use the type  command.

Only a few shell command are implemented as builtin. Among them cd, break, and exec. All other commands are external

Shells also use three standard I/O streams:

When a user executes a command, the shell first looks to determine whether alias. If so it extends the alias and executed the command. then it checks it it is an internal command; if it is not, it looks for an executable file with a name that matches the command on disk.  To look up external commands, the set of the directories defined in shell system variable $PATH  is used. This set of directories is checked one by one for a matching filename. To find out from which directory the external command is executed you can use the which  command.

For security reasons the current directory is not in the $PATH variable and Linux does not look in the current directory to see whether a specific command is available from that directory. That is why if you need to execute a command from the current directory you need to type ./  in front of it. The dot means "the current directory" so ./ means "the command in the current directory".  you can change this with the command

export PATH=$PATH:"."

The $PATH  variable is usually set from a special system file .bashrc and is different for each user.

Here is example of the command that invoke an external command

[root@test01 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        30G  1.3G   29G   5% /
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           3.9G  8.4M  3.9G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1       497M   62M  436M  13% /boot
/dev/sdc1        16G   45M   15G   1% /mnt/resource
tmpfs           797M     0  797M   0% /run/user/1000
tmpfs           797M     0  797M   0% /run/user/0

Each command return "exit code" after execution. Built-in variable "?" contains the exit code of the last command. So you can get the return  code by  issues the command

echo $?


One timesaving mechanism for the command line users is to use aliases -- a shortcut to the command with some default parameters. You can also call them "parameteless macros". Aliases are recognized only as the first element of the command.

User defined aliases are often stored in .bash_profile file or .bashrc file. The syntax looks like this:

alias alias_name="command_to_run"

The most "famous" alias is "ll" (long listing). Red hat defines alias ll in the file  /etc/profile.d/ incorreectly for root user. It is customised for regular user and does not contian option -a neessesary for root:

alias ll='ls -l --color=auto' 2>/dev/null

Do you need to redefine it in /root/bashrc adding options -a and possibly dropping colors which create big problems is you use different background colors on your terminal for different servers (which might help prevent blunders like executing the commands on the wrong server).  In general the results of adding colors often look in Red Hat 7 console applications like a perfect illustration of the saying "road to hell is paved with good intentions"

For example you can define the alias ll as following:  

alias ll="ls -hAlF"

which along with the listing of hidden files (files that start with dot; option -a) also provide "human" listing for size (option -h) and adds trailing slashes for directories (option -f). Another  useful option that I would recommend is  --group-directories-first  which helps to separate directories form regular file like in Midnight Commander panels:

alias ll="ls -hAlF --group-directories-first"

After we defined this alias, you can  get the current directory's listing, in long format, including files and directories starting with dot.

You can list all of your configured aliases by execting command


(without any arguments).

To temporarily bypass an alias (say, if you aliased ls to ls -a), you need to type: \ls. This is very useful if colors are "mangled" on your terminal and the listing is difficult to read.

To remove an alias use unalias command This sometimes can be useful for rm alias which is defined as alias rm=rm -i'. Fopr example unalias rm

TIP: you can install screen and mc from the ISO on exam. Screen provides you an opportunity to nahve multiple consoles (one for each working directory). As typically for any task there are two or more directories that you need to visit that saves time.

Default aliases provided with CentOS 7 are as following

[bezrounn@test01 ~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mc='. /usr/libexec/mc/'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

Option --color=auto might be a problem is you use light (white or yellow background ) for your terminal. In this case you need to redefine those aliases from you .bash-profile file.

NOTE: putting aliases into your .bashrc also work as they are ignored for non-interactive sessions.

Customizing your environment

Plain vanilla RHEL 7 is  missing many important elements that make working on the console more comfortable. For example, alias ls is defined incorrectly for sysadmin.  Do the first task is slightly customize you environment adding a couple of aliases that will make you work more productive. It take a minute or two. You need to add it either to  /root/.bashrc and /root/.bash_profile. Aliases are ignored for non interactive session no there is no harm to add them to .bashrc, which is executed for interactive non-login shells, while .bash_profile is executed only for login shell.

The main annoyance is  that Red Hat does not ship with proper definition for ll alias for root (the alias is defined in /etc/profile.d/ file ). It make sense to add it to /etc/profile or /root/.bashrc at the beginning of the exam and then adding more aliases as you proceed. Save and close the file. and enter after you modified it.  For example, is you added it to /root/.bashrc enter:

. /root/.bashrc

This  will source your changes into your current environment. Otherwise any aliases you added will be available next time you start a new shell session. 

Here are some more elaborate tuning suggestion (which of course is optional, as time is money in case of RHCSA exam ;-): 

#       My customarization
expoert PAGER=less
export LESS='-X'
alias ll='ls -hAlF --group-directories-first' 
alias lll='ls -hAlF --group-directories-first | less -XF' # useful for browsing large directories like /etc, if you do not use Midnight Commander.
export PROMPT_DIRTRIM=3 # allot to see three last directories in the commnd prompt, if \w mact is used PS1 system variable
export PS1='[$?]\h@ROOT:\w \$ ' # this way you can  see Rc of the last command immediately without typing echo $? 
alias cd='pushd' # this creates a stack of directories and this simplifies navigation. You can list stack with dirs 
alias vi='vim' # this provides "true vim" set of command which is better for working with multiple files 
The last alias (alias cd='pushd') tried to solve the problem of working with deeply  directories typical for modern OS filesystems. It is clear that cd command is not well suited for this even if you try to retrieve previous command form the bash command history as long targets for cd are rarely typed as absolute path.  You need something like directories favorites.  The simplest way to get functionality like this is via pushd/dirs/popd commands. While this  is not the best option, you can just define function dir  which will execute the command pushd via some simple function  which preserves cd - (go to prev directory) and cd (go to home directory) functionality which is lost is you redefined cd via alias to pushd (cd - should be entered as cd -1 in this case)
function cd {
   if (( $# == 0 )); then
      builtin cd
   elif [[ $1 = '-' ]]; then 
      builtin cd -
      pushd $@

Another problem  is that in  RHEL7 default level of logging systemd is info and it pollutes logs making it unreadable. You may wish to change this to to the level "warning" using commands

systemctl -pLogLevel show
systemd-analyze set-log-level warning
systemctl -pLogLevel show

More potentially useful aliases

We can find files in our current directory easily by setting this alias:

alias look="find . -name "

This one will list our disk usage in human-readable units including filesystem type, and print a total at the bottom:

alias df="df -Tha --total"

We might as well add an alias for our preferred du output as well:

alias duh="du -ach | head -12 | sort -rn"

Let's keep going in the same direction by making our free output more human friendly:

alias free="free -mt"

We can do a lot with our listing process table. Let's start out by setting a default output:

alias psls="ps auxf"

How about we make our process table searchable. We can create an alias that searches our process for an argument we'll pass:

alias psgrep="ps aux | grep -v grep | grep -i -e VSZ -e"

Now, when we call it with the process name we're looking for as an argument, we'll get a nice, compact output:

psgrep bash

1001      5227  0.0  0.0  26320  3376 pts/0    Ss   16:29   0:00 bash

One common option to the mkdir command that we use often is the -p flag to make any necessary parent directories. We can make this the default:

alias mkdir="mkdir -pv"

We added a -v flag, which can help us recognize quickly if we had a typo which caused an accidental directory branch:

When downloading files from the internet with wget, in almost all circumstances, you'll want to pass the -c flag in order to continue the download in case of problems. We can set that with this:

alias wget="wget -c"

We can search our history easily like with a grep of the history command's output. This is sometimes more useful than using CTRL-R to reverse search because it gives you the command number to do more complex recalls afterwards:

alias hgrep="history | grep"

I have a few system tools that I prefer to upgrade from the standard version to more complex tools. These will only work if you've downloaded the required utilities, but they can be very helpful. Keep in mind that these may affect your other aliases.

This one replaces the conventional top command with an enhanced version that is much easier on the eyes and can be sorted, searched, and scrolled without complications:

alias top="htop"

In a similar way, the ncdu command can be downloaded which presents file and directory sizes in an interactive ncurses display that you can browse and use to perform simple file actions:

alias mydu="ncdu"

Have you ever needed your public IP address from the command line when you're behind a router using NAT? Something like this could be useful:

alias myip="curl; echo" 

Bash history

The history command makes it easy to repeat complex commands.  Type history to show a list of all commands in the bash history.

 Use Ctrl+R to open the prompt from which you can do backward searches in commands that you have previously used. Just type a part of the command you are looking for, and it will be displayed automatically. Use Ctrl+R to search further backward based on the same search criteria.

You can also reexecute previous command using !!, for example when permission on user level were not enough and the command failed.

sudo !!

and add the last argument of the previous command to the current command using !$

By default bash stores history in the file  ~/.bash_history, and it is created in the home directory of the user who started a specific shell session. Notice that the history file is closed only when the shell session is closed; until that moment, all commands in the history are kept in memory.

This means that if you are logged in with multiple bash sessions, only the last one to exit will have its history saved. You can avoid this problems by setting the histappend setting, which will append instead of overwrite the history. This may be set already, but if it is not, you can enable this by adding this line:
shopt -s histappend

Bash is configured to keep the last 1,000 commands you have used (and if shell session is never closed, the exact number can grow even much beyond that).  For root this is not enough and you need to increase it to 10000 or more.  Typically three variables are set: HISTSIZE, HISTIGNORE and HISTCONTROL in your "dotfiles":

export HISTSIZE=1000000 
export HISTIGNORE="ls:cd"
export HISTCONTROL=ignoreboth

When a shell session is closed, the history of that session is updated to the history file. You can also update it any time you want by  using command history -a  (and that's important to do if you have multiple sessions open, as in this case bash  does not write everything in history.

Another ptoblem is that if you are using screen which is persistent between logins yo history is not wreitten to history untel you screen session closes.  You can add the  history -a command to the PROMPT_COMMAND parameter, which contains commands that are executed before each new command prompt (How To Use Bash History Commands and Expansions on a Linux VPS DigitalOcean )

To do this correctly, we need to do a bit of a hack. We need to append to the history file immediately with history -a, clear the current history in our session with history -c, and then read the history file that we've appended to, back into our session history with history -r

export PROMPT_COMMAND="export histcount; if (( histcount % 10 == 0 )); \
   then history -a; history -c; history -r; fi; $PROMPT_COMMAND"

Exercise: Working with History

1.  Make sure that you have opened a shell as user user.

2.  Type history 5 to get file last command  you have previously used.

3.  Type some commands, such as the following:

cat /etc/hosts
ls -l.

The goal is to fill the history a bit.

4.  Open a second terminal on your server by right-clicking the graphical desktop and selecting the Open in Terminal  menu option.

5.  Type history from this second terminal window. Notice that you do not see the commands that you just typed in the other terminal. That is because the history file has not been updated yet. now type history -w from the first terminal window.

6.  From the first terminal session, type Ctrl+R. From the prompt that opens now, type ls. Youíll see the last ls  command you used. Press Ctrl+R  again. Youíll now see that you are looking backward and that the previous ls  command is highlighted. Press Enter  to execute it.

7.  Type history | grep cat. The grep  command searches the history output for any commands that contained the text cat. Remember the command number of one of the cat  commands you have previously used.

8.  Type !!  Youíll see that the last  command is repeated.

9.  Close this terminal by typing exit.

10.  From the remaining terminal window, type history -c. This wipes all history that is currently in memory. Close this terminal session as well.

11.  Open a new terminal session and type history. It may be a bit unexpected, but youíll see a list of commands anyway. That is because history -c  clears the in-memory history, but it does not remove the .bash_history file in your home directory.

12.  Type rm -rf ~/.bash_history. As an alternative to deleting the history file, you can also use history -w  after using history -c.

Bash Completion

First you need to determine if bashj comption is installed.

yum info bash-completion

Another useful feature of the bash shell is automatic completion. This feature helps you in finding the command you need, and it also works on variables and filenames, and on some occasions even within command shells that are opened.

Bash completion is used most on commands. Just type the beginning of a command and press the Tab  key on your computerís keyboard. If there is only one option for completion, bash will complete the command automatically for you. If there are several options, you need to press the Tab  key once more to get an overview of all the available options.

Exercise Using Bash Completion

1.  Still from a user shell, type \cd /var/log/mes  and press Tab. Youíll see that the argument will be expanded to /var/log/messages

2.  Type red

3.  To make it clear to bash what you want, type i  (so that your prompt at this point shows a command gdi. Press Tab  again. Bash now knows what you want and opens gdisk for you. Press Enter  to close the prompt that was just opened.

4.  Use cd /etc  to go to the /etc directory.

5.  Type cat pas  and press Tab. Because there is one file only that starts with pas, bash knows what to do and automatically completes the filename. Press Enter  to execute the command.

The clear command

The clear command does exactly what it says. When your Linux CLI gets all mucked up with various readouts and information, the clear command clears the screen and wipes the board clean. Using the clear command will take the user back to the start prompt of whatever directory you are currently operating in. To use the clear command simply type clear.

Installing missing packages

First you need to create directory to store ISO and download it, if it not already avable on local filesystem

mkdir /root/ISO

After that you can mount it to /mnt

mount -o loop,ro /mnt /root/ISO/CentOS-7-x86_64-DVD-1804.iso

Now you can install packages that you need (mc, nmap, screen and any other you want) out of those that are availble on DVD)

For example:

yum localinstall mc-4.8.7-11.el7.x86_64.rpm


Old News ;-)

Recommended Links

Google matched content

Softpanorama Recommended



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: December 13, 2020