COHERENT manpages

This page displays the COHERENT manpage for ksh [The Korn shell].

List of available manpages
Index


ksh -- Command

The Korn shell
ksh token ...

The COHERENT system offers  two command interpreters: sh, the Bourne shell;
and ksh,  the Korn shell.  sh is the  default COHERENT command interpreter.
The shell  tutorial included in  this manual describes the  Bourne shell in
detail.

This  article describes  ksh, the  Korn shell.   ksh is  a superset  of the
Bourne shell,  and contains  many features that  you may well  find useful.
These include MicroEMACS-style editing of command lines; command hashing; a
full-featured aliasing feature; and a job-control facility.

Invoking ksh

To invoke ksh from within the Bourne shell, simply type ksh at the command-
line prompt.  To  use ksh as your default shell,  instead of sh, append the
command /usr/bin/ksh to the end of your entry in the file /etc/passwd. (See
the Lexicon entry for passwd for more information on this file.)

You can invoke  ksh with one or more built-in  options; these are described
below.

Commands

A  command consists of  one or  more tokens.  A token is  a string  of text
characters (i.e., one or more alphabetic characters, punctuation marks, and
numerals) delineated by spaces, tabs, or newlines.

A simple command  consists of the command's name, followed  by zero or more
tokens that  represent arguments to  the command, names of  files, or shell
operators.  A  complex command will use shell constructs  to execute one or
more  commands conditionally.   In  effect, a  complex command  is a  mini-
program that is written in the shell's programming language and interpreted
by ksh.

Shell Operators

The shell  includes a number  of operators that form  pipes, redirect input
and output to commands, and  let you define conditions under which commands
are executed.

command | command
     The pipe operator: let the output of one command serve as the input to
     a  second.  You  can combine  commands with `|'  to form  pipelines. A
     pipeline passes the standard output of the first (leftmost) command to
     the  standard  input  of the  second  command.   For  example, in  the
     pipeline

         sort customers | uniq | more

     ksh invokes sort to sort the contents of file customers.  It pipes the
     output of sort  to the command uniq, which outputs  one unique copy of
     the text that is input into  it.  ksh then pipes the output of uniq to
     the command more, which displays  it on your terminal one screenful at
     a time.   Note that under COHERENT, unlike  MS-DOS, pipes are executed
     concurrently: that  is, sort does  not have to finish  its work before
     uniq and more can begin to receive input and get to work.

command ; command
     Execute commands  on a command line sequentially.   The command to the
     left of the `;' executes to  completion; then the command to the right
     of it executes.  For example, in the command line

         a | b ; c | d

     first execute the pipeline a |  b then, when a and b complete, execute
     the pipeline c | d.

command &
     Execute a  command in the  background.  This operator  must follow the
     command,  not precede  it.  It  prints the  process identifier  of the
     command on  the standard output,  so you can  use the kill  command to
     kill that  process should something go wrong.   This operator lets you
     execute  more  than  one  command  simultaneously.  For  example,  the
     command

         /etc/fdformat -v /dev/fha0 &

     formats a  high-density, 5.25-inch  floppy disk  in drive 0  (that is,
     drive  A); but  while the  disk  is being  formatted, ksh  returns the
     command line  prompt so you can immediately  enter another command and
     begin to  work.  If you did  not use the `&'  in this command, you
     would  have to  wait until  formatting was  finished before  you could
     enter another command.

     ksh also prints a message on your terminal when a command that you are
     running  in the  background finishes  processing.   It does  not check
     these ``child''  processes very often, however, so  a command may have
     finished  some time  before  ksh informs  you  of the  fact.  See  the
     Lexicon article  for the command ps for  information on all processes;
     also see the description of the built-in command jobs, below.

command && command
     Execute a command upon success.  ksh executes the command that follows
     the token `&&' only if  the command that precedes it returns a
     zero exit status, which signifies success.  For example, the command

         cd /etc
         fdformat -v /dev/fha0 && badscan -o proto /dev/fha0 2400

     formats  a  floppy  disk,  as  described  above.  If  the  format  was
     successful, it  then invokes the command badscan to  scan the disk for
     bad blocks; if it was not successful, however, it does nothing.

command || command
     Execute  a  command  upon  failure.   This  is identical  to  operator
     `&&', except that the  second command is executed if the first
     returns a non-zero  status, which signifies failure.  For example, the
     command

         /etc/fdformat -v /dev/fha0 || echo "Format failed!"

     formats a  floppy disk.  If  formatting failed, it  echoes the message
     Format failed!  on your terminal; however,  if formatting succeeds, it
     does nothing.

     Note that  the tokens newline, `;' and `&'  bind less tightly than
     `&&' and `||'.  ksh parses command lines from left to right if
     separators bind equally.

>file
     Redirect standard  output.  The  standard input, standard  output, and
     standard  error streams  are normally  connected  to the  terminal.  A
     pipeline attaches  the output of  one command to the  input of another
     command.  In  addition, ksh includes a set  of operators that redirect
     input and output into files rather than other commands.

     The operator  `>' redirects output  into a file.   For example, the
     command

         sort customers >customers.sort

     sorts  file   customers  and  writes  the   sorted  output  into  file
     customers.sort. It  creates customers.sort if  it does not  exist, and
     destroys its previous contents if it does exist.

>>file
     Redirect output into a file, and  append.  If the file does not exist,
     this operator  creates it; however,  if the file  already exists, this
     operator  appends  the  output to  that  file's  contents rather  than
     destroying those contents.  For example, the command

         sort customers.now | uniq >>customers.all

     sorts  file customers.now,  pipes its  output  to command  uniq, which
     throws away duplicate lines of  input, and appends the results to file
     customers.all.

<file
     Redirect standard  input.  Here, ksh reads the contents  of a file and
     processes  them as  if you  had  typed them  from your  keyboard.  For
     example, the command

         ed textfile <edit.script

     invokes  the line-editor  ed  to edit  textfile;  however, instead  of
     reading editing  commands from your keyboard, the  shell passes ed the
     contents  of  edit.script.   This command  would  let  you prepare  an
     editing  script that  you could execute  repeatedly upon  files rather
     than having to type the same commands over and over.

<< token
     Prepare  a  ``here  document''.  This  operator  tells  ksh to  accept
     standard  input  from the  shell  input  until it  reads  a line  that
     contains only token. For example, the command

         cat >FOO <<\!
             Here is some text.
         !

     redirects all  text between `<<\!'  and `!' to  the cat command.
     The `>'  in turn redirects  the output of  cat into file  FOO.  ksh
     performs  parameter  substitution  on  the  here document  unless  the
     leading  token  is  quoted;  parameter  substitution and  quoting  are
     described below.

command 2> file
     Redirect  the standard  error stream  into a  file.  For  example, the
     command

         nroff -ms textfile >textfile.p 2>textfile.err

     invokes  the command  nroff to  format the  contents of  textfile.  It
     redirects  the  output  of  nroff  (i.e.,  the standard  output)  into
     textfile.p;  it  also  redirects any  error  messages  that nroff  may
     generate into file textfile.err.

     Note in passing that a command  may use up to 20 streams.  By default,
     stream 0 is  the standard input; stream 1 is  the standard output; and
     stream 2  is the standard error.   ksh lets you redirect  any of these
     streams individually into files, or combine streams into each other.

<&amp;n
     ksh can redirect the standard input and output to duplicate other file
     descriptors.  (See the  Lexicon article file descriptor for details on
     what these are.) This operator duplicates the standard input from file
     descriptor n.

>&amp;n
     Duplicate the standard output from file descriptor n.  For example,

         2>&1

     redirects file descriptor 2  (the standard error) to file descriptor 1
     (the standard output).

Note that  each command executed as a foreground  process inherits the file
descriptors  and signal  traps  (described below)  of  the invoking  shell,
modified  by any  specified redirection.   Background processes  take input
from the  null device /dev/null  (unless redirected), and  ignore interrupt
and quit signals.

File-Name Patterns

The  shell  interprets an  input  token  that contain  any  of the  special
characters `?', `*', or `[' as a file name pattern.

?  Match any single character except newline.  For example, the command

       ls name?

   will print  the name of any  file that consists of  the string name plus
   any one character.  If name is followed by no characters, or is followed
   by two or more characters, it will not be printed.

*  Match a string of non-newline characters of any length (including zero).

       ls name*

   prints the name of any file that begins with the string name, regardless
   of  whether  it is  followed  by any  other  characters.  Likewise,  the
   command

       ls name?*

   prints the name of any file that consists of the string name followed by
   at least one character.  Unlike name*, the token name?* must be followed
   by at least one character before it will be printed.

~name
   Replace the  name of user  name with his $HOME  directory.  For example,
   the command

       ls -l ~norm/src

   lists  the contents  of  the src  subdirectory located  under the  $HOME
   directory for  user norm. This  spares you from  having to know  where a
   given user's HOME directory is located.

   The character  `~' on  its own  is a synonym  for the home  directory of
   whoever is running the command.  For example, the command

       /usr/lib/uucp FOO mwcbbs:~

copies file  FOO into directory /usr/spool/uucppublic  on system mwcbbs. In
this instance,  `~' expands into /usr/spool/uucppublic  because the command
uucico  invokes setuid()  to change  the ownership of  the process  to user
uucp, whose home directory is /usr/spool/uucppublic.

[!xyz]
     Exclude  characters xyz  from  the string  search.   For example,  the
     command

         ls [!abc]*

     prints all files in the current directory except those that begin with
     a, b, or c.

[C-c]
     Enclose  alternatives  to  match a  single  character.   A hyphen  `-'
     indicates a range of characters.  For example, the command

         ls name[ABC]

     will print  the names of  files nameA, nameB, and  nameC (assuming, of
     course, that those files exist in the current directory).  The command

         ls name[A-K]

     prints the  names of files  nameA through nameK  (again, assuming that
     they exist in the current directory).

When  ksh reads  a token  that  contains one  of the  above characters,  it
replaces the  token in the command  line with an alphabetized  list of file
names that match the pattern.  If  it finds no matches, it passes the token
unchanged to the command.  For example, when you enter the command

    ls name[ABC]

ksh replaces  the token name[ABC]  with nameA, nameB, and  nameC (again, if
they exist in the current directory), so the command now reads:

    ls nameA nameB nameC

It then passes this second, transformed  version of the command line to the
command ls.

Note that the  slash `/' and leading period `.'  must be matched explicitly
in a pattern.  The slash, of course, separates the elements of a path name;
while  a period  at  the begin  of  a file  name usually  (but not  always)
indicates that that file has special significance.

Pattern Matching in Prefixes and Suffices

Special constructs let you match patterns in the prefixes and suffices of a
string:

{#parameter}
     This  operator  gives  the  number  of  characters in  parameter.  For
     example:

         foo=BAZZ
         echo ${#foo} -> 4

{parameter%word}
     This  returns the  shortest string  in which  the suffix  of parameter
     matches  word. For  example, given  that xyzzy=usr/bin/cpio,  then the
     command

         echo ${xyzzy%/*}

     echoes the string usr/bin.

{parameter%%word}
     This  returns the  longest  string in  which the  suffix of  parameter
     matches  word. For  example, given  that xyzzy=usr/bin/cpio,  then the
     command

         echo ${xyzzy%/*}

     echoes the string usr.

{parameter#word}
     This  returns the  shortest string  in which  the prefix  of parameter
     matches word. For example, given that plugh=usr/bin/cpio, the command

         echo ${plugh#*/}

     echoes bin/cpio.

{parameter##word}
     This  returns the  longest  string in  which the  prefix of  parameter
     matches word. For example, given that plugh=usr/bin/cpio, the command

         echo ${plugh##*/}

     echoes cpio.

The following  shows how to use these expressions  to implement the command
basename:

    basename () {
        set $(echo ${1##*/}) $2
        echo ${1%$2}
    }

Quoting Text

From time  to time, you  will want to  ``turn off'' the  special meaning of
characters.  For  example, you  may wish  to pass a  token that  contains a
literal asterisk to a command; to  do so, you need a way to tell ksh not to
expand the  token into a list  of file names.  Therefore,  ksh includes the
quotation operators  `\', `"', and  `''; these ``turn off''  (or quote) the
special meaning of operators.

The backslash `\' quotes the following character.  For example, the command

    ls name\*

lists a file named name*, and no other.

The shell  ignores a backslash immediately followed by  a newline, called a
concealed newline. This lets you give more arguments to a command than will
fit on one line.  For example, the command

    cc -o output file1.c file2.c file3.c \
        file4.c file5.c file19.c

invokes the C compiler cc to  compile a set of C source files, the names of
which extend  over more than one  line of input.  You will  find this to be
extremely helpful, especially when you write scripts and makefiles, to help
you write neat, easily read commands.

A pair of apostrophes ' ' prevents  interpretation of any  enclosed special
characters.  For example, the command

    find . -name '*.c' -print

finds and prints the name of any C-source file in the current directory and
any  subdirectory.   The   command  find  interprets  the  `*'  internally;
therefore, you  want to  suppress the  shell's expansion of  that operator,
which is accomplished by enclosing that token between apostrophes.

A pair of quotation marks " "  has the  same  effect.  Unlike  apostrophes,
however,  ksh  will   perform  parameter  substitution  and  command-output
substitution   (described  below)  within   quotation  marks.    Note  that
everything between quotation marks will be a single argument, even if there
are spaces between the tokens.  For example, the command

    grep "x y" *.c

calls   the   string-search   command  grep   to   look   for  the   string
x<space>y.

Scripts

Shell commands can be stored in a file, or script. The command

    ksh script [ parameter ... ]

executes the commands in script with  a new subshell ksh. Each parameter is
a value for a positional parameter, as described below.

If you  have used the command  chmod to make script  executable, then it is
executed  under the  Bourne shell  sh, without  requiring the  ksh command.
Because all executable scripts are executed by the Bourne shell by default,
not the Korn  shell, you should avoid constructions that  are unique to the
Korn shell.

To ensure that a script is executed by ksh, begin the script with the line:

    #!/usr/bin/ksh

Parameters  of the  form  `$n' represent  command-line  arguments within  a
script.  n  can range from zero  through nine; $0 always  gives the name of
the script.  These parameters are also called positional parameters.

If  no corresponding  parameter is  given  on the  command line,  the shell
substitutes the null string for that parameter.  For example, if the script
format contains the following line:

    nroff -ms $1 >$1.out

then invoking format with the command line:

    format mytext

invokes the command nroff to format  the contents of mytext, and writes the
output into file mytext.out.  If, however, you invoke this command with the
command line

    format mytext yourtext

the script will format mytext but ignore yourtext altogether.

Reference $*  represents all command-line  arguments.  If, for  example, we
change the contents of script format to read

    nroff -ms $* >$1.out

then the command

    format mytext yourtext

will invoke nroff to format the  contents of mytext and yourtext, and write
the output into file mytext.out.

Commands in  a script can  also be executed  with the .  (dot) command.  It
resembles  the  ksh command,  but  the current  shell  executes the  script
commands without  creating a new subshell or  a new environment; therefore,
you cannot use command-line arguments.

Variables

Shell variables are  names that can be assigned string  values on a command
line, in the form

    name=value

The name  must begin with  a letter, and  can contain letters,  digits, and
underscores `_'.   Note that no white  space can appear around  the `=', or
the assignment will not work.

In shell input, `$name' or  `${name}' represents the value of the variable.
For example:

    TEXT=mytext

    nroff -ms $TEXT >$TEXT.out

Here,  ksh  expands  $TEXT before  it  executes  the  nroff command.   This
technique is very useful in large, complex scripts: by using variables, you
can change  the behavior  of the  script by editing  one line,  rather than
having to edit numerous variables throughout the script.

Note that if an assignment precedes a command on the same command line, the
effect of the assignment is local to that command; otherwise, the effect is
permanent.  For example,

    kp=one testproc

assigns variable  kp the  value one  only for the  execution of  the script
testproc.

ksh sets the following variables by default:

#  The number of actual positional parameters given to the current command.

@  The list of positional parameters ``$1 $2 ...''.

*  The list  of positional parameters ``$1'' ``$2'' ...   (the same as `$@'
   unless some parameters are quoted).

-  Options set in the invocation of the shell or by the set command.

?  The exit status returned by the last command.

!  The process number of the last command invoked with `&'.

$  The process number of the current shell.

Environmental Variables

ksh references the following environmental variables:

ENV  If this  variable is  set at start-up,  after all .profile  files have
     been  executed, the  expanded value  is used  as the  shell's start-up
     file.  It typically defines environmental variables and aliases.

FCEDIT
     This sets the editor used by the command fc.

HOME Initial  working directory;  usually  specified in  the password  file
     /etc/passwd.

IFS  Delimiters for tokens; by default space, tab, and newline.

KSH_VERSION
     The current version of the Korn shell that you are using.

MAIL ksh check the file this names, at intervals specified by environmental
     variable  MAILCHECK. If  the file  specified by  this variable  is new
     since last  checked, the shell  prints ``You have mail.''  on the your
     terminal.  If the file has increased in size since the last check, ksh
     prints ``You have new mail.'' on your terminal.

     Note that by default, ksh does not check MAIL when you log in.  If you
     want it to do so, add the following lines to file /etc/.kshrc:

         # The following lines emulate the mail notification of the Bourne Shell.
         if [ -s $MAIL ]
         then
             echo "You have mail."
         fi

MAILCHECK
     Specifies the number of seconds between checking for new mail.  If not
     specified, MAILCHECK defaults to 600 seconds (ten minutes).

PATH Colon-separated list of directories searched for commands.

PS1  First prompt string, usually `$'.  Note that in this variable and PS2,
     ksh expands the symbol ! into  the current number of the command line.
     For example, the prompt ksh !> prints the prompt ksh NN>    with
     every command, where NN is the number of the current command.  This is
     useful when you have enabled the history feature, as described below.

     To  print a  prompt that  includes your local  site name,  include the
     variable $PWD (described below) in the definition of PS1. For example,

         PS1='$PWD>'

     prints the  current directory as  your prompt, just  like MS-DOS does.
     To   include  your   system's  name,   read   the  contents   of  file
     /etc/uucpname, as follows:

         SITE=`cat /etc/uucpname`
         PS1='$SITE!!$PWD>'

     This  form of  the prompt  is  quite useful  when you  are working  on
     networked machines and may not always be sure just what system you are
     working on.  Note that  two exclamation points are necessary; as noted
     above, ksh expands one `!' into the number of the current command.

     Finally,  to include  the command  number with  site name  and current
     directory, do the following:

         SITE=`cat /etc/uucpname`
         PS1='$SITE!!$PWD !>'

     This will give  you a very long prompt, but  one with much information
     in it.

PS2  Second prompt  string, usually `>'.  ksh prints  it when it expects
     more input, such  as when an open quotation-mark has  been typed but a
     close quotation-mark has not been typed, or within a shell construct.

PWD  The present  working directory, i.e.,  the directory within  which you
     are now working.

SECONDS
     The number of seconds since the current shell was started.

SHELL
     The full path name of the shell that you are now executing.

TERM The name of the type of terminal you are now using, as used by various
     programs for reading the file /etc/termcap.

TIMEZONE
     The  current timezone  you are  located in, as  set in  your .profile.
     This is  an interesting  and powerful variable;  see its entry  in the
     Lexicon for details.

USER The login-identifier of the user, i.e., you.

The following special forms substitute parameters conditionally:

${name-token}
     Substitite name if it is set; if it is not, substitute token.

${name=token}
     Substitute name if  it is set; if it is  not set, substitute token and
     set name to equal token.

${name+token}
     Substitute token if name is set.

${name?token}
     Substitute name if it is set;  if it is not, print token and exit from
     the shell.

To unset an environmental variable, use the command unset.

Command Output Substitution

ksh can use  the output of a command as  shell input (as command arguments,
for example) by enclosing the command in grave characters ` `.          For
example, to  list the contents of  the directories named in  file dirs, use
the command

    ls -l `cat dirs`

Constructs

ksh  lets  you control  the  execution of  programs  through the  following
constructs.  It  recognizes a construct  only if it occurs  unquoted as the
first token of a command.  This  implies that a separator must precede each
reserved word in the following constructs; for example, newline or `;' must
precede do in the for construct.

break [n]
     Exit from for, until, or while. If n is given, exit from n levels.

case token in [ pattern [ | pattern ] ...) sequence;; ] ... esac
     Check token against each pattern, and execute sequence associated with
     the first matching pattern.

continue [n]
     Branch to the end of the nth enclosing for, until, or while construct.

for name [ in token ... ] do sequence done
     Execute sequence  once for each  token. On each  iteration, name takes
     the  value of  the next  token.  If the  in clause  is omitted,  $@ is
     assumed.  For example, to list all files ending with .c:

         for i in *.c
         do
             cat $i
         done

if seq1 then seq2 [ elif seq3 then seq4 ] ... [ else seq5 ] fi
     Execute  seq1. If  the  exit status  is  zero, execute  seq2; if  not,
     execute the  optional seq3 if  given.  If the  exit status of  seq3 is
     zero, then execute seq4, and so  on.  If the exit status of all tested
     sequences is nonzero, execute seq5.

time sequence
     Time  how  long  it takes  sequence  to  execute.   When sequence  has
     finished executing, the time is displayed on the standard output.

while sequence1 [ do sequence2 ] done
     Execute sequence2 as long as  the execution of sequence1 results in an
     exit status of zero.

(sequence)
     Execute sequence  within a subshell.   This allows sequence  to change
     the  current directory,  for  example, and  not  affect the  enclosing
     environment.

{sequence}
     Braces simply enclose a sequence.

Built-in Commands

ksh executes  most commands via the  fork system call, which  creates a new
process.  See the Lexicon articles on  fork() and exec for details on these
calls.  ksh also has the following commands built into itself.

. script
     Read and  execute commands from script.  Positional parameters are not
     allowed.   ksh searches  the  directories named  in the  environmental
     variable PATH to find the given script.

: [token ...]
     A colon `:' indicates a ``partial comment''.  ksh normally ignores all
     commands on  a line that  begins with a colon,  except for redirection
     and such symbols as $, {, ?, etc.

#    A complete comment: if # is the first character on a line, ksh ignores
     all text that follows on that line.

alias [name=value ...]
     When  called without  arguments, alias  prints  all aliases  and their
     values.   When called  with a  name but no  associated value,  then it
     prints  the  value  of  name.   When  called with  a  name  and  value
     combination, it associated value with name.

     For example, the command

         alias logout='exit'

     binds the  token logout to  the command exit:  hereafter, whenever you
     type logout, it will be as if you typed the exit command.

     Note that when you define an alias, you should be careful not to write
     one that is self-referring, or ksh  will go into an infinite loop when
     it tries to expand the alias.  For example, the definition:

         # DO NOT DO THIS!
         alias ls='ls -CF'

     will send ksh into an infinite loop, as it tries infinitely to replace
     ls with ls. Rather, use the definition:

         # THIS IS CORRECT
         alias ls='/bin/ls -CF'

     or

         # THIS TOO IS CORRECT
         alias ls='  ls -CF'

     In  the  latter  example, note  the  spaces  between  the first  grave
     character and the ls.

     ksh has a number of aliases  set by default.  See the section Aliases,
     below, for details.

bind [-m] [key_sequence=binding_name ...]
     When called  without arguments, list  the current set  of key bindings
     for  MicroEMACS-style  editing of  command  lines.   When called  with
     arguments, bind the key_sequence to binding_name.

     For example, the command

         bind '^[^H'=delete-word-backward

     binds  the editing  command delete-word-backward  to the  key sequence
     <esc><backspace>.  Note that  the carat characters in this
     command  are  literally  that, not  the  shell's  representation of  a
     literal <esc> or <backspace> character.

     When called with  the -m option, bind more than  one binding_name to a
     given key_sequence.   This lets you build  keyboard macros, to perform
     complex editing tasks with one or two keystrokes.

     For details, see the sections below on command-line editing.

builtin command
     Execute command as a built-in command.

cd dir
     Change the  working directory to dir. If no  argument is given, change
     to the home directory as  set by the environmental variable HOME. When
     invoked, it also changes the environmental variables PWD and OLDPWD.

     Using  a hyphen  `-'  as the  argument  causes ksh  to  change to  the
     previous directory, i.e.,  the one indicated by shell variable OLDPWD.
     In effect, this  swaps OLDPWD and PWD, thus allowing  you to flop back
     and forth easily between two directories.

echo token ...
     Echo token  onto the standard  output.  ksh replaces  the command echo
     with the alias echo='print'.

eval [token ...]
     Evaluate each token and treat the result as shell input.

exec [command]
     Execute command directly rather than as a subprocess.  This terminates
     the current shell.

exit [status]
     Set the  exit status to  status, if given,  then terminate; otherwise,
     the previous status is used.

export [name ...]
     ksh executes  each command in  an environment, which  is essentially a
     set  of shell  variable  names and  corresponding  string values.   It
     inherits an environment when  invoked, and normally it passes the same
     environment  to each  command it invokes.   export specifies  that the
     shell  should  pass the  modified  value  of each  given  name to  the
     environment of subsequent commands.  When no name is given, ksh prints
     the name of each variable marked for export.

export VARIABLE=value
     This form  of the export  command sets VARIABLE to  value, and exports
     it.  Thus, the command

         export FOO=bar

     is equivalent to the commands:

         FOO=bar
         export FOO

fc [-l] [-n] [first [last]]
     Draw  the previously  executed commands  first  through last  back for
     manipulation and possible execution.  first and last can be referenced
     either by their history numbers, or by a string with which the command
     in question begins.  Normally,  the commands are pulled into an editor
     for manipulation  before they are  executed; the editor  is defined by
     the  environmental variable  FCEDIT  (default, ed).   The commands  in
     question are executed as soon as  you exit from the editor.  Option -l
     lists the command(s) on stdout, and so suppresses the editing feature.
     Option -n inhibits the default history numbers.

function funcname { script }
     Define function  funcname for the  shell to execute.   For example the
     following defines function get_name for the shell:

         function get_name {
             echo -n Please enter your name ...
             read name
             return 0
         }

     When  ksh encounters  get_name,  it runs  the above-defined  function,
     rather than trying to find get_name on the disk.  Note that the return
     status can  be any valid  status and can  be checked in  the code that
     called get_name by reading the shell variable $? (described above), or
     by using the function as the argument to an if statement.  This allows
     you to build constructs like the following:

         if get_name; then
             do_something
         else
             do_something_else
         fi

     To list  all defined functions,  type the alias  functions. To receive
     detailed information on a  defined function, use the command type name
     where name is the name of the function in which you are interested.

getopts optstring name [arg ...]
     Parse  the args  to command.  See  the Lexicon  entry for  getopts for
     details.

hash [-r] [name ...]
     When called without arguments, hash lists the path names of all hashed
     commands.   When called  with  name hash  check  to see  if  it is  an
     executable command, and if so adds it to the shell's hash list.  The -
     r option removes name from the hash list.

kill [-l] [signal] process ...
     Send signal  to process. The default signal  is TERM, which terminates
     the process.  signal may either be  a number or a mnemonic as #defined
     in header  file <signal.h>. When  called with the  -l option, it
     lists all known types of signals.   See the Lexicon entry for kill for
     details.

let [expression]
     Evaluate  each expression.  This  command returns  zero if  expression
     evaluates  to  non-zero  (i.e., fails),  and  returns  non-zero if  it
     evalutes  to zero  (i.e., succeeds).   This  is useful  for evaluating
     expressions before actually executing them.

print [-nreun] [argument ...]
     Print each  argument on the  standard output, separated  by spaces and
     terminated  with a  newline.   Option -n  suppresses  printing of  the
     newline.  Option -un redirects output from the standard output to file
     descriptor n.

     Note that  each argument can  contain the following  standard C escape
     characters: \b, \f, \n, \r, \v, and \###. See the Lexicon article on C
     Language for details each character's meaning.  The option -r inhibits
     this feature, and the -e option re-enables it.

read name ...
     Read a line from the standard input and assign each token of the input
     to the corresponding shell  variable name. If the input contains fewer
     tokens than the name list,  assign the null string to extra variables.
     If the input contains more  tokens, assign the last name the remainder
     of the input.

readonly [name ...]
     Mark  each shell  variable name as  a read-only  variable.  Subsequent
     assignments  to read-only  variables will not  be permitted.   With no
     arguments, print the name and value of each read-only variable.

return [status]
     Return status to the parent process.

set [-aefhkmnuvx [-o keyword] [name ...] ]
     Set listed flag.  The -o option sets keyword, where keyword is a shell
     option.

     When used  with one or  more names, this command  sets shell variables
     name to values of positional parameters beginning with $1.

     For example, the command

         set -h -o emacs ignoreeof

     performs the  following: turns on  hashing for all  commands, turns on
     MicroEMACS-style command-line editing,  and turns off exiting upon EOF
     (that is,  you must type exit  to exit from the  shell).  set commands
     are especially  useful when embedded in your  .profile, where they can
     customize ksh to your preferences.

     For details of this command, see its Lexicon entry.

shift
     Rename positional parameter 1 to current value of $2, and so on.

test [option] [expression]
     Check expression  for condition  option. This is  a useful and complex
     command, with  more options than can be listed  here.  See its Lexicon
     entry for details.

times
     Print on the standard output a  summary of processing time used by the
     current shell and all of its child processes.

trap [command] [n ...]
     Execute command if ksh receives signal n. If command is omitted, reset
     traps to  original values.   To ignore a  signal, pass null  string as
     command. With  n zero, execute command when the  shell exits.  With no
     arguments, print the current trap settings.

typeset [-firx] [+firx] [name [=value] ... ]
     When called without an  argument, this command lists all variables and
     their attributes.

     When called with an option but  without a name, it lists all variables
     that have  the specified attribute; - tells typeset  to list the value
     of each variable and + tells it not to.

     When  called with  one or  more  names, it  gives name  to the  listed
     attribute.  If  name is associated with a  value, typeset also assigns
     the value to it.

     typeset recognizes the following attributes:

         -i  Store variable's value as an integer
         -f  List function instead of variable
         -r  Make the variable read-only
         -x  Export variable to the environment

umask [nnn]
     Set user file creation mask to nnn. If no argument is given, print the
     current file creation mask.

unalias name ...
     Remove the alias for each name.

wait [pid]
     Hold execution  of further commands until  process pid terminates.  If
     pid  is omitted,  wait for  all child processes.   If no  children are
     active, this command finishes immediately.

whence [-v] name ...
     List  the type  of command  for  each name.  When called  with the  -v
     option, also list functions and aliases.

Aliases

ksh implements  as aliases a number  of commands that sh  calls as separate
executable programs.   The echo alias,  for instance, does  everything that
/bin/echo does, but ksh does not have to fork() and exec() simply to echo a
token.  Other  aliases, like  pwd, work by  printing the contents  of shell
variables.  The command /bin/pwd still  works should you prefer it, but you
must request it  by its full path name should  you not wish to use the much
faster alias version.

ksh sets  the following aliases by  default.  If you wish,  you can use the
built-in command unalias to make one or all of them go away.

    echo=print
    false=let
    functions=typeset -f
    history=fc -l
    integer=typeset -i
    login=exec login
    newgrp=exec newgrp
    pwd=print -r $PWD
    true=:
    type=whence -v

The alias history is especially useful  when you are using the Korn shell's
history  feature.  When  invoked with  no argument, it  prints the  last 13
commands you  typed.  When invoked with one numeric  argument, it lists the
command that corresponds to that argument; for example

    history 106

prints the  106th command  you entered  (assuming that you've  entered that
many).   When used  with  two numeric  arguments,  it prints  the range  of
commands between the two arguments; for example

    history 10 99

prints the tenth through the 99th commands you entered.

Job Control

ksh lets  you manipulate  and monitor background  jobs via its  job control
commands.

The following commands manipulate background jobs:

jobs Display information about  all controlled jobs.  Information is in the
     following format:

         %num [+-] pid status command

     where num  indicates the job number,   `+'  indicates the current job,
     `-' indicates  the previous job, pid is  the job's process identifier,
     status shows the status of  the job (e.g., Running, Done, Killed), and
     command is  the command  description.  Note  that ksh only  checks for
     changes in job status when waiting for a command to complete.

kill [-signal] pid ...
     Described above.

wait [pid]
     Hold execution of  further commands until process pid terminates.  See
     its Lexicon entry for details.

The following `%' syntax can be used with the above commands:

%+   Select the current job.

%-   Select the previous job.

%num Select the job with job number num.

%string
     Select the most recently invoked job whose command begins with string.

%?string
     Select the most recently invoked job whose command contains string.

vi-Style Command-line Editing

ksh, has  built into it  an editing feature  that lets you  recall and edit
commands using vi-style  editing commands.  When you have finished editing,
simply typing <return> dispatches the command for re-execution.

To turn on vi-style editing, use the command

    set -o vi

The following table gives each input-mode command:

\       Escape the next erase or kill character.

<ctrl-D>
        This character (EOF) terminates  ksh if the current  line is empty.
        Note that the command

            alias logout='exit'

        neutralizes this effect of EOF.

<ctrl-H>
        Delete previous character -- that is, the character to the left.

<ctrl-V>
        Quote the next  character.  You can  use this to  embed editing and
        kill characters within a command.

<ctrl-W>
        Delete  the  previous  word.   A ``word''  is  any  clump  of  text
        delineated by white space.

<ctrl-J>
<ctrl-M>
<return>
        Execute this line.

The following table gives each editing-mode command:

[count] k
[count] -
        Get previous command from the history buffer.

[count] j
[count] +
        Get next command from the history buffer.

[count] G
        Get command count  from the history  buffer.  Default is  the least
        recently entered command.

/string
        Search the  history buffer  for the  most recently  entered command
        that contains string. If  string is NULL, use  the previous string.
        string. must be terminated by <ctrl-M> or <ctrl-J>.

?string
        Same as  /,  except  that  ksh  seeks  the least  recently  entered
        command.

n       Repeat the previous search.

N       Repeat the last search, but in the opposite direction.

[count] l
        Move right count characters (default, one).

[count] w
        Move forward count alphanumeric words (default, one).

[count] W
        Move forward count blank-separated words (default, one).

[count] e
        Move forward to the end of the count'th word.

[count] E
        Move forward to the end of the count'th blank-separated word.

[count] h
        Move left count characters (default, one).

[count] b
        Move back count words.

[count] B
        Move back count blank-separated words.

0       Move cursor to start of line.

^       Move cursor to start of line.

$       Move cursor to end of line.

[count] f c
        Move rightward to the count'th occurrence of character c.

[count] B c
        Move leftward to the count'th occurrence of character c.

[count] t c
        Move rightward  almost to  the count'th  occurrence of  character c
        (default, one).  Same as fc followed by h.

[count] T c
        Move leftward  almost  to the  count'th occurrence  of character  c
        (default, one).  Same as Fc followed by l.

;       Repeats the last f, F, t, or T command.

,       Reverse of ;.

a       Enter input mode and enter text after the current character.

A       Append text to the end of the line; same as $a.

[count]cc
c[count]c
        Delete current character through character c and then execute input
        line.

s       Same as cc.

[count]dmotion
d[count]c
        Delete current character through the character c.

D       Delete current character through the end of line.  Same as d$.

i       Enter input mode and insert text before the current character.

I       Enter input mode and insert text before the first word on the line.

[count]P
        Place the previous text modification before the cursor.

[count]p
        Place the previous text modification after the cursor.

R       Enter input mode and overwrite characters on the line.

rc      Replace the current character with character c.

[count]x
        Delete the current character.

[count]X
        Delete the preceding character.

[count].
        Repeat the previous text modification command

~       Invert the case of the current character and advance the cursor.

[count]_
        Append the count'th word from the  previous command and enter input
        mode (default, last word).

*       Attempt file-name  generate on  the current  word.   If a  match is
        found, replace  the current  word with  the  match and  enter input
        mode.

u       Undo the last text-modification command.

U       Restore the current line to its original state.

[count]v
        Execute command

            fc -e ${VISUAL:-${EDITOR:-vi}}

<ctrl-L>
        Line feed and print the current line.

<ctrl-J>
<ctrl-M>
<return>
        Execute the current line.

#       Same as I#<return>.

Command Completion

ksh  supports command  completion.  This feature  permits you  to invoke  a
command by typing only a fraction of it; ksh fleshes out the command, based
on what commands you have already entered.

To invoke command completion, set the following in .profile or .kshrc:

    set -h -o emacs

or:

    set -h -o vi

This turns on hashing and  tracking.  It also turn on command-line editing:
the former  command turns on  MicroEMACS-style editing, whereas  the latter
turn on vi-style editing.

As an example, say that you type the following commands:

    compress foo.tar
    ps alx
    df -t

With MicroEMACS-style  editing, if you  type <ctrl-X>?, you  then see
the commands you typed in alphabetical order:

    compress     df     ps

If you want to re-invoke the compress command without having to type all of
it,  you can  use either  type <ctrl-R>  followed by  `c' to  use the
shell's  reverse-search  capabilities;  or you  can  type  `c' followed  by
<esc><esc>  to  have  the shell's  command-completion  facility
complete the command.

If you use the reverse-incremental  search, you get the entire command line
as you  had typed it.   Additional uses of <ctrl-R>  while already in
search  mode  tell ksh  to  search  further back  in  its  history list  of
commands.

If, however, you use the command completion, you get only the command.  So,
to  continue  the  example,  if   you  type  the  letter  `c'  followed  by
<esc><esc>  ksh  displays  the  word  compress, followed  by  a
<space>, and awaits more input.

In  general, the  reverse-search is  better  if you  wish to  re-execute an
entire  command; but  command completion  is  better if  you want  just the
command name.

Under vi-style editing, you can also use command completion.  To complete a
command, type `*'  while in edit mode; or type  <esc>* while in input
mode.

File-Name Completion

ksh also  lets you ``complete''  file names and directory  names, just like
you  complete  command names.   With  MicroEMACS-style  editing, the  file-
completion  command is <esc><esc>;  with vi-style  editing, the
file-completion command  is `*'  (in edit  mode) or <esc>*  (in input
mode).

If you  are entering a file  name and have specified enough  of the name in
order  to  specify  a  unique  file,  typing  the  file-completion  command
completes the file  name or directory name.  If you  have not typed enough,
ksh remains silent;  type more characters of the file  name, then again try
the file-completion  command.  If you enter a bogus  file name or directory
name, ksh beeps  to indicate that it cannot complete  the given name.  When
ksh  completes  a  file name,  it  then  prints  a  space character.   This
indicates that the string names a file (rather than a directory); the space
character lets  you begin immediately to type the  next argument.  When ksh
completes a  directory name, it  appends a slash  (`/') instead of  a space
character, and waits for you to type the next part of the path name.

For example, if you type

    ls -l /usr/spool/uucp

followed  by   <esc><esc>,  nothing  happens   because  of  the
ambiguity     between      directory     names     /usr/spool/uucp/     and
/usr/spool/uucppublic/.

If you then type the letter `p', the command now appears:

    ls -l /usr/spool/uucpp

Typing <esc><esc> now expands it out to

    ls -l /usr/spool/uucppublic/

which is the name you desire.  Note that ksh appends the trailing slash and
waits for more.

A file-name completion example is:

    more /usr/lib/uucp/P

followed by <esc><esc>; this yields:

    more /usr/lib/uucp/Permissions

which saves you eight keystrokes.

.profile and .kshrc

When a  user of the Korn  shell logs into COHERENT,  ksh first executes the
script /etc/profile. This sets up default environmental variables for every
user  on  the  system, such  as  the  default  PATH  and the  default  TERM
variables.

Next, ksh  executes the script .profile in the  user's home directory.  You
can customize this file to suit your preferences.  For example, you can set
up  a customized  PATH, define  aliases,  and have  the shell  execute some
programs automatically (such as calendar or fortune).

Finally, ksh  executes the script  named in the  environmental variable ENV
whenever you invoke a shell.  By custom, this script is named .kshrc and is
kept in your home directory, but  you name it anything you wish.  This file
should define how you want the  shell itself to function.  In this way, you
can ensure that  your settings will be available to  all subshells, as well
as to your login shell.  If you wish to hide these settings from subshells,
just conclude your .kshrc with the command:

    unset ENV

For  more information,  see  the Lexicon  articles  profile, .profile,  and
.kshrc.

Example

The following  C code creates  a program called  splurt.c.  It demonstrates
numbered redirection  of ksh,  by writing  to five streams  without opening
them.  Compile it with the command:

    cc -o splurt splurt.c

To call it from the command line, you could type a command of the form:

    splurt  3> splurt3 4> splurt4 5> splurt5 6> splurt6 7> splurt7

This will redirect the splurt's output into files splurt3 through splurt7.

#include <stdio.h>
main()
{
    int i;
    char buf[50];

    for(i = 3; i < 8; i++) {
        sprintf(buf, "For fd %d\n", i);
        write(i, buf, strlen(buf));
    }
}

Files

/etc/profile -- System-wide initial commands
$HOME/.kshrc -- Set up user-specific environment
$HOME/.profile -- User-specific initial commands
/dev/null -- For background input

See Also

bind,
commands,
dup(),
environ,
exec,
fork(),
getopts,
jobs,
kill,
.kshrc,
login,
newgrp,
profile,
set,
sh,
signal(),
test,
Using COHERENT,
vsh,
wait

For a list of commands associated  with ksh, see the Shell Commands section
of the Commands Lexicon article.

Introduction to sh, the Bourne Shell, tutorial

Notes

Note that the queue of previously  issued commands is stored in memory, not
on disk.

This version of ksh does not support variable arrays.

The Mark Williams  version of ksh is based on  the public-domain version of
the Korn shell, which in turn  is based on the public-domain version of the
seventh edition  Bourne shell  written by  Charles Forsyth and  modified by
Eric Gisin, Ron Natalie, Arnold Robbins, Doug Gwyn, and Erik Baalbergen.