|
Hopefully, this page is exactly what you are looking for, but if not, you can always find further assistance on Unix/Linux Forum!
User Commands ksh(1)
NAME
ksh, rksh - KornShell, a standard/restricted command and
programming language
SYNOPSIS
/usr/bin/ksh [ _ abCefhikmnoprstuvx] [ _ o option] ...
[arg...]
/usr/bin/ksh -c [ _ abCefhikmnoprstuvx] [ _ o option] ...
command_string [command_name [ arg...]]
/usr/xpg4/bin/sh [ _ abCefhikmnoprstuvx] [ _ o option] ...
[arg...]
/usr/xpg4/bin/sh -c [ _ abCefhikmnoprstuvx] [ _ o option]
... command_string [command_name [ arg...]]
/usr/bin/rksh [ _ abCefhikmnoprstuvx] [ _ o option] ...
[arg...]
/usr/bin/rksh -c [ _ abCefhikmnoprstuvx] [ _ o option] ...
command_string [command_name [ arg...]]
DESCRIPTION
The /usr/xpg4/bin/sh utility is a standards compliant shell.
This utility provides all the functionality of /usr/bin/ksh,
except in cases where differences in behavior exist. See
Arithmetic Expansions section for details.
/usr/bin/ksh is a command and programming language that exe-
cutes commands read from a terminal or a file. rksh is a
restricted version of the command interpreter ksh; it is
used to set up login names and execution environments whose
capabilities are more controlled than those of the standard
shell. See the Invocation section for the meaning of argu-
ments to the shell.
Definitions
A metacharacter is one of the following characters:
; & ( ) | < > NEWLINE SPACE TAB
A blank is a TAB or a SPACE. An identifier is a sequence of
letters, digits, or underscores starting with a letter or
underscore. Identifiers are used as names for functions and
variables. A word is a sequence of characters separated by
one or more non-quoted metacharacters.
A command is a sequence of characters in the syntax of the
shell language. The shell reads each command and carries out
the desired action either directly or by invoking separate
utilities. A special-command is a command that is carried
SunOS 5.10 Last change: 29 Jun 2005 1
User Commands ksh(1)
out by the shell without creating a separate process. Except
for documented side effects, most special commands can be
implemented as separate utilities.
Commands
A simple-command is a sequence of blank-separated words
which can be preceded by a variable assignment list. See
Environment. The first word specifies the name of the com-
mand to be executed. Except as specified, the remaining
words are passed as arguments to the invoked command. The
command name is passed as argument 0 (see exec(2)). The
value of a simple-command is its exit status if it ter-
minates normally. If it terminates abnormally due to receipt
of a signal, the value is the signal number plus 128. See
signal.h(3HEAD) for a list of signal values. Obviously, nor-
mal exit status values 129 to 255 cannot be distinguished
from abnormal exit caused by receiving signal numbers 1 to
127.
A pipeline is a sequence of one or more commands separated
by |. The standard output of each command but the last is
connected by a pipe(2) to the standard input of the next
command. Each command is run as a separate process; the
shell waits for the last command to terminate. The exit
status of a pipeline is the exit status of the last command.
A list is a sequence of one or more pipelines separated by
;, &, &&, or ||, and optionally terminated by ;, &, or |&.
Of these five symbols, ;, &, and |& have equal precedence,
which is lower than that of && and ||. The symbols && and ||
also have equal precedence. A semicolon (;) causes sequen-
tial execution of the preceding pipeline; an ampersand (&)
causes asynchronous execution of the preceding pipeline
(that is, the shell does not wait for that pipeline to fin-
ish). The symbol |& causes asynchronous execution of the
preceding command or pipeline with a two-way pipe esta-
blished to the parent shell.
The standard input and output of the spawned command can be
written to and read from by the parent shell using the -p
option of the special commands read and print described in
Special Commands. The symbol && (||) causes the list follow-
ing it to be executed only if the preceding pipeline returns
0 (or a non-zero) value. An arbitrary number of new-lines
can appear in a list, instead of a semicolon, to delimit a
command.
A command is either a simple-command or one of the follow-
ing. Unless otherwise stated, the value returned by a com-
mand is that of the last simple-command executed in the com-
mand.
SunOS 5.10 Last change: 29 Jun 2005 2
User Commands ksh(1)
for identifier [ in word ... ] ; do list ; done
Each time a for command is executed, identifier is set
to the next word taken from the in word list. If in word
... is omitted, then the for command executes the do
list once for each positional parameter that is set. See
Parameter Substitution. Execution ends when there are no
more words in the list.
select identifier [ in word ... ] ; do list ; done
A select command prints to standard error (file descrip-
tor 2), the set of words, each preceded by a number. If
in word ... is omitted, then the positional parameters
are used instead. See Parameter Substitution. The PS3
prompt is printed and a line is read from the standard
input. If this line consists of the number of one of the
listed words, then the value of the variable identifier
is set to the word corresponding to this number. If this
line is empty the selection list is printed again. Oth-
erwise the value of the variable identifier is set to
NULL. (See Blank Interpretation about NULL). The con-
tents of the line read from standard input is saved in
the shell variable REPLY. The list is executed for each
selection until a break or EOF is encountered. If the
REPLY variable is set to NULL by the execution of list,
then the selection list is printed before displaying the
PS3 prompt for the next selection.
case word in [ pattern [ | pattern ] ) list ;; ] ... esac
A case command executes the list associated with the
first pattern that matches word. The form of the pat-
terns is the same as that used for file-name generation.
See File Name Generation.
if list ; then list ; [ elif list ; then list ; ... ] [ else
list ; ] fi
The list following if is executed and, if it returns an
exit status of 0, the list following the first then is
executed. Otherwise, the list following elif is executed
and, if its value is 0, the list following the next then
is executed. Failing that, the else list is executed. If
no else list or then list is executed, then the if com-
mand returns 0 exit status.
SunOS 5.10 Last change: 29 Jun 2005 3
User Commands ksh(1)
while list ; do list ; done
until list ; do list ; done
A while command repeatedly executes the while list and,
if the exit status of the last command in the list is 0,
executes the do list; otherwise the loop terminates. If
no commands in the do list are executed, then the while
command returns 0 exit status. until can be used in
place of while to negate the loop termination test.
(list)
Execute list in a separate environment. If two adjacent
open parentheses are needed for nesting, a space must be
inserted to avoid arithmetic evaluation.
{list}
list is simply executed. Unlike the metacharacters ( and
), { and } are reserved words and must occur at the
beginning of a line or after a ; in order to be recog-
nized.
[[expression]]
Evaluates expression and returns 0 exit status when
expression is true. See Conditional Expressions for a
description of expression.
function identifier { list ;}
identifier( ) { list ;}
Define a function which is referenced by identifier. The
body of the function is the list of commands between {
and }. See Functions.
time pipeline
The pipeline is executed and the elapsed time as well as
the user and system time are printed to standard error.
SunOS 5.10 Last change: 29 Jun 2005 4
User Commands ksh(1)
The following reserved words are only recognized as the
first word of a command and when not quoted:
! if then else elif fi case
esac for while until do done { }
function select time [[ ]]
Comments
A word beginning with # causes that word and all the follow-
ing characters up to a new-line to be ignored.
Aliasing
The first word of each command is replaced by the text of an
alias if an alias for this word has been defined. An alias
name consists of any number of characters excluding meta-
characters, quoting characters, file expansion characters,
parameter and command substitution characters, and =. The
replacement string can contain any valid shell script
including the metacharacters listed above. The first word of
each command in the replaced text, other than any that are
in the process of being replaced, is tested for aliases. If
the last character of the alias value is a blank then the
word following the alias is also be checked for alias sub-
stitution. Aliases can be used to redefine special builtin
commands but cannot be used to redefine the reserved words
listed above. Aliases can be created, listed, and exported
with the alias command and can be removed with the unalias
command. Exported aliases remain in effect for scripts
invoked by name, but must be reinitialized for separate
invocations of the shell. See Invocation. To prevent infin-
ite loops in recursive aliasing, if the shell is not
currently processing an alias of the same name, the word is
replaced by the value of the alias; otherwise, it is not be
replaced.
Aliasing is performed when scripts are read, not while they
are executed. Therefore, for an alias to take effect, the
alias definition command has to be executed before the com-
mand which references the alias is read.
Aliases are frequently used as a short hand for full path
names. An option to the aliasing facility allows the value
of the alias to be automatically set to the full pathname of
the corresponding command. These aliases are called tracked
aliases. The value of a tracked alias is defined the first
time the corresponding command is looked up and becomes
undefined each time the PATH variable is reset. These
aliases remain tracked so that the next subsequent reference
redefines the value. Several tracked aliases are compiled
into the shell. The -h option of the set command makes each
referenced command name into a tracked alias.
SunOS 5.10 Last change: 29 Jun 2005 5
User Commands ksh(1)
The following exported aliases are compiled into (and
built-in to) the shell but can be unset or redefined:
autoload='typeset -fu'
functions='typeset -f'
history='fc -l'
integer='typeset -i'
nohup='nohup '
r='fc -e -'
An example concerning trailing blank characters and reserved
words follows. If the user types:
$ alias foo="/bin/ls "
$ alias while="/"
the effect of executing:
$ while true
> do
> echo "Hello, World"
> done
is a never-ending sequence of Hello, World strings to the
screen. However, if the user types:
$ foo while
the result is an ls listing of /. Since the alias substitu-
tion for foo ends in a space character, the next word is
checked for alias substitution. The next word, while, has
also been aliased, so it is substituted as well. Since it
is not in the proper position as a command word, it is not
recognized as a reserved word.
If the user types:
$ foo; while
while retains its normal reserved-word properties.
Tilde Substitution
After alias substitution is performed, each word is checked
to see if it begins with an unquoted ~. If it does, then the
word up to a / is checked to see if it matches a user name.
If a match is found, the ~ and the matched login name are
replaced by the login directory of the matched user. This is
called a tilde substitution. If no match is found, the ori-
ginal text is left unchanged. A ~ by itself, or in front of
a /, is replaced by $HOME. A ~ followed by a + or - is
replaced by $PWD and $OLDPWD, respectively.
SunOS 5.10 Last change: 29 Jun 2005 6
User Commands ksh(1)
In addition, tilde substitution is attempted when the value
of a variable assignment begins with a ~.
Tilde Expansion
A tilde-prefix consists of an unquoted tilde character at
the beginning of a word, followed by all of the characters
preceding the first unquoted slash in the word, or all the
characters in the word if there is no slash. In an assign-
ment, multiple tilde-prefixes can be used: at the beginning
of the word (that is, following the equal sign of the
assignment), following any unquoted colon or both. A tilde-
prefix in an assignment is terminated by the first unquoted
colon or slash. If none of the characters in the tilde-
prefix are quoted, the characters in the tilde-prefix fol-
lowing the tilde are treated as a possible login name from
the user database.
A portable login name cannot contain characters outside the
set given in the description of the LOGNAME environment
variable. If the login name is null (that is, the tilde-
prefix contains only the tilde), the tilde-prefix is
replaced by the value of the variable HOME. If HOME is
unset, the results are unspecified. Otherwise, the tilde-
prefix is replaced by a pathname of the home directory asso-
ciated with the login name obtained using the getpwnam func-
tion. If the system does not recognize the login name, the
results are undefined.
Tilde expansion generally occurs only at the beginning of
words, but an exception based on historical practice has
been included:
PATH=/posix/bin:~dgk/bin
is eligible for tilde expansion because tilde follows a
colon and none of the relevant characters is quoted. Con-
sideration was given to prohibiting this behavior because
any of the following are reasonable substitutes:
PATH=$(printf %s ~karels/bin : ~bostic/bin)
for Dir in ~maart/bin ~srb/bin .
do
PATH=${PATH:+$PATH:}$Dir
done
With the first command, explicit colons are used for each
directory. In all cases, the shell performs tilde expansion
on each directory because all are separate words to the
shell.
SunOS 5.10 Last change: 29 Jun 2005 7
User Commands ksh(1)
Expressions in operands such as:
make -k mumble LIBDIR=~chet/lib
do not qualify as shell variable assignments and tilde
expansion is not performed (unless the command does so
itself, which make does not).
The special sequence $~ has been designated for future
implementations to evaluate as a means of forcing tilde
expansion in any word.
Because of the requirement that the word not be quoted, the
following are not equivalent; only the last causes tilde
expansion:
\~hlj/ ~h\lj/ ~"hlj"/ ~hlj\/ ~hlj/
The results of giving tilde with an unknown login name are
undefined because the KornShell ~+ and ~- constructs make
use of this condition, but, in general it is an error to
give an incorrect login name with tilde. The results of hav-
ing HOME unset are unspecified because some historical
shells treat this as an error.
Command Substitution
The standard output from a command enclosed in parenthesis
preceded by a dollar sign (that is, $(command)) or a pair of
grave accents (``) can be used as part or all of a word.
Trailing new-lines are removed. In the second (archaic)
form, the string between the quotes is processed for special
quoting characters before the command is executed. See Quot-
ing. The command substitution $(cat file) can be replaced by
the equivalent but faster $(<file). Command substitution of
most special commands that do not perform input/output
redirection are carried out without creating a separate pro-
cess.
Command substitution allows the output of a command to be
substituted in place of the command name itself. Command
substitution occurs when the command is enclosed as follows:
$(command)
or (backquoted version):
`command`
The shell expands the command substitution by executing com-
mand in a subshell environment and replacing the command
substitution (the text of command plus the enclosing $() or
SunOS 5.10 Last change: 29 Jun 2005 8
User Commands ksh(1)
backquotes) with the standard output of the command, remov-
ing sequences of one or more newline characters at the end
of the substitution. Embedded newline characters before the
end of the output is not be removed; however, they can be
treated as field delimiters and eliminated during field
splitting, depending on the value of IFS and quoting that is
in effect.
Within the backquoted style of command substitution,
backslash shall retain its literal meaning, except when fol-
lowed by:
$ ` \
(dollar-sign, backquote, backslash). The search for the
matching backquote is satisfied by the first backquote found
without a preceding backslash. During this search, if a
non-escaped backquote is encountered within a shell comment,
a here-document, an embedded command substitution of the
$(command) form, or a quoted string, undefined results
occur. A single- or double-quoted string that begins, but
does not end, within the `...` sequence produces undefined
results.
With the $(command) form, all characters following the open
parenthesis to the matching closing parenthesis constitute
the command. Any valid shell script can be used for command,
except:
o A script consisting solely of redirections produces
unspecified results.
o See the restriction on single subshells.
The results of command substitution are not field splitting
and pathname expansion processed for further tilde expan-
sion, parameter expansion, command substitution or arith-
metic expansion. If a command substitution occurs inside
double-quotes, it is not be performed on the results of the
substitution.
Command substitution can be nested. To specify nesting
within the backquoted version, the application must precede
the inner backquotes with backslashes; for example:
`\`command\``
The $() form of command substitution solves a problem of
inconsistent behavior when using backquotes. For example:
SunOS 5.10 Last change: 29 Jun 2005 9
User Commands ksh(1)
____________________________________________________________
| Command Output |
| echo '\$x' \$x |
| echo `echo '\$x'` $x |
| echo $(echo '\$x') \$x |
|___________________________________________________________|
Additionally, the backquoted syntax has historical restric-
tions on the contents of the embedded command. While the new
$() form can process any kind of valid embedded script, the
backquoted form cannot handle some valid scripts that
include backquotes. For example, these otherwise valid
embedded scripts do not work in the left column, but do work
on the right:
____________________________________________________________
| echo ` echo $( |
| cat <<eeof cat <<eeof |
| a here-doc with ` a here-doc with ) |
| eof eof |
| ` ) |
| echo ` echo $( |
| echo abc # a comment with ` echo abc # a comment with ) |
| ` ) |
| echo ` echo $( |
| echo '`' echo ')' |
| ` ) |
|___________________________________________________________|
Because of these inconsistent behaviors, the backquoted
variety of command substitution is not recommended for new
applications that nest command substitutions or attempt to
embed complex scripts.
If the command substitution consists of a single subshell,
such as:
$( (command) )
a portable application must separate the $( and ( into two
tokens (that is, separate them with white space). This is
required to avoid any ambiguities with arithmetic expansion.
Arithmetic Expansion
An arithmetic expression enclosed in double parentheses pre-
ceded by a dollar sign ( $((arithmetic-expression)) ) is
replaced by the value of the arithmetic expression within
the double parenthesis. Arithmetic expansion provides a
mechanism for evaluating an arithmetic expression and sub-
stituting its value. The format for arithmetic expansion is
SunOS 5.10 Last change: 29 Jun 2005 10
User Commands ksh(1)
as follows:
$((expression))
The expression is treated as if it were in double-quotes,
except that a double-quote inside the expression is not
treated specially. The shell expands all tokens in the
expression for parameter expansion, command substitution and
quote removal.
Next, the shell treats this as an arithmetic expression and
substitute the value of the expression. The arithmetic
expression is processed according to the rules of the ISO C
with the following exceptions:
o Only integer arithmetic is required.
o The sizeof() operator and the prefix and postfix ++ and
-- operators are not required.
o Selection, iteration, and jump statements are not sup-
ported.
o /usr/bin/ksh and /usr/bin/rksh treat prefix 0 through 9
as decimal constants. See the following examples:
Command Result in /bin/ksh Result in /usr/xpg4/bin/sh
echo $((010+10)) 20 18
echo $((019+10)) 29 error
[ 10 -le $((011)) ] true false
As an extension, the shell can recognize arithmetic expres-
sions beyond those listed. If the expression is invalid, the
expansion fails and the shell writes a message to standard
error indicating the failure.
A simple example using arithmetic expansion:
# repeat a command 100 times
x=100
while [ $x -gt 0 ]
do
command
x=$(($x-1))
done
Process Substitution
This feature is available in SunOS and only on versions of
the UNIX operating system that support the /dev/fd directory
SunOS 5.10 Last change: 29 Jun 2005 11
User Commands ksh(1)
for naming open files. Each command argument of the form
<(list) or >(list) runs process list asynchronously con-
nected to some file in /dev/fd. The name of this file
becomes the argument to the command. If the form with > is
selected, then writing on this file provides input for list.
If < is used, then the file passed as an argument contains
the output of the list process. For example:
paste <(cut -f1 file1) <(cut -f3 file2) | tee >(process1) >(process2)
cuts fields 1 and 3 from the files file1 and file2, respec-
tively, pastes the results together, and sends it to the
processes process1 and process2, as well as putting it onto
the standard output. The file, which is passed as an argu-
ment to the command, is a UNIX pipe(2) so programs that
expect to lseek(2) on the file does not work.
Parameter Substitution
A parameter is an identifier, one or more digits, or any of
the characters *, @, #, ?, -, $, and !. A variable (a param-
eter denoted by an identifier) has a value and zero or more
attributes. variables can be assigned values and attributes
by using the typeset special command. The attributes sup-
ported by the shell are described later with the typeset
special command. Exported variables pass values and attri-
butes to the environment.
The shell supports a one-dimensional array facility. An ele-
ment of an array variable is referenced by a subscript. A
subscript is denoted by a [, followed by an arithmetic
expression, followed by a ]. See Arithmetic Evaluation. To
assign values to an array, use set -A name value .... The
value of all subscripts must be in the range of 0 through
4095. Arrays need not be declared. Any reference to a vari-
able with a valid subscript is legal and an array is created
if necessary. Referencing an array without a subscript is
equivalent to referencing the element 0. If an array iden-
tifier with subscript * or @ is used, then the value for
each of the elements is substituted (separated by a field
separator character).
The value of a variable can be assigned by writing:
name=value [ name=value ] ...
If the integer attribute, -i, is set for name, the value is
subject to arithmetic evaluation.
Positional parameters, parameters denoted by a number, can
be assigned values with the set special command. Parameter
$0 is set from argument zero when the shell is invoked. If
parameter is one or more digits then it is a positional
SunOS 5.10 Last change: 29 Jun 2005 12
User Commands ksh(1)
parameter. A positional parameter of more than one digit
must be enclosed in braces.
Parameter Expansion
The format for parameter expansion is as follows:
${expression}
where expression consists of all characters until the match-
ing }. Any } escaped by a backslash or within a quoted
string, and characters in embedded arithmetic expansions,
command substitutions and variable expansions, are not exam-
ined in determining the matching }.
The simplest form for parameter expansion is:
${parameter}
The value, if any, of parameter is substituted.
The parameter name or symbol can be enclosed in braces,
which are optional except for positional parameters with
more than one digit or when parameter is followed by a char-
acter that could be interpreted as part of the name. The
matching closing brace are determined by counting brace lev-
els, skipping over enclosed quoted strings and command sub-
stitutions.
If the parameter name or symbol is not enclosed in braces,
the expansion uses the longest valid name whether or not the
symbol represented by that name exists. When the shell is
scanning its input to determine the boundaries of a name, it
is not bound by its knowledge of what names are already
defined. For example, if F is a defined shell variable, the
command:
echo $Fred
does not echo the value of $F followed by red; it selects
the longest possible valid name, Fred, which in this case
might be unset.
If a parameter expansion occurs inside double-quotes:
o Pathname expansion is not be performed on the results
of the expansion.
o Field splitting is not performed on the results of the
expansion, with the exception of @.
SunOS 5.10 Last change: 29 Jun 2005 13
User Commands ksh(1)
In addition, a parameter expansion can be modified by using
one of the following formats. In each case that a value of
word is needed (based on the state of parameter), word is
subjected to tilde expansion, parameter expansion, command
substitution and arithmetic expansion. If word is not
needed, it is not expanded. The } character that delimits
the following parameter expansion modifications is deter-
mined as described previously in this section and in dquote.
(For example, ${foo-bar}xyz} would result in the expansion
of foo followed by the string xyz} if foo is set, else the
string barxyz}).
${parameter:-word} Use Default Values. If parameter is
unset or null, the expansion of word
is substituted. Otherwise, the value
of parameter is substituted.
${parameter:=word} Assign Default Values. If parameter
is unset or null, the expansion of
word is assigned to parameter. In
all cases, the final value of param-
eter is substituted. Only variables,
not positional parameters or special
parameters, can be assigned in this
way.
${parameter:?[word]} Indicate Error if Null or Unset. If
parameter is unset or null, the
expansion of word (or a message
indicating it is unset if word is
omitted) is written to standard
error and the shell exits with a
non-zero exit status. Otherwise, the
value of parameter is substituted.
An interactive shell need not exit.
${parameter:+[word]} Use Alternative Value. If parameter
is unset or null, null is substi-
tuted. Otherwise, the expansion of
word is substituted.
In the parameter expansions shown previously, use of the
colon in the format results in a test for a parameter that
is unset or null. Omission of the colon results in a test
SunOS 5.10 Last change: 29 Jun 2005 14
User Commands ksh(1)
for a parameter that is only unset. The following two tables
summarize the effect of the colon:
| parameter set and not null | parameter set and null
${parameter:-word} | substitute parameter | substitute word
${parameter-word} | substitute parameter | substitute null
${parameter:=word} | substitute parameter | assign word
${parameter=word} | substitute parameter | substitute parameter
${parameter:?word} | substitute parameter | error, exit
${parameter?word} | substitute parameter | substitute null
${parameter:+word} | substitute word | substitute null
${parameter+word} | substitute word | substitute word
| parameter unset
${parameter:-word} | substitute word
${parameter-word} | substitute word
${parameter:=word} | assign word
${parameter=word} | assign null
${parameter:?word} | error, exit
${parameter?word} | error,exit
${parameter:+word} | substitute null
${parameter+word} | substitute null
In all cases shown with "substitute", the expression is
replaced with the value shown. In all cases shown with
"assign", parameter is assigned that value, which also
replaces the expression.
${#parameter} String Length. The length in charac-
ters of the value of parameter. If
parameter is * or @, then all the
positional parameters, starting with
$1, are substituted (separated by a
field separator character).
The following four varieties of parameter expansion provide
for substring processing. In each case, pattern matching
notation (see patmat), rather than regular expression nota-
tion, is used to evaluate the patterns. If parameter is * or
@, then all the positional parameters, starting with $1, are
substituted (separated by a field separator character).
Enclosing the full parameter expansion string in double-
quotes does not cause the following four varieties of pat-
tern characters to be quoted, whereas quoting characters
within the braces has this effect.
${parameter%word} Remove Smallest Suffix Pattern. The
word is expanded to produce a
SunOS 5.10 Last change: 29 Jun 2005 15
User Commands ksh(1)
pattern. The parameter expansion
then results in parameter, with the
smallest portion of the suffix
matched by the pattern deleted.
${parameter%%word} Remove Largest Suffix Pattern. The
word is expanded to produce a pat-
tern. The parameter expansion then
results in parameter, with the larg-
est portion of the suffix matched by
the pattern deleted.
${parameter#word} Remove Smallest Prefix Pattern. The
word is expanded to produce a pat-
tern. The parameter expansion then
results in parameter, with the smal-
lest portion of the prefix matched
by the pattern deleted.
${parameter##word} Remove Largest Prefix Pattern. The
word is expanded to produce a pat-
tern. The parameter expansion then
results in parameter, with the larg-
est portion of the prefix matched by
the pattern deleted.
Examples:
${parameter:-word}
In this example, ls is executed only if x is null or unset.
(The $(ls) command substitution notation is explained in
Command Substitution above.)
${x:-$(ls)}
${parameter:=word}
unset X
echo ${X:=abc}
abc
SunOS 5.10 Last change: 29 Jun 2005 16
User Commands ksh(1)
${parameter:?word}
unset posix
echo ${posix:?}
sh: posix: parameter null or not set
${parameter:+word}
set a b c
echo ${3:+posix}
posix
${#parameter}
HOME=/usr/posix
echo ${#HOME}
10
${parameter%word}
x=file.c
echo ${x%.c}.o
file.o
${parameter%%word}
x=posix/src/std
echo ${x%%/*}
posix
${parameter#word}
x=$HOME/src/cmd
echo ${x#$HOME}
/src/cmd
${parameter##word}
x=/one/two/three
echo ${x##*/}
three
Parameters Set by Shell
The following parameters are automatically set by the shell:
SunOS 5.10 Last change: 29 Jun 2005 17
User Commands ksh(1)
# The number of positional parameters in
decimal.
- Flags supplied to the shell on invocation or
by the set command.
? The decimal value returned by the last exe-
cuted command.
$ The process number of this shell.
_ Initially, the value of _ is an absolute
pathname of the shell or script being exe-
cuted as passed in the environment. Subse-
quently it is assigned the last argument of
the previous command. This parameter is not
set for commands which are asynchronous.
This parameter is also used to hold the name
of the matching MAIL file when checking for
mail.
! The process number of the last background
command invoked.
ERRNO The value of errno as set by the most
recently failed system call. This value is
system dependent and is intended for debug-
ging purposes.
LINENO The line number of the current line within
the script or function being executed.
OLDPWD The previous working directory set by the cd
command.
SunOS 5.10 Last change: 29 Jun 2005 18
User Commands ksh(1)
OPTARG The value of the last option argument pro-
cessed by the getopts special command.
OPTIND The index of the last option argument pro-
cessed by the getopts special command.
PPID The process number of the parent of the
shell.
PWD The present working directory set by the cd
command.
RANDOM Each time this variable is referenced, a
random integer, uniformly distributed
between 0 and 32767, is generated. The
sequence of random numbers can be initial-
ized by assigning a numeric value to RANDOM.
REPLY This variable is set by the select statement
and by the read special command when no
arguments are supplied.
SECONDS Each time this variable is referenced, the
number of seconds since shell invocation is
returned. If this variable is assigned a
value, then the value returned upon refer-
ence is the value that was assigned plus the
number of seconds since the assignment.
Variables Used by Shell
The following variables are used by the shell:
CDPATH The search path for the cd command.
COLUMNS If this variable is set, the value is used
to define the width of the edit window for
SunOS 5.10 Last change: 29 Jun 2005 19
User Commands ksh(1)
the shell edit modes and for printing select
lists.
EDITOR If the value of this variable ends in emacs,
gmacs, or vi and the VISUAL variable is not
set, then the corresponding option is turned
on. See the set special command.
ENV This variable, when and only when an
interactive shell is invoked, is subjected
to parameter expansion by the shell and the
resulting value is used as a pathname of a
file containing shell commands to execute
in the current environment. The file need
not be executable. If the expanded value of
ENV is not an absolute pathname, the results
are unspecified. ENV is ignored if the
user's real and effective user IDs or real
and effective group IDs are different.
This variable can be used to set aliases and
other items local to the invocation of a
shell. The file referred to by ENV differs
from $HOME/.profile in that .profile is
typically executed at session startup,
whereas the ENV file is executed at the
beginning of each shell invocation. The ENV
value is interpreted in a manner similar to
a dot script, in that the commands are exe-
cuted in the current environment and the
file needs to be readable, but not execut-
able. However, unlike dot scripts, no PATH
searching is performed. This is used as a
guard against Trojan Horse security
breaches.
FCEDIT The default editor name for the fc command.
FPATH The search path for function definitions. By
default, the FPATH directories are searched
after the PATH variable. If an executable
file is found, then it is read and executed
in the current environment. FPATH is
searched before PATH when a function with
SunOS 5.10 Last change: 29 Jun 2005 20
User Commands ksh(1)
the -u attribute is referenced. The preset
alias autoload causes a function with the -u
attribute to be created.
HISTFILE If this variable is set when the shell is
invoked, then the value is the pathname of
the file that is used to store the command
history. See Command re-entry.
HISTSIZE If this variable is set when the shell is
invoked, then the number of previously
entered commands that are accessible by this
shell is greater than or equal to this
number. The default is 128.
HOME The default argument (home directory) for
the cd command.
IFS Internal field separators, normally space,
tab, and new-line that are used to separate
command words which result from command or
parameter substitution and for separating
words with the special command read. The
first character of the IFS variable is used
to separate arguments for the $* substitu-
tion. See Quoting.
LANG Provide a default value for the internation-
alization variables that are unset or null.
If any of the internationalization variables
contains an invalid setting, the utility
behaves as if none of the variables had been
defined.
LC_ALL This variable provides a default value for
the LC_* variables.
SunOS 5.10 Last change: 29 Jun 2005 21
User Commands ksh(1)
LC_COLLATE This variable determines the behavior of
range expressions, equivalence classes and
multi-byte character collating elements
within pattern matching.
LC_CTYPE Determines how the shell handles characters.
When LC_CTYPE is set to a valid value, the
shell can display and handle text and
filenames containing valid characters for
that locale. If LC_CTYPE (see environ(5)) is
not set in the environment, the operational
behavior of the shell is determined by the
value of the LANG environment variable. If
LC_ALL is set, its contents are used to
override both the LANG and the other LC_*
variables.
LC_MESSAGES This variable determines the language in
which messages should be written.
LINENO This variable is set by the shell to a
decimal number representing the current
sequential line number (numbered starting
with 1) within a script or function before
it executes each command. If the user unsets
or resets LINENO, the variable can lose its
special meaning for the life of the shell.
If the shell is not currently executing a
script or function, the value of LINENO is
unspecified.
LINES If this variable is set, the value is used
to determine the column length for printing
select lists. Select lists print vertically
until about two-thirds of LINES lines are
filled.
MAIL If this variable is set to the name of a
mail file and the MAILPATH variable is not
set, then the shell informs the user of
arrival of mail in the specified file.
SunOS 5.10 Last change: 29 Jun 2005 22
User Commands ksh(1)
MAILCHECK This variable specifies how often (in
seconds) the shell checks for changes in the
modification time of any of the files speci-
fied by the MAILPATH or MAIL variables. The
default value is 600 seconds. When the time
has elapsed the shell checks before issuing
the next prompt.
MAILPATH A colon (:) separated list of file names. If
this variable is set, then the shell informs
the user of any modifications to the speci-
fied files that have occurred within the
last MAILCHECK seconds. Each file name can
be followed by a ? and a message that is
printed. The message undergoes parameter
substitution with the variable $_ defined as
the name of the file that has changed. The
default message is you have mail in $_.
NLSPATH Determine the location of message catalogues
for the processing of LC_MESSAGES.
PATH The search path for commands. See Execution.
The user cannot change PATH if executing
under rksh (except in .profile).
PPID This variable is set by the shell to the
decimal process ID of the process that
invoked the shell. In a subshell, PPID is
set to the same value as that of the parent
of the current shell. For example, echo
$PPID and (echo $PPID) would produce the
same value.
PS1 The value of this variable is expanded for
parameter substitution to define the primary
prompt string which by default is ``$ ''.
The character ! in the primary prompt string
is replaced by the command number. See Com-
mand Re-entry. Two successive occurrences of
! produces a single ! when the prompt string
is printed.
SunOS 5.10 Last change: 29 Jun 2005 23
User Commands ksh(1)
PS2 Secondary prompt string, by default ``> ''.
PS3 Selection prompt string used within a select
loop, by default ``#? ''.
PS4 The value of this variable is expanded for
parameter substitution and precedes each
line of an execution trace. If omitted, the
execution trace prompt is ``+ ''.
PWD Set by the shell to be an absolute pathname
of the current working directory, containing
no components of type symbolic link, no com-
ponents that are dot, and no components that
are dot-dot when the shell is initialized.
If an application sets or unsets the value
of PWD, the behaviors of the cd and pwd
utilities are unspecified
SHELL The pathname of the shell is kept in the
environment. At invocation, if the basename
of this variable is rsh, rksh, or krsh, then
the shell becomes restricted.
TMOUT If set to a value greater than zero, the
shell terminates if a command is not entered
within the prescribed number of seconds
after issuing the PS1 prompt. The shell can
be compiled with a maximum bound for this
value which cannot be exceeded.
VISUAL If the value of this variable ends in emacs,
gmacs, or vi, then the corresponding option
is turned on. See Special Command set.
The shell gives default values to PATH, PS1, PS2, PS3, PS4,
MAILCHECK, FCEDIT, TMOUT, and IFS, while HOME, SHELL, ENV,
and MAIL are not set at all by the shell (although HOME is
SunOS 5.10 Last change: 29 Jun 2005 24
User Commands ksh(1)
set by login(1)). On some systems MAIL and SHELL are also
set by login.
Blank Interpretation
After parameter and command substitution, the results of
substitutions are scanned for the field separator characters
(those found in IFS) and split into distinct arguments where
such characters are found. Explicit null arguments ( "" ) or
('') are retained. Implicit null arguments (those resulting
from parameters that have no values) are removed.
File Name Generation
Following substitution, each command word is scanned for the
characters *, ?, and [ unless the -f option has been set. If
one of these characters appears, the word is regarded as a
pattern. The word is replaced with lexicographically sorted
file names that match the pattern. If no file name is found
that matches the pattern, the word is left unchanged. When a
pattern is used for file name generation, the character
period (.) at the start of a file name or immediately fol-
lowing a /, as well as the character / itself, must be
matched explicitly. A file name beginning with a period is
not matched with a pattern with the period inside
parentheses. That is, ls .@(r*) would locate a file named
.restore, but ls @(.r*) would not. In other instances of
pattern matching, the / and . are not treated specially.
* Matches any string, including the null
string.
? Matches any single character.
[...] Matches any one of the enclosed characters.
A pair of characters separated by - matches
any character lexically between the pair,
inclusive. If the first character following
the opening "[" is a "! ", then any charac-
ter not enclosed is matched. A - can be
included in the character set by putting it
as the first or last character.
A pattern-list is a list of one or more patterns separated
from each other with a |. Composite patterns can be formed
with one or more of the following:
SunOS 5.10 Last change: 29 Jun 2005 25
User Commands ksh(1)
?(pattern-list) Optionally matches any one of the
given patterns.
*(pattern-list) Matches zero or more occurrences of
the given patterns.
+(pattern-list) Matches one or more occurrences of
the given patterns.
@(pattern-list) Matches exactly one of the given
patterns.
!(pattern-list) Matches anything, except one of the
given patterns.
Quoting
Each of the metacharacters listed above (see Definitions)
has a special meaning to the shell and causes termination of
a word unless quoted. A character can be quoted (that is,
made to stand for itself) by preceding it with a \. The pair
\NEWLINE is removed. All characters enclosed between a pair
of single quote marks ( ' ') are quoted. A single quote can-
not appear within single quotes. Inside double quote marks
(""), parameter and command substitution occur and \ quotes
the characters \, `, ", and $. The meaning of $* and $@ is
identical when not quoted or when used as a parameter
assignment value or as a file name. However, when used as a
command argument, $* is equivalent to ``$1d$2d...'', where d
is the first character of the IFS variable, whereas $@ is
equivalent to $1 $2 .... Inside grave quote marks (``), \
quotes the characters \, ', and $. If the grave quotes occur
within double quotes, then \ also quotes the character ".
The special meaning of reserved words or aliases can be
removed by quoting any character of the reserved word. The
recognition of function names or special command names
listed cannot be altered by quoting them.
Arithmetic Evaluation
An ability to perform integer arithmetic is provided with
the special command let. Evaluations are performed using
long arithmetic. Constants are of the form [ base# ] n where
SunOS 5.10 Last change: 29 Jun 2005 26
User Commands ksh(1)
base is a decimal number between two and thirty-six
representing the arithmetic base and n is a number in that
base. If base is omitted then base 10 is used.
An arithmetic expression uses the same syntax, precedence,
and associativity of expression as the C language. All the
integral operators, other than ++, -;, ?:, and , are sup-
ported. Variables can be referenced by name within an arith-
metic expression without using the parameter substitution
syntax. When a variable is referenced, its value is
evaluated as an arithmetic expression.
An internal integer representation of a variable can be
specified with the -i option of the typeset special command.
Arithmetic evaluation is performed on the value of each
assignment to a variable with the -i attribute. If you do
not specify an arithmetic base, the first assignment to the
variable determines the arithmetic base. This base is used
when parameter substitution occurs.
Since many of the arithmetic operators require quoting, an
alternative form of the let command is provided. For any
command which begins with a ((, all the characters until a
matching )) are treated as a quoted expression. More pre-
cisely, ((...)) is equivalent to let "...".
Prompting
When used interactively, the shell prompts with the parame-
ter expanded value of PS1 before reading a command. If at
any time a new-line is typed and further input is needed to
complete a command, then the secondary prompt (that is, the
value of PS2) is issued.
Conditional Expressions
A conditional expression is used with the [[ compound com-
mand to test attributes of files and to compare strings.
Word splitting and file name generation are not performed on
the words between [[ and ]]. Each expression can be con-
structed from one or more of the following unary or binary
expressions:
-a file True, if file exists.
-b file True, if file exists and is a block
special file.
-c file True, if file exists and is a char-
acter special file.
SunOS 5.10 Last change: 29 Jun 2005 27
User Commands ksh(1)
-d file True, if file exists and is a direc-
tory.
-e file True, if file exists.
-f file True, if file exists and is an ordi-
nary file.
-g file True, if file exists and has its
setgid bit set.
-h file True, if file exists and is a sym-
bolic link.
-k file True, if file exists and has its
sticky bit set.
-n string True, if length of string is non-
zero.
-o option True, if option named option is on.
-p file True, if file exists and is a fifo
special file or a pipe.
-r file True, if file exists and is readable
by current process.
-s file True, if file exists and has size
greater than zero.
SunOS 5.10 Last change: 29 Jun 2005 28
User Commands ksh(1)
-t fildes True, if file descriptor number
fildes is open and associated with a
terminal device.
-u file True, if file exists and has its
setuid bit set.
-w file True, if file exists and is writable
by current process.
-x file True, if file exists and is execut-
able by current process. If file
exists and is a directory, then the
current process has permission to
search in the directory.
-z string True, if length of string is zero.
-L file True, if file exists and is a sym-
bolic link.
-O file True, if file exists and is owned by
the effective user id of this pro-
cess.
-G file True, if file exists and its group
matches the effective group id of
this process.
-S file True, if file exists and is a
socket.
file1 -nt file2 True, if file1 exists and is newer
than file2.
SunOS 5.10 Last change: 29 Jun 2005 29
User Commands ksh(1)
file1 -ot file2 True, if file1 exists and is older
than file2.
file1 -ef file2 True, if file1 and file2 exist and
refer to the same file.
string True if the string string is not the
null string.
string = pattern True, if string matches pattern.
string != pattern True, if string does not match pat-
tern.
string1 < string2 True, if string1 comes before
string2 based on strings interpreted
as appropriate to the locale setting
for category LC_COLLATE.
string1 > string2 True, if string1 comes after string2
based on strings interpreted as
appropriate to the locale setting
for category LC_COLLATE.
exp1 -eq exp2 True, if exp1 is equal to exp2.
exp1 -ne exp2 True, if exp1 is not equal to exp2.
exp1 -lt exp2 True, if exp1 is less than exp2.
exp1 -gt exp2 True, if exp1 is greater than exp2.
SunOS 5.10 Last change: 29 Jun 2005 30
User Commands ksh(1)
exp1 -le exp2 True, if exp1 is less than or equal
to exp2.
exp1 -ge exp2 True, if exp1 is greater than or
equal to exp2.
In each of the above expressions, if file is of the form
/dev/fd/n, where n is an integer, then the test is applied
to the open file whose descriptor number is n.
A compound expression can be constructed from these primi-
tives by using any of the following, listed in decreasing
order of precedence.
(expression) True, if expression is true.
Used to group expressions.
! expression True if expression is false.
expression1 && expression2 True, if expression1 and
expression2 are both true.
expression1 || expression2 True, if either expression1
or expression2 is true.
Input/Output
Before a command is executed, its input and output can be
redirected using a special notation interpreted by the
shell. The following can appear anywhere in a simple-command
or can precede or follow a command and are not passed on to
the invoked command. Command and parameter substitution
occur before word or digit is used except as noted. File
name generation occurs only if the pattern matches a single
file, and blank interpretation is not performed.
<word Use file word as standard input
(file descriptor 0).
SunOS 5.10 Last change: 29 Jun 2005 31
User Commands ksh(1)
>word Use file word as standard output
(file descriptor 1). If the file
does not exist then it is created.
If the file exists, and the
noclobber option is on, this causes
an error; otherwise, it is truncated
to zero length.
>|word Sames as >, except that it overrides
the noclobber option.
>>word Use file word as standard output. If
the file exists, output is appended
to it (by first seeking to the EOF).
Otherwise, the file is created.
<>word Open file word for reading and writ-
ing as standard input.
<< [-]word The shell input is read up to a line
that is the same as word, or to an
EOF. No parameter substitution, com-
mand substitution, or file name gen-
eration is performed on word. The
resulting document, called a here-
document, becomes the standard
input. If any character of word is
quoted, no interpretation is placed
upon the characters of the document.
Otherwise, parameter and command
substitution occur, \NEWLINE is
ignored, and \ must be used to quote
the characters \, $, `, and the
first character of word. If - is
appended to <<, then all leading
tabs are stripped from word and from
the document.
<&digit The standard input is duplicated
from file descriptor digit (see
dup(2)). Similarly for the standard
output using >&digit.
SunOS 5.10 Last change: 29 Jun 2005 32
User Commands ksh(1)
<&- The standard input is closed. Simi-
larly for the standard output using
>&-.
<&p The input from the co-process is
moved to standard input.
>&p The output to the co-process is
moved to standard output.
If one of the above is preceded by a digit, then the file
descriptor number referred to is that specified by the digit
(instead of the default 0 or 1). For example:
... 2>&1
means file descriptor 2 is to be opened for writing as a
duplicate of file descriptor 1.
The order in which redirections are specified is signifi-
cant. The shell evaluates each redirection in terms of the
(file descriptor, file) association at the time of evalua-
tion. For example:
... 1>fname 2>&1
first associates file descriptor 1 with file fname. It then
associates file descriptor 2 with the file associated with
file descriptor 1 (that is, fname). If the order of redirec-
tions were reversed, file descriptor 2 would be associated
with the terminal (assuming file descriptor 1 had been) and
then file descriptor 1 would be associated with file fname.
If a command is followed by & and job control is not active,
then the default standard input for the command is the empty
file /dev/null. Otherwise, the environment for the execution
of a command contains the file descriptors of the invoking
shell as modified by input/output specifications.
Environment
The environment (see environ(5)) is a list of name-value
pairs that is passed to an executed program in the same way
as a normal argument list. The names must be identifiers and
the values are character strings. The shell interacts with
the environment in several ways. On invocation, the shell
scans the environment and creates a variable for each name
SunOS 5.10 Last change: 29 Jun 2005 33
User Commands ksh(1)
found, giving it the corresponding value and marking it
export. Executed commands inherit the environment. If the
user modifies the values of these variables or creates new
ones, using the export or typeset -x commands, they become
part of the environment. The environment seen by any exe-
cuted command is thus composed of any name-value pairs ori-
ginally inherited by the shell, whose values can be modified
by the current shell, plus any additions which must be noted
in export or typeset -x commands.
The environment for any simple-command or function can be
augmented by prefixing it with one or more variable assign-
ments. A variable assignment argument is a word of the form
identifier=value. Thus:
TERM=450 cmd args
and
(export TERM; TERM=450; cmd args)
are equivalent (as far as the above execution of cmd is con-
cerned, except for special commands listed that are preceded
with an asterisk).
If the -k flag is set, all variable assignment arguments are
placed in the environment, even if they occur after the com-
mand name. The following first prints a=b c and then c:
echo a=b c
set -k echo
a=b c
This feature is intended for use with scripts written for
early versions of the shell and its use in new scripts is
strongly discouraged. It is likely to disappear someday.
Functions
The function reserved word, described in the Commands sec-
tion above, is used to define shell functions. Shell func-
tions are read in and stored internally. Alias names are
resolved when the function is read. Functions are executed
like commands with the arguments passed as positional param-
eters. See Execution.
Functions execute in the same process as the caller and
share all files and present working directory with the
caller. Traps caught by the caller are reset to their
default action inside the function. A trap condition that is
not caught or ignored by the function causes the function to
terminate and the condition to be passed on to the caller.
SunOS 5.10 Last change: 29 Jun 2005 34
User Commands ksh(1)
A trap on EXIT set inside a function is executed after the
function completes in the environment of the caller. This is
true only for non-POSIX-style functions, that is, functions
declared as
function func
as opposed to POSIX-style functions, declared as
func()
Ordinarily, variables are shared between the calling program
and the function. However, the typeset special command used
within a function defines local variables whose scope
includes the current function and all functions it calls.
The special command return is used to return from function
calls. Errors within functions return control to the caller.
The names of all functions can be listed with typeset+f.
typeset -f lists all function names as well as the text of
all functions. typeset -f function-names lists the text of
the named functions only. Functions can be undefined with
the -f option of the unset special command.
Ordinarily, functions are unset when the shell executes a
shell script. The -xf option of the typeset command allows a
function to be exported to scripts that are executed without
a separate invocation of the shell. Functions that need to
be defined across separate invocations of the shell should
be specified in the ENV file with the -xf option of typeset.
Function Definition Command
A function is a user-defined name that is used as a simple
command to call a compound command with new positional
parameters. A function is defined with a function definition
command.
The format of a function definition command is as follows:
fname() compound-command[io-redirect ...]
The function is named fname; it must be a name. An implemen-
tation can allow other characters in a function name as an
extension. The implementation maintains separate name spaces
for functions and variables.
The () in the function definition command consists of two
operators. Therefore, intermixing blank characters with the
fname, (, and ) is allowed, but unnecessary.
SunOS 5.10 Last change: 29 Jun 2005 35
User Commands ksh(1)
The argument compound-command represents a compound command.
When the function is declared, none of the expansions in
wordexp is performed on the text in compound-command or io-
redirect; all expansions is performed as normal each time
the function is called. Similarly, the optional io-redirect
redirections and any variable assignments within compound-
command is performed during the execution of the function
itself, not the function definition.
When a function is executed, it has the syntax-error and
variable-assignment properties described for the special
built-in utilities.
The compound-command is executed whenever the function name
is specified as the name of a simple command The operands to
the command temporarily becomes the positional parameters
during the execution of the compound-command; the special
parameter # is also changed to reflect the number of
operands. The special parameter 0 is unchanged. When the
function completes, the values of the positional parameters
and the special parameter # is restored to the values they
had before the function was executed. If the special
built-in return is executed in the compound-command, the
function completes and execution resumes with the next com-
mand after the function call.
An example of how a function definition can be used wherever
a simple command is allowed:
# If variable i is equal to "yes",
# define function foo to be ls -l
#
[ "$i" = yes ] && foo() {
ls -l
}
The exit status of a function definition is 0 if the func-
tion was declared successfully; otherwise, it is greater
than zero. The exit status of a function invocation is the
exit status of the last command executed by the function.
Jobs
If the monitor option of the set command is turned on, an
interactive shell associates a job with each pipeline.
It keeps a table of current jobs, printed by the jobs com-
mand, and assigns them small integer numbers. When a job is
started asynchronously with &, the shell prints a line which
looks like:
[1] 1234
SunOS 5.10 Last change: 29 Jun 2005 36
User Commands ksh(1)
indicating that the job, which was started asynchronously,
was job number 1 and had one (top-level) process, whose pro-
cess id was 1234.
If you are running a job and wish to do something else you
can press the key ^Z (Control-Z) which sends a STOP signal
to the current job. The shell normally indicates that the
job has been `Stopped', and print another prompt. You can
then manipulate the state of this job, putting it in the
background with the bg command, or run some other commands
and then eventually bring the job back into the foreground
with the foreground command fg. A ^Z takes effect immedi-
ately and is like an interrupt in that pending output and
unread input are discarded when it is typed.
A job being run in the background stops if it tries to read
from the terminal. Background jobs are normally allowed to
produce output, but this can be disabled by giving the com-
mand "stty tostop". If you set this tty option, then back-
ground jobs stop when they try to produce output as they do
when they try to read input.
There are several ways to refer to jobs in the shell. A job
can be referred to by the process id of any process of the
job or by one of the following:
%number The job with the given number.
%string Any job whose command line begins with
string.
%?string Any job whose command line contains string.
%% Current job.
%+ Equivalent to %%.
%- Previous job.
SunOS 5.10 Last change: 29 Jun 2005 37
User Commands ksh(1)
The shell learns immediately whenever a process changes
state. It normally informs you whenever a job becomes
blocked so that no further progress is possible, but only
just before it prints a prompt. This is done so that it does
not otherwise disturb your work.
When the monitor mode is on, each background job that com-
pletes triggers any trap set for CHLD.
When you try to leave the shell while jobs are running or
stopped, you are warned with the message, `You have
stopped(running) jobs.' You can use the jobs command to see
what they are. If you do this or immediately try to exit
again, the shell does not warn you a second time, and the
stopped jobs is terminated. If you have jobs running for
which the nohup command was invoked and attempt to logout,
you are warned with the message:
You have jobs running.
You need to logout a second time to actually logout. How-
ever, your background jobs continue to run.
Signals
The INT and QUIT signals for an invoked command are ignored
if the command is followed by & and the monitor option is
not active. Otherwise, signals have the values inherited by
the shell from its parent. See the trap special command sec-
tion.
Execution
Each time a command is executed, the above substitutions are
carried out. If the command name matches one of the Special
Commands listed, it is executed within the current shell
process. Next, the command name is checked to see if it
matches one of the user defined functions. If it does, the
positional parameters are saved and then reset to the argu-
ments of the function call. When the function completes or
issues a return, the positional parameter list is restored
and any trap set on EXIT within the function is executed.
The value of a function is the value of the last command
executed. A function is also executed in the current shell
process. If a command name is not a special command or a
user defined function, a process is created and an attempt
is made to execute the command using exec(2).
The shell variable PATH defines the search path for the
directory containing the command. Alternative directory
names are separated by a colon (:). The default path is
/bin:/usr/bin: (specifying /bin, /usr/bin, and the current
directory in that order). The current directory can be
specified by two or more adjacent colons, or by a colon at
SunOS 5.10 Last change: 29 Jun 2005 38
User Commands ksh(1)
the beginning or end of the path list. If the command name
contains a / then the search path is not used. Otherwise,
each directory in the path is searched for an executable
file. If the file has execute permission but is not a direc-
tory or an a.out file, it is assumed to be a file containing
shell commands. A sub-shell is spawned to read it. All non-
exported aliases, functions, and variables are removed in
this case. A parenthesized command is executed in a sub-
shell without removing non-exported quantities.
Command Re-entry
The text of the last HISTSIZE (default 128) commands entered
from a terminal device is saved in a history file. The file
$HOME/.sh_history is used if the HISTFILE variable is not
set or if the file it names is not writable. A shell can
access the commands of all interactive shells which use the
same named HISTFILE. The special command fc is used to list
or edit a portion of this file. The portion of the file to
be edited or listed can be selected by number or by giving
the first character or characters of the command. A single
command or range of commands can be specified. If you do not
specify an editor program as an argument to fc then the
value of the variable FCEDIT is used. If FCEDIT is not
defined, then /bin/ed is used. The edited command(s) is
printed and re-executed upon leaving the editor. The editor
name - is used to skip the editing phase and to re-execute
the command. In this case a substitution parameter of the
form old=new can be used to modify the command before execu-
tion. For example, if r is aliased to 'fc -e -' then typing
'r bad=good c' re-executes the most recent command which
starts with the letter c, replacing the first occurrence of
the string bad with the string good.
In-line Editing Option
Normally, each command line entered from a terminal device
is simply typed followed by a new-line (RETURN or LINEFEED).
If either the emacs, gmacs, or vi option is active, the user
can edit the command line. To be in either of these edit
modes set the corresponding option. An editing option is
automatically selected each time the VISUAL or EDITOR vari-
able is assigned a value ending in either of these option
names.
The editing features require that the user's terminal accept
RETURN as carriage return without line feed and that a space
must overwrite the current character on the screen.
The editing modes implement a concept where the user is
looking through a window at the current line. The window
width is the value of COLUMNS if it is defined, otherwise
80. If the window width is too small to display the prompt
and leave at least 8 columns to enter input, the prompt is
SunOS 5.10 Last change: 29 Jun 2005 39
User Commands ksh(1)
truncated from the left. If the line is longer than the win-
dow width minus two, a mark is displayed at the end of the
window to notify the user. As the cursor moves and reaches
the window boundaries the window are centered about the cur-
sor. The mark is a > if the line extends on the right side
of the window, < if the line extends on the left, and * if
the line extends on both sides of the window.
The search commands in each edit mode provide access to the
history file. Only strings are matched, not patterns,
although a leading caret (^) in the string restricts the
match to begin at the first character in the line.
emacs Editing Mode
This mode is entered by enabling either the emacs or gmacs
option. The only difference between these two modes is the
way they handle ^T. To edit, move the cursor to the point
needing correction and then insert or delete characters or
words as needed. All the editing commands are control char-
acters or escape sequences. The notation for control charac-
ters is caret ( ^ ) followed by the character. For example,
^F is the notation for control F. This is entered by
depressing `f' while holding down the CTRL (control) key.
The SHIFT key is not depressed. (The notation ^? indicates
the DEL (delete) key.)
The notation for escape sequences is M- followed by a char-
acter. For example, M-f (pronounced Meta f) is entered by
depressing ESC (ascii 033) followed by `f'. (M-F would be
the notation for ESC followed by SHIFT (capital) `F'.)
All edit commands operate from any place on the line (not
just at the beginning). Neither the RETURN nor the LINEFEED
key is entered after edit commands except when noted.
^F Move cursor forward (right) one character.
M-f Move cursor forward one word. (The emacs
editor's idea of a word is a string of char-
acters consisting of only letters, digits
and underscores.)
^B Move cursor backward (left) one character.
M-b Move cursor backward one word.
SunOS 5.10 Last change: 29 Jun 2005 40
User Commands ksh(1)
^A Move cursor to start of line.
^E Move cursor to end of line.
^]char Move cursor forward to character char on
current line.
M-^]char Move cursor backward to character char on
current line.
^X^X Interchange the cursor and mark.
erase (User defined erase character as defined by
the stty(1) command, usually ^H or #.)
Delete previous character.
^D Delete current character.
M-d Delete current word.
M-^H (Meta-backspace) Delete previous word.
M-h Delete previous word.
M-^? (Meta-DEL) Delete previous word (if your
interrupt character is ^? (DEL, the default)
then this command does not work).
^T Transpose current character with next char-
acter in emacs mode. Transpose two previous
SunOS 5.10 Last change: 29 Jun 2005 41
User Commands ksh(1)
characters in gmacs mode.
^C Capitalize current character.
M-c Capitalize current word.
M-l Change the current word to lower case.
^K Delete from the cursor to the end of the
line. If preceded by a numerical parameter
whose value is less than the current cursor
position, then delete from given position up
to the cursor. If preceded by a numerical
parameter whose value is greater than the
current cursor position, then delete from
cursor up to given cursor position.
^W Kill from the cursor to the mark.
M-p Push the region from the cursor to the mark
on the stack.
kill (User defined kill character as defined by
the stty(1) command, usually ^G or @.) Kill
the entire current line. If two kill charac-
ters are entered in succession, all kill
characters from then on cause a line feed
(useful when using paper terminals).
^Y Restore last item removed from line. (Yank
item back to the line.)
^L Line feed and print current line.
SunOS 5.10 Last change: 29 Jun 2005 42
User Commands ksh(1)
^@ (null character) Set mark.
M-space (Meta space) Set mark.
J (New line) Execute the current line.
M (Return) Execute the current line.
eof End-of-file character, normally ^D, is pro-
cessed as an End-of-file only if the current
line is null.
^P Fetch previous command. Each time ^P is
entered the previous command back in time is
accessed. Moves back one line when not on
the first line of a multi-line command.
M-< Fetch the least recent (oldest) history
line.
M-> Fetch the most recent (youngest) history
line.
^N Fetch next command line. Each time ^N is
entered the next command line forward in
time is accessed.
^Rstring Reverse search history for a previous com-
mand line containing string. If a parameter
of zero is given, the search is forward.
string is terminated by a RETURN or NEW
LINE. If string is preceded by a ^, the
matched line must begin with string. If
string is omitted, then the next command
SunOS 5.10 Last change: 29 Jun 2005 43
User Commands ksh(1)
line containing the most recent string is
accessed. In this case a parameter of zero
reverses the direction of the search.
^O Operate. Execute the current line and fetch
the next line relative to current line from
the history file.
M-digits (Escape) Define numeric parameter, the
digits are taken as a parameter to the next
command. The commands that accept a parame-
ter are ^F, ^B, erase, ^C, ^D, ^K, ^R, ^P,
^N, ^], M-., M-^], M-_, M-b, M-c, M-d, M-f,
M-h, M-l and M-^H.
M-letter Soft-key. Your alias list is searched for an
alias by the name _letter and if an alias of
this name is defined, its value is inserted
on the input queue. The letter must not be
one of the above meta-functions.
M-[letter Soft-key. Your alias list is searched for an
alias by the name __letter and if an alias
of this name is defined, its value is
inserted on the input queue. The can be used
to program functions keys on many terminals.
M-. The last word of the previous command is
inserted on the line. If preceded by a
numeric parameter, the value of this parame-
ter determines which word to insert rather
than the last word.
M-_ Same as M-..
M-* An asterisk is appended to the end of the
word and a file name expansion is attempted.
SunOS 5.10 Last change: 29 Jun 2005 44
User Commands ksh(1)
M-ESC File name completion. Replaces the current
word with the longest common prefix of all
filenames matching the current word with an
asterisk appended. If the match is unique, a
/ is appended if the file is a directory and
a space is appended if the file is not a
directory.
M-= List files matching current word pattern if
an asterisk were appended.
^U Multiply parameter of next command by 4.
\ Escape next character. Editing characters,
the user's erase, kill and interrupt (nor-
mally ^?) characters can be entered in a
command line or in a search string if pre-
ceded by a \. The \ removes the next
character's editing features (if any).
^V Display version of the shell.
M-# Insert a # at the beginning of the line and
execute it. This causes a comment to be
inserted in the history file.
vi Editing Mode
There are two typing modes. Initially, when you enter a com-
mand you are in the input mode. To edit, enter control mode
by typing ESC (033) and move the cursor to the point needing
correction and then insert or delete characters or words as
needed. Most control commands accept an optional repeat
count prior to the command.
When in vi mode on most systems, canonical processing is
initially enabled and the command is echoed again if the
speed is 1200 baud or greater and it contains any control
characters or less than one second has elapsed since the
prompt was printed. The ESC character terminates canonical
processing for the remainder of the command and the user can
SunOS 5.10 Last change: 29 Jun 2005 45
User Commands ksh(1)
then modify the command line. This scheme has the advantages
of canonical processing with the type-ahead echoing of raw
mode.
If the option viraw is also set, the terminal always have
canonical processing disabled. This mode is implicit for
systems that do not support two alternate end of line delim-
iters, and can be helpful for certain terminals.
Input Edit Commands
By default the editor is in input mode.
erase (User defined erase character as defined by
the stty(1) command, usually ^H or #.)
Delete previous character.
^W Delete the previous blank separated word.
^D Terminate the shell.
^V Escape next character. Editing characters
and the user's erase or kill characters can
be entered in a command line or in a search
string if preceded by a ^V. The ^V removes
the next character's editing features (if
any).
\ Escape the next erase or kill character.
Motion Edit Commands
The following commands move the cursor:
[count]l Cursor forward (right) one character.
[count]w Cursor forward one alpha-numeric word.
[count]W Cursor to the beginning of the next word
that follows a blank.
SunOS 5.10 Last change: 29 Jun 2005 46
User Commands ksh(1)
[count]e Cursor to end of word.
[count]E Cursor to end of the current blank delimited
word.
[count]h Cursor backward (left) one character.
[count]b Cursor backward one word.
[count]B Cursor to preceding blank separated word.
[count]| Cursor to column count.
[count]fc Find the next character c in the current
line.
[count]Fc Find the previous character c in the current
line.
[count]tc Equivalent to f followed by h.
[count]Tc Equivalent to F followed by l.
[count]; Repeats count times, the last single charac-
ter find command, f, F, t, or T.
[count], Reverses the last single character find com-
mand count times.
SunOS 5.10 Last change: 29 Jun 2005 47
User Commands ksh(1)
0 Cursor to start of line.
^ Cursor to first non-blank character in line.
$ Cursor to end of line.
% Moves to balancing (, ), {, }, [, or ]. If
cursor is not on one of the above charac-
ters, the remainder of the line is searched
for the first occurrence of one of the above
characters first.
Search Edit Commands
These commands access your command history.
[count]k Fetch previous command. Each time k is
entered the previous command back in time is
accessed.
[count]- Equivalent to k.
[count]j Fetch next command. Each time j is entered,
the next command forward in time is
accessed.
[count]+ Equivalent to j.
[count]G The command number count is fetched. The
default is the least recent history command.
/string Search backward through history for a previ-
ous command containing string. string is
terminated by a RETURN or NEWLINE. If string
is preceded by a ^, the matched line must
SunOS 5.10 Last change: 29 Jun 2005 48
User Commands ksh(1)
begin with string. If string is NULL, the
previous string is used.
?string Same as / except that search is in the for-
ward direction.
n Search for next match of the last pattern to
/ or ? commands.
N Search for next match of the last pattern to
/ or ?, but in reverse direction. Search
history for the string entered by the previ-
ous / command.
Text Modification Edit Commands
These commands modifies the line.
a Enter input mode and enter text
after the current character.
A Append text to the end of the line.
Equivalent to $a.
[count]cmotion Delete current character through the
c[count]motion character that motion would move the
cursor to and enter input mode. If
motion is c, the entire line is
deleted and input mode entered.
C Delete the current character through
the end of line and enter input
mode. Equivalent to c$.
[count]s Delete count characters and enter
input mode.
SunOS 5.10 Last change: 29 Jun 2005 49
User Commands ksh(1)
S Equivalent to cc.
D Delete the current character through
the end of line. Equivalent to d$.
[count]dmotion Delete current character through the
d[count]motion character that motion would move to.
If motion is d, the entire line is
deleted.
i Enter input mode and insert text
before the current character.
I Insert text before the beginning of
the line. Equivalent to 0i.
[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 replace charac-
ters on the screen with characters
you type overlay fashion.
[count]rc Replace the count character(s)
starting at the current cursor posi-
tion with c, and advance the cursor.
[count]x Delete current character.
SunOS 5.10 Last change: 29 Jun 2005 50
User Commands ksh(1)
[count]X Delete preceding character.
[count]. Repeat the previous text modifica-
tion command.
[count]~ Invert the case of the count
character(s) starting at the current
|