Professional Documents
Culture Documents
1
Korn Shell
Invented by David Korn of AT&T Bell Labs in mid
1980s
Upwardly compatible with the Bourne shell
Became a standard part of Unix Systems Labs
(USL) SVR4
Two major versions exist, ksh88 and ksh93
ksh88 is on clyde
ksh93 is also available as /usr/dt/bin/dtksh
2
Major Features
.profile
Command line editing
History
Environment file
Random numbers
Print
Whence
Built-in arithmetic
Aliases
3
Job control
Additional built-in variables
Additional pattern matching
Additional options for test
Typeset
Read
Parameter Expansion
4
.profile
Kept in your home (login) directory
Used for customizing the user interface of ksh
Used to store
Aliases
Shell variables
Options
Location of environment file
Only executed if ksh is a login shell
5
Options
Options alter the the shell's behavior
Over 20 options available - common ones are:
bgnice noclobber
emacs noglob
ignoreeof trackall
markdirs vi
monitor
Options are set using "set -o optionname" and unset
using "set +o optionname"
6
Command Line Editing
Enabled in two different ways
Using the shell variable VISUAL
VISUAL=$(whence vi)
7
Editing Commands in vi-mode
CTRL-W - Erase previous word
CTRL-V - "Quote" the next character
ESC - Enter control mode (edit mode)
Edit mode uses same movement commands as vi
h, l, w,b 0,^,$, etc.
Also uses same editing commands
i, a, r, R, x, d(movement command)
8
File Name Completion in vi-mode
File name completion is also supported
Type the command an the beginning of the file name
Touch ESC and the \
ksh will attempt to complete the file name for you
If no name matches, shell beeps and nothing
happens
If there is exactly one way to complete the name, the
9
History
This feature alone may make it worth moving to
Korn shell (when combined with command line
editing)
History is stored in a file (normally .sh_history) in
your home directory
Location can be changed by defining HISTFILE
Note: if you want history kept for each subshell, you
11
Same Thing Using Korn
Korn shell:
$r 36 (to re-execute command 36 in history)
$r f (to re-execute the most recent command
beginning with f)
$fc f (to fix command that started with an f)
or $fc cmd_no.
This will put you into the editor of your choice
executed
$fc –l (lists history commands)
ksh automatically aliases history to fc -l
12
Moving Around the History File
Again, the vi commands work here
k - move backwards one line (command)
j - move forward one command
nG - move to command n
?string - search backwards for string
/string - search forwards for string
n - repeat search in same direction
N - repeat search in opposite direction
The first two can be preceded by repeat counts
3k - move backwards 3 commands
13
Environment File
Although predefined environmental variables will
always be known to subshells, the shell must be
explicitly told which other variables, aliases, and
options should be communicated to subshells
One way to do this is to put them in an
environment file
Do this by placing
export ENV=~/environmentfile in your .profile and then
putting your data in environmentfile
14
Random Numbers
The Korn shell provides a random number
generator
To initialize it, you type RANDOM=$$ (or a
specific number if you want a repeatable
sequence)
Each time you echo the RANDOM variable, you
will get anew random number in the range 0
-32767
15
print
In other shells, you usually use awk when you
want formatted printing
ksh provides print. It doesn't allow as much
control over printing as awk but it does provide
more control than echo
print has a variety of formatting options and
parameters
16
print Formatting Options
\a - announce, ring the bell
\b - backspace
\c - print line without newline (rest of args ignored)
\f - formfeed
\n - newline
\r - carriage return
\t - tab
\v - vertical tab
\Ox - the 8 bit ASCII character with octal value x
\\ - backslash
17
print Parameters
- process anything that follows as an
argument if it begins with a -
-R do not use the \ conventions, also anything
except -n that follows is processed as an
argument
-n do not add trailing newlines to output
-p send arguments via pipe to a co-process
-r don't use the \ conventions
-s direct the arguments to the history file
-un redirect arguments to the file descriptor n
(default is 1 or stdout)
18
whence
Tells you where a command resides
Two options, -p and -v, control the format of the
output
whence alone prints the path to the command
whence vi
/bin/ucb/vi
-v also lists the type of command
whence -v vi
vi is a tracked alias for /usr/ucb/vi
-p does a path search even if the name is a
reserved word or alias
19
Built-In Arithmetic
In the Bourne shell, if you wanted to do math you
had to use eval and command substitution
ksh lets you do arithmetic using either the let
command or (( ))
(( )) good for True/False comparisons; $(( )) provides
value of computation
$ let a = 6+8
$ print $a
$ 14
Note that there are no spaces in the expression. If you
want to use spaces, you must single quote the
expression
20
The (( )) is useful in as a conditional because it
returns a 1 or 0
if test (($min+$max>$top))
then
print "Ooh, a big one!"
else
print "Guess not"
fi
ksh can also work with bases other than 10
b#n is the same as n to the base b
8#17 is an octal 17 (15 decimal)
21
Aliases
ksh has aliases very similar to the C shell
It adds the concept of tracked aliases
These translate faster than normal aliases
When used, the shell searches the path the first time
and then remembers where the command was found
Future uses of the alias go directly to the command
You can also unalias in the Korn shell
22
Job Control
Korn shell supports job control almost the same as C
shell
CTRL-Z places a job in the background, as does
command &
fg brings a job back to the foreground
Referring to background jobs is also similar
%n job n
%string job whose command begins with string
?string job whose command contains string
%+ most recently invoked background job
%% same as %+
%- second-most recently invoked bg job
23
Additional Built-In Variables
PS1, PS2, PS3, PS4 - prompt strings
LOGNAME - your login name
CDPATH - provides a path to use when
performing cd
Normally, cd dirname looks for a directory in your
current working directory
CDPATH provides a list of places to look for dirname
EDITOR - pathname of your preferred editor,
various programs refer to this and it sets the
mode for command line editing
24
VISUAL - similar to EDITOR, used if EDITOR not
set
FCEDIT - editor to use with fc to edit commands
in the history file
OLDPWD - previous directory before last cd
SECONDS - number of seconds since the current
shell was invoked
25
Additional Pattern Matching
Korn shell supports additional pattern matching
metacharacters
?(pattern[|pattern]…) matches zero or one
occurrence of any of the patterns
phre?([drs]|xx) would match phred, phrer, phres, and
phrexx, ?(x) would match null and 'x'
*(pattern[|pattern]…) matches zero or more
occurrences of any pattern
phre*([0-9]) would match 'phre' or 'phre' followed by any
number of digits
26
+(pattern[|pattern]…) matches one or more
occurrences of any pattern
phre+([0-9]) would match 'phre' followed by one or
more digits, +(x) would match 'x', 'xx', 'xxx' …
@(pattern[|pattern]…) matches any occurrence of
any pattern
Most useful when used as a logical OR. phre@(ddy|ds|
ak) would match phreddy or phreds or phreak. @(x|y|
z) matches 'x' or 'y' or 'z'
27
!(pattern[|pattern]…) matches zero or more
occurrences of any pattern
Not really a regular expression but it is handy. It
matches any that is not a pattern.
phre!(d|[0-5]) would match anything that started with
'phre' but did not end with a 'd' or the digits 0-5. !(x)
would match any ASCCI character except 'x'
28
Additional Options for test
The Korn shell gives additional options for the test
command
-a the file exists
-G file has same group as test process
-L file is symbolic (soft) link
-O file has same owner as test process
-o option true if shell option is on (set)
-S file is a socket
-z string is zero length
f1 -ef f2 the two files are linked (same inode)
f1 -nt f2 true if f1 is newer than f2
f1 -ot f2 true if f1 is older than f2
29
Typeset
In the Korn shell, you can assign types to
variables
typeset -i count
makes count an integer, if you tried to assign a string to
it, the shell would give you an error message
You can typeset with the following attributes
-u make uppercase (forces string to uppercase)
-l make lowercase
-in require integers and store internally as integer;
n specifies the base
-r make variable readonly
-x export the variable
30
-Ln left justify to remove leading spaces; fill with
spaces or truncate on right to n bytes
-Rn right justify to remove trailing spaces; fill with
spaces or truncate on left to n bytes
-Zn same as -R except pad with leading 0's instead
of spaces
typeset +o is used to turn the option off
31
Read
read functions much like it did in the Bourne shell
However, it can be smart and send the prompt to
stderr without special processing
$ read variable?'prompt'
33
Substrings
${variable#pattern} - if pattern matches the
beginning of variable's value, delete the shortest
part that matches and return the rest
${variable##pattern} - if pattern matches the
beginning of variable's value, delete the longest
part that matches and return the rest
${variable%pattern} - if pattern matches the end of
variable's value, delete the shortest part that
matches and return the rest
${variable%%pattern} - if pattern matches the end
of variable's value, delete the longest part that
matches and return the rest
34
Command Substitution
In the Korn shell, command substitution is done
with a different syntax
The Bourne shell ` ` syntax is supported but
discouraged
$(command arg1 arg2 …) is replaced with the
result of the command
An example might be in your .profile file when you
set up your VISUAL or EDITOR variable
EDITOR=$(whence vi)
This would evaluate to
EDITOR=/bin/ucb/vi
35
Functions
The Korn shell's function feature is an expanded
version of that found in the Bourne shell
A function is similar to a script except it is kept in
the shell's memory. Because it is kept in memory, it
runs faster than loading a script
Functions allow you to create your own groups of
commands, which can make shell programming
much easier since they can be used analogously to
subroutines
Functions are not inherited by subshells unless you
define them in the environment file with the typeset
command: typeset -fx functname
36
Syntax
function functname{
shell command
shell command
…
}
37
There are two important differences between functions
and scripts
A functions does not run as a separate process
It shares variables with the process that invoked it
caller
If a function has the same name as a script or executable
program, the function takes precedence
The return statement returns the exit status of the last
command executed
Functions can be recursive but you need to be careful
38
Autoloaded Functions
The simplest place to define functions is in your
.profile or environment file
However, if you have a lot of definitions, the delay in
reading these files each time you log in or invoking a
subshell can become unacceptably slow
Autoload lets you tell the shell to only read the
function definition when it is invoked the first time
"autoload functname" creates an undefined function,
functname, that won't be loaded until the first time it is
actually called
39
Finding Autoload Definitions
The FPATH variable tells the shell where to
search for autoload functions
For example, if your .profile (or environment file)
contains the following
FPATH=~/funcs
autoload my_function
When you invoke the function my_function the
first time, the shell will search the directories in
FPATH for a file called my_function which has a
definition of function my_function and load it into
the shell's memory space
40
Example Functions
function increment {
typeset sum # sum is a local variable*
((sum = $1 + 1))
return $sum
}
$ square 10
Number to be squared is 10.
The result is 100.
$
42