|
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 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
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 check-orders.sh 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/ check-orders.sh* 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 check-orders.sh 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/ check-orders.sh* orde?rs.txt
A complete list of switches appears at the end of this chapter.
Born-shell family has special macros that expand to the home directory. They can be used only outside strings:
~
The home directory of the current user ~
userid
-- home directory of the user
with userid
ID. ~+
The current working directory ~-
The previous working directory !!! 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 https://linux.die.net/man/
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.
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.
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.
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.
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
- --backup[=CONTROL]
- make a backup of each existing destination file
- -b
- makes a backup; like --backup but does not accept an argument
- --copy-contents
- copy contents of special files when recursive
- -d
- 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)
- -H
- 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
- -p
- same as --preserve=mode,ownership,timestamps
- --preserve[=ATTR_LIST]
- preserve the specified attributes (default: mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all
- -c
- same as --preserve=context
- --no-preserve=ATTR_LIST
- don't preserve the specified attributes
- --parents
- use full source file name under DIRECTORY
- -R, -r, --recursive
- copy directories recursively
- --reflink[=WHEN]
- control clone/CoW copies. See below.
- --remove-destination
- remove each existing destination file before attempting to open it (contrast with --force)
- --sparse=WHEN
- control creation of sparse files. See below.
- --strip-trailing-slashes
- 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
- --help
- display this help and exit
- --version
- 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 old_notes.txt
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 $
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.
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 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.txtMy 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.
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:
#!/etc/profile # 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" fi # 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:
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:
$ 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 $
(\w)
:$ export PS1='[\u@\h \w] \$ ' [userj@mybox] ~ $ cd /usr/local/bin/ [userj@mybox] /usr/local/bin $
$ 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
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:
See Dot files for more information.
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:
PATH=/usr/bin:/usr/sbin/:usr/local/bin
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:
localhost:0
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:
variable=
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 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:
/usr/bin:/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin
You can add a new search directory, say /opt/bin, with the following command:
PATH=$PATH:/opt/bin/
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:
PATH=/opt/bin:$PATH
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.
Google matched content |
...
Society
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
Quotes
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 quotes : Somerset Maugham : Marcus Aurelius : Kurt Vonnegut : Eric Hoffer : Winston Churchill : Napoleon Bonaparte : Ambrose Bierce : Bernard Shaw : Mark Twain Quotes
Bulletin:
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
History:
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 DOS : Programming Languages History : PL/1 : Simula 67 : C : History of GCC development : Scripting 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-Month : How 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. www.softpanorama.org 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 |
Disclaimer:
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