chapter 8: the bourne again shell it’s a command interpreter, it’s a programming language, and...
DESCRIPTION
Some history Very early UNIX shell was written by Steve Bourne – called the Bourne Shell (sh) Another popular shell from UNIX days was the C shell (csh) – a C programmer’s best friend Linux sought to emulate Bourne and make it better – Bourne Again Shell (bash) UNIX stole from bash, David Korn released the Korn shell (ksh) POSIX standards …TRANSCRIPT
![Page 1: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/1.jpg)
Chapter 8:The Bourne Again Shell
It’s a command interpreter, it’s a programming language, and it makes a
mean martini
![Page 2: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/2.jpg)
In this chapter …• Background• Startup files• Basic Scripting• Variables• Processes• History• Aliases
![Page 3: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/3.jpg)
Some history• Very early UNIX shell was written by Steve
Bourne – called the Bourne Shell (sh)• Another popular shell from UNIX days was the C
shell (csh) – a C programmer’s best friend• Linux sought to emulate Bourne and make it
better – Bourne Again Shell (bash)• UNIX stole from bash, David Korn released the
Korn shell (ksh)• POSIX standards …
![Page 4: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/4.jpg)
Starting bash• When bash is called, various startup files are
run to issue commands and define environmental variables
• Which startup file(s) begin depends upon how bash is called
• Use these startup files to make the shell work for you
![Page 5: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/5.jpg)
Login shells• Login shells are called with the --login option• We don’t usually do this – it’s done for us• Will first run /etc/profile, which contains
global default settings• Next, it will attempt to run ~/.bash_profile
~/.bash_login~./profile
![Page 6: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/6.jpg)
Login shells, con’t• Commands in those three files can override
the defaults in /etc/profile• Once one of those files are executed, control
is passed to the user• When the user logs out, bash runs ~/.bash_logout– Usually clears temporary information
![Page 7: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/7.jpg)
Interactive nonlogin shells• Shells that you spawn yourself by typing bash
• Runs ~/.bashrc– This file is usually called by ~/.bash_profile
for login shells– Often this file will also run /etc/bashrc, which
again contains system defaults
![Page 8: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/8.jpg)
Noninteractive shells• These are the shells used to run scripts• These shells do not run any of the
aforementioned startup files• They do however inherit the calling shell’s
environmental variables marked for export• So basically anything you set for the login
shell is set for the noninteractive shell
![Page 9: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/9.jpg)
Working with Startup Files• In the end, these startup files are just shell
scripts• Obey the same rules and conventions that
scripts must use for the particular shell you’re using
• Most important files are probably .bashrc and .bash_profile
• Simplify – have .bash_profile call .bashrc
![Page 10: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/10.jpg)
Startup Files, con’t• Just edit the startup files in your favorite
editor• When done, you can apply changes to your
current shell using either . or source• Otherwise, logout and login again
![Page 11: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/11.jpg)
Symbol Commands in bash• ( ) – run contents in a separate subshell
– Creates a separate process with unique ID• $( ) – command substitution
– Runs contents and replaces with output• (( )) – evaluate contents as arithmetic
expression or equation• $(( )) – same as above, just expressions (no
equal signs)
![Page 12: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/12.jpg)
Redirection Revisited• Standard Input < (or 0<)• Standard Output > (or 1>)• Standard Error 2>• Recall that we can redirect standard out and
standard error to different locations• When you use the pipe ( | ), remember it only
passes standard output to standard input; standard error still goes to it’s normal location
![Page 13: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/13.jpg)
Redirection con’t• Ex: file x exists, file y does notcat x y | tr “[a-z]” “[A-Z]”THIS IS FILE Xcat: y: No such file or directory
• Notice that only standard out is piped to tr• So how would we pipe standard error as
well?
![Page 14: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/14.jpg)
Redirection con’t• Duplicating streams• [n]>&[m]
– Redirects stream n to stream m• So to send std error to std out, 2>&1• So for our previous example
cat x y 2>&1 | tr “[a-z]” “[A-Z]”THIS IS FILE XCAT: Y: NO SUCH FILE OR DIRECTORY
![Page 15: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/15.jpg)
Writing simple scripts• A shell script is, in its simplest form, just a list
of shell commands in a file• File must have read and execute
permissions to call implicitly• If script is in PATH, just call it from command
line• If not in PATH, include pathname (such
as ./myscript)
![Page 16: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/16.jpg)
Shell Scripts• To specify what shell (or program) to use to
execute commands, make first line:#![absolute path to program/shell]
• Without this line, whatever shell you are in when calling the script is used
• To make comments in the script, begin the line with #
![Page 17: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/17.jpg)
Shell Scripts con’t• When a command is issued, fork creates a
new process (subshell)• If the command is a binary executable, exec
makes a system call to run the binary• If the command is a shell script, the subshell
itself runs the script• When done, subshell closes and returns
control to calling shell
![Page 18: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/18.jpg)
Separating and Grouping Commands• You can have multiple commands on a
single command line, they just need to be separated– ;– NEWLINE– &
• To continue a long command on several lines, end a line with \ and press return
![Page 19: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/19.jpg)
Separating and Grouping con’t• To group commands to control execution,
use parenthesis• Ex:
(a; b; c) | (d; e)Commands a, b, and c are executed first, and
once c finishes standard output is piped to the result of commands d and e
• Each set of parenthesis runs in its own subshell
![Page 20: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/20.jpg)
Shell Variables• Variables are stored in memory and contain
data• Variables can be pre-defined by operating
system, shell, or can be user created• Variable names can consist of letters, digits
and underscores– Cannot start with a number
![Page 21: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/21.jpg)
Shell Variables con’t• In bash, to assign a value to a variable:
VARIABLE=value• Notice there are no spaces around the equal
sign• If VARIABLE does not exist, it is created and
set• If it does exist, the current value is
overwritten
![Page 22: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/22.jpg)
Keyword Variables• Certain variables are set already by the shell• Have very standard names and are essential• Ex:
– HOME – contains user’s home directory path– PATH – contains user’s path
• Change these carefully – you can confuse the shell and lock yourself out of places
![Page 23: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/23.jpg)
Shell Variables• To reference a variable’s contents, proceed
the variable name with a $• Ex:
echo HOMEHOMEecho $HOME/home/jhowell
• $variable is actually short for ${variable}
![Page 24: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/24.jpg)
Shell Variables con’t• To remove the value of a variable, just set it
equal to a null string– Ex. myvar=
• To remove a variable altogether, use unset– Ex. unset myvar
![Page 25: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/25.jpg)
Shell Variable Attributes• You can use declare or typeset to define
attributes when you create a variable-a: create an array-f: create a function-i: create an integer-r: make variable readonly-x: make variable global (export)
![Page 26: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/26.jpg)
Attributes con’t• Most of these we’ll come back to when we
start doing shell scripting• Making a variable readonly can also be
accomplished by the readonly command• Marking a variable for export (ie, making it
available to subshells) can also be accomplished using export
![Page 27: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/27.jpg)
Keyword Variables• HOME – your home directory• PATH – your path• MAIL – location of mail storage• PS1 – your primary prompt• PS2 – secondary prompt• IFS – input field separator (BEWARE!!!)• Plus many more … just type set to see current shell
variables (keyword variables usually all caps)
![Page 28: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/28.jpg)
Processes• Processes have a hierarchy similar to the file
system• init process (PID 1), is the root process• It then forks other processes (its children)• Those processes fork more processes• Etc … so we get a tree-like structure• To see this structure use ps --forest
![Page 29: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/29.jpg)
Processes con’t• When a process (such as the shell) calls
another process (like a command or script), it calls fork to create a new process, then goes to sleep
• If the process is sent to the background, fork is called but sleep is not
• If a builtin is called, neither fork nor sleep is called
![Page 30: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/30.jpg)
Processes con’t• fork creates a new process, assigns it a
unique PID, and associates it with its parent via the PPID
• When a process forks a child process, the current shell variables *are not* passed on, unless marked for export
![Page 31: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/31.jpg)
History• bash contains command history mechanism
inherited from the C Shell• Use the builtin history to view your current
history• The history is, by default, stored in your
home directory in a file called .bash_history• History entries are ordered, the last entry
being the most recently executed
![Page 32: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/32.jpg)
History con’t• There are lots of ways to take advantage of
the history• Use the up and down arrows to cycle it• Use !event_num to re-execute a previous
command• There’s also a lot more with fc and the
Readline Library
![Page 33: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/33.jpg)
fc• fix command• fc –l lists recent commands• fc –l [string] lists most recent
commands, starting with one that contains string
• fc [string] will open an editor to edit command
• FCEDIT variable lets you set the editor
![Page 34: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/34.jpg)
Readline Completion• The Readline library brings us the wonders
of tab completion• Command completion• Pathname completion• Start typing, then hit tab to auto-complete• If there is more than one match, hit tab again
to see a list
![Page 35: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/35.jpg)
Aliases• An alias is just another name for another
command (or commands)• Ideally, the alias is shorter and/or easier to
remember• Syntax (bash):alias alias=‘commands_to_alias’
• Ex: alias ll=‘ls -l --colors’• Single vs. double quotes – variable substitution
![Page 36: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/36.jpg)
functions• Like a shell script stored in memory• Set like a variable (and use unset to delete)• [function] funct_name(){..}
• Or use typeset or declare with –f• Like a function? Wanna keep it? .bashrc
![Page 37: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/37.jpg)
Command Line Processing• History Expansion• Alias Substitution• Command Line Expansion
– Brace Expansion– Tilde Expansion– Parameter/variable Expansion– Arithmetic Expansion– Command Substituion– Word Splitting– Pathname Expansion– Process Substitution
![Page 38: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/38.jpg)
Brace Expansion• Used to specify multiple filenames when
pathname expansion doesn’t really apply• Ex:
mkdir ver_{A,B,C,Final}Expands to
mkdir ver_A ver_B ver_C ver_Final
![Page 39: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/39.jpg)
Tilde Expansion• ~ becomes the path to your home directory• ~username becomes to the path to username’s home directory
• ~+ becomes the current working directory• ~- becomes the previous working directory
![Page 40: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/40.jpg)
Arithmetic Expansion• $((expression)) is evaluated• Any variable names inside are substituted for
their values• You can omit the $’s in front of the variable
names within the expression
![Page 41: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/41.jpg)
Command Substitution• $(command) is replaced with the output of command
• Could also be written as `command`• Command is run in a separate subshell,
usual rules apply
![Page 42: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini](https://reader035.vdocument.in/reader035/viewer/2022062317/5a4d1af57f8b9ab059981486/html5/thumbnails/42.jpg)
Process Substitution• Substitutes a process where a filename is
required• <(command) places the output of the
command as a filename argument• >(command) places the input of the
command as a filename argument• Ex: uniq <(cat list | sort)