chapter 2 the unix shells

42
CHAPTER 2 THE UNIX SHELLS by Uğur Halıcı

Upload: dulcea

Post on 21-Jan-2016

54 views

Category:

Documents


0 download

DESCRIPTION

CHAPTER 2 THE UNIX SHELLS. by Uğur Halıcı. layers in a unix system. User interface. Users. library interface. Standard utility programs (shell, editors, compilers, etc.). User mode. System call interface. Standard library (open, close, read, write, fork etc.). UNIX operating system - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: CHAPTER 2 THE UNIX SHELLS

CHAPTER 2THE UNIX SHELLS

by Uğur Halıcı

Page 2: CHAPTER 2 THE UNIX SHELLS

layers in a unix system2

UsersUsersStandard utility

programs(shell, editors, compilers, etc.)

Standard utility programs

(shell, editors, compilers, etc.)Standard library

(open, close, read, write, fork etc.)Standard library

(open, close, read, write, fork etc.)

UNIX operating system(process scheduling, memory management, file

system, I/O etc.)

UNIX operating system(process scheduling, memory management, file

system, I/O etc.)

Hardware(CPU, memory, disks, terminals etc.)

Hardware(CPU, memory, disks, terminals etc.)

Usermode

kernelmode

Userinterfac

elibraryinterfac

eSystem

callinterface

Page 3: CHAPTER 2 THE UNIX SHELLS

shell3

A shell is a program that is an interface between a user and the raw operating system (directly or through standard library).

It makes basic facilities such as multitasking and piping easy to use, as well as adding useful file specific features such as wildcards and I/O redirection.

There are three common shells in use. The Bourne shell The Korn hell The C shell

Page 4: CHAPTER 2 THE UNIX SHELLS

relation among shells4

Common

core

Common

core

Common

core

Common

core

Bourne Shell

Korn Shell

C Shell

Page 5: CHAPTER 2 THE UNIX SHELLS

basic shell functions5

built in commands

scripts

variables

local environment

redirection

wildcards

pipes

conditional

sequences

unconditional

subshell

Background processing

commandsubstitutions

shell functionsshell functions

Page 6: CHAPTER 2 THE UNIX SHELLS

SELECTING A SHELL: chsh 6

Even though it depends on the system, usually the pathnames for shells are as follows:

Bourne shell: /bin/sh Korn shell: /bin/ksh C shell: /bin/csh

Page 7: CHAPTER 2 THE UNIX SHELLS

SELECTING A SHELL: chsh 7

The command chsh is used to change the current shell

$ chshchanging login shell for haliciOld shell: bin/sh ... displayedNew shell: bin/csh ... you enter the pathname for the new

shell$ ^D ... terminate login shelllogin: halicipassword: *********% ... the prompt of the C shell

$ chshchanging login shell for haliciOld shell: bin/sh ... displayedNew shell: bin/csh ... you enter the pathname for the new

shell$ ^D ... terminate login shelllogin: halicipassword: *********% ... the prompt of the C shell

Page 8: CHAPTER 2 THE UNIX SHELLS

SHELL variable8

SHELL is a system variable whose value is the pathname of the active shell.

To access the value of SHELL, precede it by $ symbol as $SHELL.

To see the value of a variable the echo command can be used.

$ echo these are argumentsthese are arguments$ echo SHELLSHELL

$ echo these are argumentsthese are arguments$ echo SHELLSHELL

echo is a built in shell command that displays all its arguments to the standard output device.

echo is a built in shell command that displays all its arguments to the standard output device.

Page 9: CHAPTER 2 THE UNIX SHELLS

SHELL variable9

SHELL is a system variable whose value is the pathname of the active shell.

To access the value of SHELL, precede it by $ symbol as $SHELL.

To see the value of a variable the echo command can be used.

$ echo these are argumentsthese are arguments$ echo SHELLSHELL $ echo $SHELL/bin/sh

$ echo these are argumentsthese are arguments$ echo SHELLSHELL $ echo $SHELL/bin/sh

echo is a built in shell command that displays all its arguments to the standard output device.

echo is a built in shell command that displays all its arguments to the standard output device.

the value of the SHELL variable is displayedthe value of the SHELL variable is displayed

Page 10: CHAPTER 2 THE UNIX SHELLS

Shell operation10

When a shell is invoked1. It reads a special start-up file, typically located user’s

home directory, that contains some initialisation information

2. It displays a prompt and it waits for a user command

3. If the user enters a control-D character on a line of its own, this is interpreted by the shell as meaning “end of input” and causes the shell to terminate; otherwise the shell executes the user command and returns to step 2.

Page 11: CHAPTER 2 THE UNIX SHELLS

shell command11

A shell command may be simple as $ ls

  or complex-looking pipline sequences as

$ ps | sort | lpr

Page 12: CHAPTER 2 THE UNIX SHELLS

metacharacters12

Some charcters are processed specially by shell and are known as metacharacters.

Redirection> : Output redirection; writes standard output to a

file

>> : Output redirection; appends standard output to a file

< : Input redirection; reads standard input from a file

<<lbl : Input redirection; reads standard input from script up to label “lbl”

Page 13: CHAPTER 2 THE UNIX SHELLS

metacharacters13

File substitution* : File substitution wildcard; matches zero or more

characters? : File substitution wildcard; matches any single characters[...] : File substitution wildcard; matches any single character

between brackets

Command substitution`cmd`: Command substitution; replaced by the output from

command

pipe| : Pipe symbol, sends the output of one process to the

input of another

Page 14: CHAPTER 2 THE UNIX SHELLS

metacharacters14

Sequencing; : Used to sequence commands|| : Conditional execution; executes a command if the

previous one fails&& : Conditional execution; executes a command if the

previous one succeeds

Other(...) : Group of commands& : Runs a command in the background# : All characters that follow up to a new line are comment$ : Access a variable

Page 15: CHAPTER 2 THE UNIX SHELLS

metacharacters15

When you enter a command, the shell scans it for metacharacters and processes them specially.

When all metacharacters have been processed, the command is finally executed.

Page 16: CHAPTER 2 THE UNIX SHELLS

metacharacters16

To turn off the special meaning of a metacharater, precede it by a “\” character.

$ echo hi >file$ cat filehi$ echo hi \>filehi >file$

$ echo hi >file$ cat filehi$ echo hi \>filehi >file$

output redirectionoutput redirection

output redirection is inhibited... So the output is not stored to file but displayed at screen

output redirection is inhibited... So the output is not stored to file but displayed at screen

Page 17: CHAPTER 2 THE UNIX SHELLS

OUTPUT REDIRECTION: >, >>17

$ cat >myfileAli Ahmet Can^D$ cat myfileAli Ahmet Can

$ cat >myfileAli Ahmet Can^D$ cat myfileAli Ahmet Can

myfilemyfileAli Ahmet

CanAli Ahmet

Can

Page 18: CHAPTER 2 THE UNIX SHELLS

OUTPUT REDIRECTION: >, >>18

$ cat >myfileAli Ahmet Can^D$ cat myfileAli Ahmet Can$ cat >myfileCem Nil^D$ cat myfileCem Nil

$ cat >myfileAli Ahmet Can^D$ cat myfileAli Ahmet Can$ cat >myfileCem Nil^D$ cat myfileCem Nil

myfilemyfileAli Ahmet

CanAli Ahmet

Can

myfilemyfile

Cem NilCem Nil

Page 19: CHAPTER 2 THE UNIX SHELLS

OUTPUT REDIRECTION: >, >>19

$ cat >>myfileCanan^D$ cat myfileCem NilCanan$

$ cat >>myfileCanan^D$ cat myfileCem NilCanan$

myfilemyfile

Cem NilCem Nil

myfilemyfile

Cem NilCananCem NilCanan

Page 20: CHAPTER 2 THE UNIX SHELLS

INPUT REDIRECTION: <20

$ mail halici <myletter  “halici” is the destination address to which the

mail is to be sent. The file myletter contains the mail body that

should be entered using standard input device if input redirection was to be not used.

$ mail halici <myletter$ mail halici <myletter

Page 21: CHAPTER 2 THE UNIX SHELLS

$ ls –R #recursively list my current directorya.c b.c cc.c dir1 dir2dir1:d.c e.edir2:f.d g.c

$ ls –R #recursively list my current directorya.c b.c cc.c dir1 dir2dir1:d.c e.edir2:f.d g.c

FILENAME SUBSTITUTION: *, ?, [...]21

halicihalici

a.ca.c

Current directory

Current directory

b.cb.c cc.c

cc.c dir1dir1 dir2dir2

d.cd.c e.ee.e f.df.d g.cg.c

Page 22: CHAPTER 2 THE UNIX SHELLS

$ ls *.c #any number of characters followed by “.c”a.c b.c cc.c

$ ls ?.c #one character followed by “.c”a.c b.c

$ ls *.c #any number of characters followed by “.c”a.c b.c cc.c

$ ls ?.c #one character followed by “.c”a.c b.c

FILENAME SUBSTITUTION: *, ?, [...]22

halicihalici

a.ca.c

Current directory

Current directory

b.cb.c cc.c

cc.c dir1dir1 dir2dir2

d.cd.c e.ee.e f.df.d g.cg.c

Page 23: CHAPTER 2 THE UNIX SHELLS

$ ls [ac]* #either “a” or “c” followed by any number of charactersa.c cc.c

$ ls [A-Za-z]* # an alphabetic character followed by any number of charactersa.c b.c cc.c dir1 dir2

$ ls [ac]* #either “a” or “c” followed by any number of charactersa.c cc.c

$ ls [A-Za-z]* # an alphabetic character followed by any number of charactersa.c b.c cc.c dir1 dir2

FILENAME SUBSTITUTION: *, ?, [...]23

halicihalici

a.ca.c

Current directory

Current directory

b.cb.c cc.c

cc.c dir1dir1 dir2dir2

d.cd.c e.ee.e f.df.d g.cg.c

Page 24: CHAPTER 2 THE UNIX SHELLS

$ ls dir*/*.c # all files ending in “.c” in directories starting with “dir”dir1/d.c dir2/g.c

$ ls */*.c # all files ending with “.c” in a subdirectorydir1/d.c dir2/g.c

$ ls *2/?.? ?.?a.c b.c dir2/f.d dir2/g.c

$ ls dir*/*.c # all files ending in “.c” in directories starting with “dir”dir1/d.c dir2/g.c

$ ls */*.c # all files ending with “.c” in a subdirectorydir1/d.c dir2/g.c

$ ls *2/?.? ?.?a.c b.c dir2/f.d dir2/g.c

FILENAME SUBSTITUTION: *, ?, [...]24

halicihalici

a.ca.c

Current directory

Current directory

b.cb.c cc.c

cc.c dir1dir1 dir2dir2

d.cd.c e.ee.e f.df.d g.cg.c

Page 25: CHAPTER 2 THE UNIX SHELLS

PIPES: |25

The shell allows you to use the standard output of one process as the standard input of another one by connecting them using the pipe “|” metacharacter.

$ command1 | command2

The above sequence causes the standard output of command1 to flow through to the standard input of command2.

Any number of commands may be connected by pipes. A sequence of commands chained together in this way is called a pipeline.

The standard error channel is not piped through a standard pipeline, although some shells support this capability.

Page 26: CHAPTER 2 THE UNIX SHELLS

PIPES: |26

$ lsa.c b.c cc.c dir1 dir2$ ls |wc –w5$

$ lsa.c b.c cc.c dir1 dir2$ ls |wc –w5$

Note that the output of ls command is not displayed when it is piped to wc.

lsls wcwcpipe terminal

a.c b.c cc.c dir1 dir2

5

Page 27: CHAPTER 2 THE UNIX SHELLS

PIPES: |27

If you desire to see the output of intermediate commands use “tee”. 

tee –a {fileame}+

 a: append input to the files rather than overwriting them. 

Page 28: CHAPTER 2 THE UNIX SHELLS

PIPES: |28

The tee utility copies its standard input to the specified files and to its standard output.  

cmd 1cmd 1 teeteepipe

std outputdevice

cmd 2cmd 2std inputdevice

pipe

file

std error

device

std error

device

std error

device

Page 29: CHAPTER 2 THE UNIX SHELLS

PIPES: |29

$ lsa.c b.c cc.c dir1 dir2$ ls |tee myfile|wc –w5$cat myfilea.c b.c cc.c dir1 dir2

$ lsa.c b.c cc.c dir1 dir2$ ls |tee myfile|wc –w5$cat myfilea.c b.c cc.c dir1 dir2

lsls teeteea.c b.c cc.c dir1 dir2

wcwc

myfile

a.c b.c cc.c dir1 dir2

5

std outputdevice

Page 30: CHAPTER 2 THE UNIX SHELLS

PIPES: |30

lsls teeteea.c b.c cc.c dir1 dir2 myfile

myfile2

$ ls |tee myfile2a.c b.c cc.c dir1 dir2 myfile$ cat myfile2a.c b.c cc.c dir1 dir2 myfile

$ ls |tee myfile2a.c b.c cc.c dir1 dir2 myfile$ cat myfile2a.c b.c cc.c dir1 dir2 myfile

a.c b.c cc.c dir1 dir2myfile

std outputdevice

Page 31: CHAPTER 2 THE UNIX SHELLS

CONDITIONAL SEQUENCES31

Every UNIX process terminates with an exit value.

By convention, exit value 0 means that the process completed successfully, and a non-zero exit value indicates failure.

All built in shell commands return 1 if they fail.

Page 32: CHAPTER 2 THE UNIX SHELLS

$ cc myprog || echo compilation failed$ cc myprog || echo compilation failed

$ cc myprog && echo compilation succeeded$ cc myprog && echo compilation succeeded

CONDITIONAL SEQUENCES32

Above, the C compiler named cc compiles a program called myprog and if compilation succeeds echo command will be executed.

In the following case, echo command will be executed if compilation fails.

Page 33: CHAPTER 2 THE UNIX SHELLS

GROUPING COMMANDS 33

Commands may be grouped by placing them between parantheses.

This causes them to be executed by a child shell (subshell).

The group of commands shares the same standard input, standard output and standard error channels.

They may be redirected as if it were a simple command.

Page 34: CHAPTER 2 THE UNIX SHELLS

GROUPING COMMANDS 34

$ date; ls; pwd >out.txt # execute a sequenceMon, May 3 15:35:12 MEDT 2005a.c b.c

$ cat out.txt # only pwd was redirected/home122/halici

$ (date; ls; pwd) >out.txt # execute a group

$ cat out.txt # all the commands were redirectedMon, May 3 15:35:12 MEDT 2005a.c b.c/home122/halici

$ date; ls; pwd >out.txt # execute a sequenceMon, May 3 15:35:12 MEDT 2005a.c b.c

$ cat out.txt # only pwd was redirected/home122/halici

$ (date; ls; pwd) >out.txt # execute a group

$ cat out.txt # all the commands were redirectedMon, May 3 15:35:12 MEDT 2005a.c b.c/home122/halici

Page 35: CHAPTER 2 THE UNIX SHELLS

BACKGROUND PROCESSING: &35

If you follow a simple command, pipeline, sequence of pipelines or group of commands by the & metacharacter, a subshell is created to execute the commands as a background process.

The background processes run concurrently with the parent shell, but does not take the control of the keyboard.

Parent shell

Subshell to execute background process

Page 36: CHAPTER 2 THE UNIX SHELLS

BACKGROUND PROCESSING: &36

To explain background processing we will use the find command as example.

In the following form it is used to list the filenames which matches the given pattern.

 find pathlist –name pattern –print

  Since it searches all the subdirectories its execution

takes time. When a process executes in background, since it is

executing concurrently with the parent shell, its output will interleave with foreground process’ outputs.

Page 37: CHAPTER 2 THE UNIX SHELLS

BACKGROUND PROCESSING: &37

find

find &

$ find . –name a.c –print ... search for a.c in the current & sub directories, foreground execution

./wild/a.c ... output from find

./reverse/a.c ... some more output as it continues its exec$ find . –name a.c –print & ... run the same command in background27074 ... process id of the background process$ date ... date is executing in foreground ./wild/a.c ... some output from background findMon May 3 15:40:10 MEDT 2005 ... output from foreground date$ ./reverse/a.c ... foreground prompt and more output from

background find

$ find . –name a.c –print ... search for a.c in the current & sub directories, foreground execution

./wild/a.c ... output from find

./reverse/a.c ... some more output as it continues its exec$ find . –name a.c –print & ... run the same command in background27074 ... process id of the background process$ date ... date is executing in foreground ./wild/a.c ... some output from background findMon May 3 15:40:10 MEDT 2005 ... output from foreground date$ ./reverse/a.c ... foreground prompt and more output from

background find

date

1

23456789

1 2 3 4 6 8 9

5 7 9

Page 38: CHAPTER 2 THE UNIX SHELLS

BACKGROUND PROCESSING: &38

You may specify several background commands on a single line by seperating them by &.

x$ date & pwd & ... run date and pwd in background27110 ... process id of the background process date27111 ... process id of the background process pwd/home122/halici ... output from background pwd$ Mon May 3 15:42:11 MEDT 2005 ... foreground prompt and output from

background date

x$ date & pwd & ... run date and pwd in background27110 ... process id of the background process date27111 ... process id of the background process pwd/home122/halici ... output from background pwd$ Mon May 3 15:42:11 MEDT 2005 ... foreground prompt and output from

background date

Page 39: CHAPTER 2 THE UNIX SHELLS

REDIRECTING BACKGROUND PROCESSES

39

Outputs of background processes can be redirected in the usual way.

$ find . –name a.c –print >find.txt & ... background process, output redirected27170$ ls –l find.txt ... look at find.txt-rw-r--r-- 1 halici 0 May 3 15:45:21 find.txt$ ls –l find.txt ... watch it as it grows-rw-r--r-- 1 halici 29 May 3 15:46:32 find.txt$ cat find.txt./wild/a.c./reverse/a.c$

$ find . –name a.c –print >find.txt & ... background process, output redirected27170$ ls –l find.txt ... look at find.txt-rw-r--r-- 1 halici 0 May 3 15:45:21 find.txt$ ls –l find.txt ... watch it as it grows-rw-r--r-- 1 halici 29 May 3 15:46:32 find.txt$ cat find.txt./wild/a.c./reverse/a.c$

file size grows

file size grows

Page 40: CHAPTER 2 THE UNIX SHELLS

REDIRECTING BACKGROUND PROCESSES

40

Some utilities also produce output on the standad error channel, which must be redirected in addition to the standard output channel.

Note that 0 represents standard input channel, 1 represents standard output channel and 2 represents standard error channel.

Page 41: CHAPTER 2 THE UNIX SHELLS

REDIRECTING BACKGROUND PROCESSES

41

$ man ps >ps.txt & ... save documentation about command ps in background

27203$ Reformatting page, wait ... std error output from “man”done ... more std error output from “man$ man ps >ps.txt 2>&1 & ... redirect std error channel to the place

redirected for std output

$ man ps >ps.txt & ... save documentation about command ps in background

27203$ Reformatting page, wait ... std error output from “man”done ... more std error output from “man$ man ps >ps.txt 2>&1 & ... redirect std error channel to the place

redirected for std output

Page 42: CHAPTER 2 THE UNIX SHELLS

REDIRECTING BACKGROUND PROCESSES

42

When a background process attempts to read from a terminal, the terminal automatically sends it an error signal which causes it terminate.

To overcome the problem, use input redirection.

$ mail halici & ... run mail, which needs input, in background27210$ No message !?! ... it does not wait for keyboard and returns$ mail halici <letter.txt & ... run mail in background with input redirection,

no problem 27212$

$ mail halici & ... run mail, which needs input, in background27210$ No message !?! ... it does not wait for keyboard and returns$ mail halici <letter.txt & ... run mail in background with input redirection,

no problem 27212$