42
Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini

Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini

Embed Size (px)

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 …

Citation preview

Page 1: Chapter 8: The Bourne Again Shell It’s a command interpreter, it’s a programming language, and it makes a mean martini

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)