|
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 |
|
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.
[[email protected] ~]$ env XDG_SESSION_ID=5 HOSTNAME=test01 SELINUX_ROLE_REQUESTED= TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=68.199.152.103 1659 22 SELINUX_USE_CURRENT_RANGE= SSH_TTY=/dev/pts/0 USER=bezrounn LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: MAIL=/var/spool/mail/bezrounn PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/bezrounn/.local/bin:/home/bezrounn/bin PWD=/home/bezrounn LANG=en_US.UTF-8 SELINUX_LEVEL_REQUESTED= HISTCONTROL=ignoredups SHLVL=1 HOME=/home/bezrounn LOGNAME=bezrounn SSH_CONNECTION=68.199.152.103 1659 10.0.0.4 22 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/1000 _=/usr/bin/env
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.
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:
/etc/profile: This is the generic file that is processed by all users upon login.
/etc/bashrc: This file is processed when subshells are started.
~/.bash_profile: This file is executed once on you login. In this file, user-specific login shell variables and aliases can be defined. This file is executed only for interactive sessions. Sometimes it is not executed even for interactive sessions (for example when you connect to the server via ssh; in such cases you can execute it manually using the command . ~/.bash_profile which can be aliased to .p in /etc/profile)
~/.bashrc: In this user-specific file, subshell variables can be defined. This is the only dot files executed by non-log shells
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.
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
[[email protected] ~]$ 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/colorls.sh 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
alias
(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
[[email protected] ~]$ 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/mc-wrapper.sh'
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.
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/colorls.sh 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='[$?]\[email protected]:\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 filesThe 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 - else pushd [email protected] fi }
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
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
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
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 http://ipecho.net/plain; echo"
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 thehistappend
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 withhistory -c
, and then read the history file that we've appended to, back into our session history withhistory -r
export PROMPT_COMMAND="export histcount; if (( histcount % 10 == 0 )); \
then history -a; history -c; history -r; fi; $PROMPT_COMMAND"
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:
ls pwd 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.
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.
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 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.
First you need to create directory to store ISO and download it, if it not already avable on local filesystem
mkdir /root/ISO wget http://mirror.math.princeton.edu/pub/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64-DVD-1804.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
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: December 13, 2020