ksh
NAME
ksh, rksh - shell, the standard/restricted command programming
language
SYNOPSIS
ksh [+aefhikmnoprstuvx] [+o option] ... [-c string] [arg ...]
rksh [+aefhikmnoprstuvx] [+o option] ... [-c string] [arg ...]
DESCRIPTION
ksh is a command programming language that executes commands read from
a terminal or a file. rksh is a restricted version of the command
interpreter ksh, used to set up login names and execution environments
whose capabilities are more controlled than those of the standard
shell. See Invoking ksh and Special Commands sections later in this
entry for details about command line options and arguments,
particularly the set command.
Definitions
metacharacter One of the following characters:
; & ( ) | < > new-line space tab
blank A tab or space character.
identifier A sequence of letters, digits, or underscores starting
with a letter or underscore. Identifiers are used as
names for functions and named parameters.
word A sequence of characters separated by one or more non-
quoted metacharacters .
command 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.
special command
A command that is carried out by the shell without
creating a separate process. Often called ``built-in
commands''. Except for documented side effects, most
special commands can be implemented as separate
utilities.
# The # character is interpreted as the beginning of a
comment. See Quoting below.
Commands
A simple-command is a sequence of blank-separated words that can be
preceded by a parameter assignment list. (See Environment below).
The first word specifies the name of the command to be executed.
Except as specified below, the remaining words are passed as arguments
terminate. The exit status of a pipeline is the exit status of the
last command in the pipeline.
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. && and || have a higher
but also equal precedence. A semicolon (;) causes sequential
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 finish). The symbol |& causes
asynchronous execution of the preceding command or pipeline with a
two-way pipe established to the parent shell (known as a co-process).
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 later. The symbol && (||) causes
the list following it to be executed only if the preceding pipeline
returns a zero (non-zero) value. An arbitrary number of new-lines can
appear in a list, instead of semicolons, to delimit commands.
A command is either a simple-command or one of the following. Unless
otherwise stated, the value returned by a command is that of the last
simple-command executed in the command.
for identifier [in word ...] do list done
Each time for is executed, identifier is set to the
next word taken from the in word list. If in word ...
is omitted, for executes the do list once for each
positional parameter set (see Parameter Substitution
below). Execution ends when there are no more words in
the list.
select identifier [in word...] do list done
A select command prints on standard error (file
descriptor 2), the set of words, each preceded by a
number. If in word ... is omitted, the positional
parameters are used instead (see Parameter Substitution
below). 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, the value of the
parameter identifier is set to the word corresponding
to this number. If this line is empty, the selection
list is printed again. Otherwise the value of the
patterns is identical to that used for file name
generation (see File Name Generation below).
if list then list [elif list then list] ... [else list]fi
The list following if is executed and, if it returns a
zero exit status, the list following the first then is
executed. Otherwise, the list following elif is
executed and, if its value is zero, the list following
the next then is executed. Failing that, the else list
is executed. If no else list or then list is executed,
if returns a zero exit status.
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
zero, executes the do list; otherwise the loop
terminates. If no commands in the do list are
executed, while returns a zero 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
as described below.
{ list;} Execute list, but not in a separate environment. Note
that { is a keyword and requires a trailing blank to be
recognized.
[[ expression ]]
Evaluates expression and returns a zero exit status
when expression is true. See Conditional Expressions
below, for a description of expression. Note that [[
and ]] are keywords and require blanks between them and
expression.
function identifier {list;}
identifier () {list;}
Define a function referred to by identifier. The body
of the function is the list of commands between { and }
function select time [[ ]]
Comments
A word beginning with # causes that word and all subsequent 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 metacharacters, 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 additional aliases. If the
last character of the alias value is a blank, the word following the
alias is also checked for alias substitution. Aliases can be used to
redefine special built-in commands, but cannot be used to redefine the
keywords 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 subshells but must be
reinitialized for separate invocations of the shell (see Invoking ksh
below).
Aliasing is performed when scripts are read, not while they are
executed. Therefore, for it to take effect, alias must be executed
before the command referring to the alias is read.
Aliases are frequently used as a shorthand for full path names. An
option to the aliasing facility allows the value of the alias to be
automatically set to the full path name of the corresponding command.
These aliases are called tracked aliases. The value of a tracked
alias is defined the first time the identifier is read and becomes
undefined each time the PATH variable is reset. These aliases remain
tracked so that the next reference redefines the value. Several
tracked aliases are compiled into the shell. The -h option of the set
command converts each command name that is an identifier into a
tracked alias.
The following exported aliases are compiled into the shell but can be
unset or redefined:
autoload='typeset -fu'
false='let 0'
functions='typeset -f'
hash='alias -t -'
history='fc -l'
integer='typeset -i'
nohup='nohup '
r='fc -e -'
stop='kill -STOP'
suspend='kill -STOP $$'
true=':'
type='whence -v'
Tilde Substitution
After alias substitution is performed, each word is checked to see if
it begins with an unquoted ~. If it does, the word up to a / is
checked to see if it matches a user name in the /etc/passwd file. 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 original text is left
unchanged. A ~, alone or before a /, is replaced by the value of the
HOME parameter. A ~ followed by a + or - is replaced by the value of
the parameter PWD and OLDPWD, respectively. In addition, tilde
substitution is attempted when the value of a parameter assignment
begins with a ~.
Command Substitution
The standard output from a command enclosed in parenthesis preceded by
a dollar sign ($(command)) or a pair of back single quotes (accent
grave) (`command`) 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 Quoting below). The command substitution
$ cat(file) can be replaced by the equivalent but faster $(arithmetic expression enclosed in double parenthesis preceded by a
dollar sign ($((expression))) is replaced by the value of the
arithmetic expression within the double parenthesis (see Arithmetic
Evaluation below for a description of arithmetic expressions).
Parameter Substitution
A parameter is an identifier, one or more digits, or any of the
characters *, @, #, ?, -, $, and !. A named parameter (a parameter
denoted by an identifier) has a value and zero or more attributes.
Named parameters can be assigned values and attributes by using the
typeset special command. Attributes supported by ksh are described
later with the typeset special command. Exported parameters pass
values and attributes to the environment.
The shell supports a limited one-dimensional array facility. An
element of an array parameter is referenced by a subscript. A
subscript is denoted by a [ followed by an arithmetic expression (see
Arithmetic Evaluation below) followed by a ]. To assign values to an
array, use set -A name value .... The value of all subscripts must be
in the range of 0 through 1023. Arrays need not be declared. Any
reference to a named parameter with a valid subscript is legal and an
array is created if necessary. Referencing an array without a
subscript is equivalent to referencing the first element.
The value of a named parameter can also be assigned by writing:
name=value [name=value] ...
If the -i integer attribute is set for name, the value is subject to
arithmetic evaluation as described below.
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.
The character $ is used to introduce substitutable parameters.
${parameter} Substitute the value of the parameter, if
any. Braces are required when parameter is
followed by a letter, digit, or underscore
that should not be interpreted as part of its
name or when a named parameter is
subscripted. If parameter is one or more
digits, it is a positional parameter. A
positional parameter of more than one digit
must be enclosed in braces. If parameter is
* or @ all the positional parameters,
starting with $1, are substituted (separated
by a field separator character). If an array
identifier with subscript * or @ is used, the
value for each element is substituted
(separated by a field separator character).
The shell reads all the characters from ${ to
the matching } as part of the same word even
if it contains braces or metacharacters.
${#parameter} If parameter is * or @, the number of
positional parameters is substituted.
Otherwise, the length of the value of the
parameter is substituted.
${#identifier[*]} Substitute the number of elements in the
array identifier.
${parameter:-word} If parameter is set and is non-null,
substitute its value; otherwise substitute
word.
${parameter:=word} If parameter is not set or is null, set it to
word; then substitute the value of the
parameter. Positional parameters cannot be
assigned in this way.
${parameter:?word} If parameter is set and is non-null,
substitute its value; otherwise, print word
and exit from the shell. If word is omitted,
a standard message is printed.
${parameter:+word} If parameter is set and is non-null,
substitute word; otherwise substitute
nothing.
${parameter#pattern}
${parameter##pattern}
If the shell pattern matches the beginning of
the value of parameter, the value of this
substitution is the value of the parameter
with the matched portion deleted; otherwise
the value of this parameter is substituted.
In the former case, the smallest matching
pattern is deleted; in the latter case, the
largest matching pattern is deleted.
${parameter%pattern}
${parameter%%pattern}
If the shell pattern matches the end of the
value of parameter, the value of parameter
with the matched part is deleted; otherwise
substitute the value of parameter. In the
former, the smallest matching pattern is
deleted; in the latter, the largest matching
pattern is deleted.
In the above, word is not evaluated unless it is used as the
substituted string. Thus, in the following example, pwd is
executed only if d is not set or is null:
echo ${d:-$(pwd)}
If the colon (:) is omitted from the above expressions, the shell
only checks to determine whether or not parameter is set.
The following parameters are set automatically by the shell:
# The number of positional parameters in decimal.
- Options supplied to the shell on invocation or by
the set command.
? The decimal value returned by the last executed
command.
$ The process number of this shell.
_ Initially, the value of _ is an absolute pathname
of the shell or script being executed as passed in
the environment. Subsequently 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.
COLUMNS If this variable is set, its value is used to
define the width of the edit window for the shell
edit modes and for printing select lists. In a
windowed environment, if the shell detects that
the window size has changed, the shell updates the
value of COLUMNS.
ERRNO The value of errno as set by the most recently
failed system call. This value is system
dependent and is intended for debugging purposes.
LINENO The line number of the current line within the
script or function being executed.
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. In a
windowed environment, if the shell detects that
the window size has changed, the shell updates the
value of LINES.
OLDPWD The previous working directory set by the cd
command.
OPTARG The value of the last option argument processed by
the getopts special command.
OPTIND The index of the last option argument processed 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 parameter is evaluated, a random
integer, uniformly distributed between 0 and
32767, is generated. The sequence of random
numbers can be initialized by assigning a numeric
value to RANDOM.
REPLY This parameter is set by the select statement and
by the read special command when no arguments are
supplied.
SECONDS Each time this parameter is referenced, the number
of seconds since shell invocation is returned. If
this parameter is assigned a value, the value
returned upon reference is the value that was
assigned plus the number of seconds since the
assignment.
The following parameters are used by the shell:
CDPATH The search path for the cd command.
EDITOR If the value of this variable ends in emacs,
gmacs, or vi and the VISUAL variable is not set,
the corresponding option is turned on (see set in
Special Commands below).
ENV If this parameter is set, parameter substitution
is performed on the value to generate the path
name of the script to be executed when the shell
is invoked (see Invoking ksh below). This file is
typically used for alias and function definitions.
FCEDIT The default editor name for the fc command.
FPATH The search path for function definitions. This
path is searched when a function with the -u
attribute is referenced and when a command is not
found. If an executable file is found, then it is
read and executed in the current environment.
IFS Internal field separators, normally space, tab,
and new-line that are used to separate command
words resulting from command or parameter
substitution, and for separating words with the
special command read. The first character of the
IFS parameter is used to separate arguments for
the "$*" substitution (see Quoting below).
HISTFILE If this parameter is set when the shell is
invoked, its value is the path name of the file
that is used to store the command history. The
default value is $HOME/.sh_history. If the user
has appropriate privileges and no HISTFILE is
given, then no history file is used (see Command
Re-entry below).
HISTSIZE If this parameter is set when the shell is
invoked, the number of previously entered commands
accessible to this shell will be greater than or
equal to this number. The default is 128.
HOME The default argument (home directory) for the cd
command.
MAIL If this parameter is set to the name of a mail
file and the MAILPATH parameter is not set, the
shell informs the user of arrival of mail in the
MAILCHECK This variable specifies how often (in seconds) the
shell checks for changes in the modification time
of any of the files specified by the MAILPATH or
MAIL parameters. The default value is 600
seconds. When the time has elapsed the shell
checks before issuing the next prompt.
MAILPATH A list of file names separated by colons (:). If
this parameter is set, the shell informs the user
of any modifications to the specified files that
have occurred within the last MAILCHECK seconds.
Each file name can be followed by a ? and a
message to be printed, in which case the message
undergoes parameter and command substitution with
the parameter $_ defined as the name of the
changed file. The default message is you have
mail in $_.
PATH The search path for commands (see Execution
below). The user cannot change PATH if executing
rksh (except in the .profile file).
PS1 The value of this parameter is expanded for
parameter substitution, to define the primary
prompt string which, by default, is $ followed by
a space character. The character ! in the primary
prompt string is replaced by the command number
(see Command Re-entry below). To include a ! in
the prompt, use !!.
PS2 Secondary prompt string, by default > followed by
a space character.
PS3 Selection prompt string used within a select loop,
by default #? followed by a space character.
PS4 The value of this variable is expanded for
parameter substitution and precedes each line of
an execution trace. If PS4 is unset, the
execution trace prompt is + followed by a space
character.
SHELL The path name of the shell is kept in the
environment. When invoked, the shell is
restricted if the value of this variable contains
an r in the basename.
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.
VISUAL Invokes the corresponding option when the value of
this variable ends in emacs, gmacs, or vi (see set
in Special Commands below).
The shell gives default values to PATH, PS1, PS2, MAILCHECK, TMOUT,
and IFS. HOME, SHELL, ENV, and MAIL are never set automatically by
the shell (although HOME, SHELL, and MAIL are set by login(1)).
After parameter and command substitution, the results of substitution
are scanned for field separator characters (found in IFS), and split
into distinct arguments where such characters are found. ksh retains
explicit null arguments ( or '') but removes implicit null arguments
(those resulting from parameters that have no values).
File Name Generation
Following substitution, each command word is processed as a pattern
for file name expansion unless the -f option has been set. The form
of the patterns is the Pattern Matching Notation defined by regexp(5).
The word is replaced with sorted file names matching the pattern. If
no file name is found that matches the pattern, the word is left
unchanged.
In addition to the notation described in regexp(5), ksh recognizes
composite patterns made up of one or more pattern lists separated from
each other with a |. Composite patterns can be formed with one or
more of the following:
?(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 above) has a
special meaning to the shell and causes termination of a word unless
quoted. A character can be quoted (i.e., made to stand for itself) by
preceding it with a \. The pair \new-line is ignored. All characters
enclosed between a pair of single quote marks (''), are quoted. A
single quote cannot appear within single quotes. Inside double quote
marks (""), parameter and command substitution occurs and \ quotes the
characters \, `, ", and $. $* and $@ have identical meanings 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 parameter,
whereas "$@" is equivalent to "$1" "$2" .... Inside back single quote
(accent grave) marks (``) \ quotes the characters \, `, and $. If the
back single quotes occur within double quotes, \ also quotes the
character ".
The special meaning of keywords or aliases can be removed by quoting
any character of the keyword. The recognition of function names or
special command names listed below cannot be altered by quoting them.
Arithmetic Evaluation
The ability to perform integer arithmetic is provided with the special
command let. Evaluations are performed using long arithmetic.
Constants take the form [base#]n, where 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, base 10 is used.
An arithmetic expression uses the same syntax, precedence, and
associativity of expression of the C language. All the integral
operators, other than ++, --, ?:, and , are supported. Variables can
be referenced by name within an arithmetic 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 beginning with
((, all characters until the matching )) are treated as a quoted
expression. More precisely, ((...)) is equivalent to let "...".
Prompting
When used interactively, the shell prompts with the 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, the secondary prompt
(the value of PS2) is issued.
Conditional Expressions.
A conditional expression is used with the [[ compound command 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 constructed 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 character
special file.
-d file True if file exists and is a directory.
-f file True if file exists and is an ordinary file.
-g file True if file exists and is has its setgid bit
set.
-h file True if file exists and is a a symbolic link.
-k file True if file exists and is 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.
-t fildes True if file descriptor number fildes is open
and associated with a terminal device.
-u file True if file exists and is 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 executable by
current process. If file exists and is a
directory, the current process has permission
to search in the directory.
-z string True if length of string is zero.
-H file True if file exists and is a hidden directory
(see cdf(4)).
-L file True if file exists and is a symbolic link.
-O file True if file exists and is owned by the
effective user ID of this process.
-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.
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 = pattern True if string matches pattern.
string != pattern True if string does not match pattern.
string1 < string2 True if string1 comes before string2 based on
ASCII value of their characters.
string1 > string2 True if string1 comes after string2 based on
ASCII value of their characters.
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.
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.
A compound expression can be constructed from these primitives 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 occurs before word or digit is used, except as noted
below. File name generation occurs only if the pattern matches a
single file and blank interpretation is not performed.
standard input (file descriptor
0).
>word Use file word as standard output (file descriptor
1). If the file does not exist, it is created.
If the file exists, and the noclobber option is
on, an error occurs; otherwise, the file 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
searching for the end-of-file); otherwise, the
file is created.
<>word Open file word for reading and writing as standard
input. If the file does not exist it is created.
<<[-]word The shell input is read up to a line that matches
word, or to an end-of-file. No parameter
substitution, command substitution, or file name
generation 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 occurs, \new-line is
ignored, and \ must be used to quote the
characters \, $, `, and the first character of
word. If - is appended to <<, all leading tabs
are stripped from word and from the document.
<&digit The standard input is duplicated from file
descriptor digit (see dup(2)).
>&digit The standard output is duplicated to file
descriptor digit (see dup(2)).
<&- The standard input is closed.
>&- The standard output is closed.
<&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, the file descriptor number
cited 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.
Redirection order is significant because the shell evaluates
redirections referencing file descriptors in terms of the currently
open file associated with the specified file descriptor at the time of
evaluation. For example:
... 1>fname 2>&1
first assigns file descriptor 1 (standard output) to file fname, then
assigns file descriptor 2 (standard error) to the file assigned to
file descriptor 1; i.e., fname. On the other hand, if the order of
redirection is reversed as follows:
... 2>&1 1>fname
file descriptor 2 is assigned to the current standard output (user
terminal unless a different assignment is inherited). File descriptor
1 is then reassigned to file fname without changing the assignment of
file descriptor 2.
The input and output of a co-process can be moved to a numbered file
descriptor allowing other commands to write to them and read from them
using the above redirection operators. If the input of the current
co-process is moved to a numbered file descriptor, another co-process
can be started.
If a command is followed by & and job control is inactive, 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 passed
to an executed program much like a normal argument list. The names
must be identifiers and the values are character strings. The shell
interacts with the environment in several ways. When invoked, the
shell scans the environment and creates a parameter for each name
found, gives it the corresponding value, and marks it export.
Executed commands inherit the environment. If the user modifies the
values of these parameters or creates new ones by using the export or
typeset -x commands, the values become part of the environment. The
environment seen by any executed command is thus composed of any
name-value pairs originally 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 parameter assignments. A parameter
assignment argument takes the form identifier=value. For example,
TERM=450 cmd args
and
(export TERM; TERM=450; cmd args)
are equivalent (as far as the above execution of cmd is concerned
except for special commands listed below that are preceded by a
dagger).
If the -k option is set, all parameter assignment arguments are placed
in the environment, even if they occur after the command name. The
following echo statement prints a=b c. After the -k option is set,
the second echo statement prints only 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 keyword (described in the Commands section above) is used
to define shell functions. Shell functions are read and stored
internally. Alias names are resolved when the function is read.
Functions are executed like commands, with the arguments passed as
positional parameters (see Execution below).
Functions execute in the same process as the caller except that
command substitution of a function creates a new process. Functions
share all files and present working directory with the caller. Traps
caught by the caller are reset to their default action inside the
function. If a function does not catch or specifically ignore a trap
condition, the function terminates and the condition is passed on to
the caller. A trap on EXIT set inside a function is executed after
the function completes in the environment of the caller. 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.
Function identifiers can be listed with the +f option of the typeset
special command. Function identifiers and the associated text of the
functions can be listed with the -f option. 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 reinvoking the shell.
Functions that must be defined across separate invocations of the
shell should be placed in the ENV file.
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 command, and assigns them small
integer numbers. When a job is started asynchronously with &, the
shell prints a line resembling:
[1] 1234
indicating that job number 1 was started asynchronously and had one
(top-level) process whose process ID was 1234.
If you are running a job and want to do something else, type the
suspend character (usually ^Z (Ctrl-Z)) to send a STOP signal to the
current job. The shell then indicates that the job has been
`Stopped', and prints another prompt. The state of this job can be
manipulated by using the bg command to put it in the background,
running other commands (while it is stopped or running in the
background), and eventually restarting or returning the job to the
foreground by using the fg command. A ^Z takes effect immediately and
resembles an interrupt, since pending output and unread input are
discarded when ^Z is typed.
A job run in the background stops if it tries to read from the
terminal. Background jobs normally are allowed to produce output, but
can be disabled by giving the stty tostop command. If the user sets
this tty option, background jobs stop when trying to produce output.
There are several ways to refer to jobs in the shell. A job can be
referred to by the process ID of any process in 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.
The shell learns immediately when a process changes state. It informs
the user when a job is blocked and prevented from further progress,
but only just before it prints a prompt.
When the monitor mode is on, each background job that completes
triggers any trap set for CHLD.
Attempting to leave the shell while jobs are running or stopped
produces the warning, You have stopped (running) jobs. Use the jobs
command to identify them. An immediate attempt to exit again
terminates the stopped jobs; the shell does not produce a warning the
second time.
Signals
The INT and QUIT signals for an invoked command are ignored if the
command is followed by & and the monitor option is off. Otherwise,
signals have the values inherited by the shell from its parent, with
the exception of signal 11 (but see also the trap command below).
Execution
Substitutions are made each time a command is executed. If the
command name matches one of the Special Commands listed below, it is
executed within the current shell process. Next, ksh checks the
command name to determine whether it matches one of the user-defined
functions. If it does, ksh saves the positional parameters and then
sets them to the arguments of the function call. The positional
parameter 0 is set to the function name. When the function completes
or issues a return, ksh restores the positional parameter list and
function is the value of the last command executed. A function is
executed in the current shell process. If a command name is not a
special command or a user-defined function, ksh creates a process and
attempts to execute the command using exec (see exec(2)).
The shell parameter PATH defines the search path for the directory
containing the command. Alternative directory names are separated by
a colon (:). The default path is /usr/bin: (specifying /usr/bin and
the current directory in that order). Note that the current directory
is specified by a null path name which can appear immediately after
the equals sign, between colon delimiters, or at the end of the path
list. The search path is not used if the command name contains a /.
Otherwise, each directory in the path is searched for an executable
file. If the file has execute permissions but is not a directory or
an executable object code file, it is assumed to be a script file,
which is a file of data for an interpreter. If the first two
characters of the script file are #!, exec (see exec(2)) expects an
interpreter path name to follow. exec then attempts to execute the
specified interpreter as a separate process to read the entire script
file. If a call to exec fails, /usr/bin/ksh is spawned to interpret
the script file. All non-exported aliases, functions, and named
parameters are removed in this case. If the shell command file does
not have read permission, or if the setuid and/or setgid bits are set
on the file, the shell executes an agent to set up the permissions and
execute the shell with the shell command file passed down as an open
file. A parenthesized command is also 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
writable. A shell can access the commands of all interactive shells
that 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 no editor program is specified as an
argument to fc, the value of the FCEDIT parameter is used. If FCEDIT
is not defined, /usr/bin/ed is used. The edited command 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 execution. For example, if r is aliased to fc -e -,
typing r bad=good c re-executes the most recent command that starts
with the letter c and replaces the first occurrence of the string bad
with the string good.
Special Commands
The following simple-commands are executed in the shell process. They
descriptor 1 is the default output location and the exit status, when
there are no syntax errors, is zero. Commands that are preceded by |
or || are treated specially in the following ways:
1. Variable assignment lists preceding the command remain in
effect when the command completes.
2. I/O redirections are processed after variable assignments.
3. Errors cause a script that contains them to abort.
4. Words following a command preceded by || that are in the
format of a variable assignment are expanded with the same
rules as a variable assignment. This means that tilde
substitution is performed after the = sign and word splitting
and file name generation are not performed.
| : [arg ...] The command only expands parameters. A zero exit code
is returned.
| . file [arg ...]
Read and execute commands from file and return. The
commands are executed in the current shell environment.
The search path specified by PATH is used to find the
directory containing file. If any arguments arg are
given, they become the positional parameters.
Otherwise the positional parameters are unchanged. The
exit status is the exit status of the last command
executed. It is not necessary that the execute
permission bit be set for file.
|| alias [-tx] [name[=value] ...]
alias with no arguments prints the list of aliases in
the form name=value on standard output. An alias is
defined for each name whose value is given. A trailing
space in value causes the next word to be checked for
alias substitution. The -t option is used to set and
list tracked aliases. The value of a tracked alias is
the full path name corresponding to the given name.
The value of a tracked alias becomes undefined when the
value of PATH is reset, but the alias remains tracked.
Without the -t option, for each name in the argument
list for which no value is given, the name and value of
the alias is printed. The -x option is used to set or
print exported aliases. An exported alias is defined
across sub-shell environments. Alias returns true
unless a name is given for which no alias has been
defined.
bg [job ...] Puts the specified jobs into the background. The
current job is put in the background if job is
unspecified. See Jobs for a description of the format
of job.
| break [n] Exit from the enclosing for, while, until, or select
loop, if any. If n is specified, break n levels.
| continue [n] Resume the next iteration of the enclosing for, while,
until, or select loop. If n is specified, resume at
the n-th enclosing loop.
cd [-L|-P] [arg]
cd old new This command can take either of two forms. In the
first form it changes the current directory to arg. If
arg is - the directory is changed to the previous
directory. The -L option (default) preserves logical
naming when treating symbolic links. cd -L .. moves
the current directory one path component closer to the
root directory. The -P option preserves the physical
path when treating symbolic links. cd -P .. changes
the working directory to the parent directory of the
current directory. The shell parameter HOME is the
default arg. The parameter PWD is set to the current
directory. The shell parameter CDPATH defines the
search path for the directory containing arg.
Alternative directory names are separated by a colon
(:). If CDPATH is null or undefined, the default value
is the current directory. Note that the current
directory is specified by a null path name which can
appear immediately after the equal sign or between the
colon delimiters anywhere else in the path list. If
arg begins with a /, the search path is not used.
Otherwise, each directory in the path is searched for
arg.
The second form of cd substitutes the string new for
the string old in the current directory name, PWD and
tries to change to this new directory.
The cd command cannot be executed by rksh.
echo [arg ...] See echo(1) for usage and description.
| eval [arg ...]
Reads the arguments as input to the shell and executes
the resulting command(s).
| exec [arg ...]
Parameter assignments remain in effect after the
command completes. If arg is given, the command
specified by the arguments is executed in place of this
shell without creating a new process. Input/output
arguments can appear and affect the current process.
If no arguments are given, the effect of this command
is to modify file descriptors as prescribed by the
input/output redirection list. In this case, any file
descriptor numbers greater than 2 opened with this
mechanism are closed when invoking another program.
| exit [n] Causes the shell to exit with the exit status specified
by n. If n is omitted, the exit status is that of the
last command executed. An end-of-file also causes the
shell to exit, except when a shell has the ignoreeof
option set (see set below).
|| export [name [=value] ...]
The given names are marked for automatic export to the
environment of subsequently executed commands.
fc [-eename] [-nlr] [first [last]]
fc -e - [old=new] [command]
In the first form, a range of commands from first to
last is selected from the last HISTSIZE commands typed
at the terminal. The arguments first and last can be
specified as a number or string. A given string is
used to locate the most recent command. A negative
number is used to offset the current command number.
The -l option causes the commands to be listed on
standard output. Otherwise, the editor program ename
is invoked on a file containing these keyboard
commands. If ename is not supplied, the value of the
parameter FCEDIT (default /usr/bin/ed) is used as the
editor. Once editing has ended, the commands (if any)
are executed. If last is omitted, only the command
specified by first is used. If first is not specified,
the default is the previous command for editing and -16
for listing. The -r option reverses the order of the
commands and the -n option suppresses command numbers
when listing. In the latter, the command is re-
executed after the substitution old=new is performed.
fg [job ...] Brings each job into the foreground in the order
specified. If no job is specified, the current job is
brought into the foreground. See Jobs for a
description of the format of job.
getopts optstring name [arg ...]
Checks arg for legal options. If arg is omitted, the
positional parameters are used. An option argument
begins with a + or a -. An option not beginning with +
or -, or the argument -- ends the options. optstring
contains the letters that getopts recognizes. If a
letter is followed by a :, that option is expected to
have an argument. The options can be separated from
the argument by blanks.
getopts places the next option letter it finds inside
variable name each time it is invoked with a +
preceding it when arg begins with a +. The index of
the next arg is stored in OPTIND. The option argument,
if any, gets stored in OPTARG.
A leading : in optstring causes getopts to store the
letter of an invalid option in OPTARG, and to set name
to ? for an unknown option and to : when a required
option is missing. Otherwise, getopts prints an error
message. The exit status is non-zero when there are no
more options.
jobs [-lnp] [job ...]
Lists information about each given job; or all active
jobs if job is omitted. The -l option lists process
ids in addition to the normal information. The -n
option only displays jobs that have stopped or exited
since last notified. The -p option causes only the
process group to be listed. See Jobs for a description
of the format of job.
kill [-sig] process ...
Sends either the TERM (terminate) signal or the
specified signal to the specified jobs or processes.
Signals are given either by number or name (as given in
signal(5), stripped of the prefix SIG). The signal
names are listed by kill -l. No default exists; merely
typing kill does not affect the current job. If the
signal being sent is TERM (terminate) or HUP (hangup),
the job or process is sent a CONT (continue) signal
when stopped. The process argument can be either a
process ID or job. If the first argument to kill is a
negative integer, it is interpreted as a sig argument
and not as a process group.
let arg ... Each arg is a separate arithmetic expression to be
evaluated. See Arithmetic Evaluation above, for a
description of arithmetic expression evaluation. The
exit status is 0 if the value of the last expression is
non-zero, and 1 otherwise.
| newgrp [arg ...]
Equivalent to exec newgrp arg ....
print[-Rnprsu[n]] [arg ...]
The shell output mechanism. With no options or with
option - or -- the arguments are printed on standard
output as described by echo(1). Raw mode, -R or -r,
ignores the escape conventions of echo. The -R option
prints all subsequent arguments and options other than
-n. The -p option causes the arguments to be written
onto the pipe of the process spawned with |& instead of
standard output. The -s option causes the arguments to
be written onto the history file instead of standard
output. The -u option can be used to specify a one-
digit file descriptor unit number n on which the output
is to be placed. The default is 1. If the option -n
is used, no new-line character is added to the output.
pwd [-L|-P] With no arguments prints the current working directory
(equivalent to print -r - $PWD). The -L option
(default) preserves the logical meaning of the current
directory and -P preserves the physical meaning of the
current directory if it is a symbolic link (see cd and
ln(1)).
read [-prsu[n]] [name] [?prompt] [name ...]
The shell input mechanism. One line is read and broken
up into words using the characters in IFS as
separators. In -r raw mode, \ at the end of a line
does not signify line continuation. The first word is
assigned to the first name, the second word to the
second name, etc., with remaining words assigned to the
last name. The -p option causes the input line to be
taken from the input pipe of a process spawned by the
shell using |&. If the -s option is present, the input
is saved as a command in the history file. The option
-u can be used to specify a one-digit file descriptor
unit to read from. The file descriptor can be opened
with the exec special command. The default value of n
is 0. If name is omitted, REPLY is used as the default
name. The return code is 0, unless an end-of-file is
encountered. An end-of-file with the -p option causes
cleanup for this process so that another process can be
spawned. If the first argument contains a ?, the
remainder of this word is used as a prompt when the
shell is interactive. If the given file descriptor is
open for writing and is a terminal device, the prompt
is placed on this unit. Otherwise the prompt is issued
on file descriptor 2. The return code is 0, unless an
end-of-file is encountered.
|| readonly [name[=value] ...]
The given names are marked read-only and these names
cannot be changed by subsequent assignment.
| return [n] Causes a shell function to return to the invoking
script with the return status specified by n. If n is
omitted, the return status is that of the last command
executed. Only the low 8 bits of n are passed back to
the caller. If return is invoked while not in a
function or executing a script by the . (dot) built-in
command, it has the same effect as an exit command.
set [+aefhkmnopstuvx|+o option] ... [+A name] [arg ...]
The following options are used for this command:
-A Array assignment. Unset the variable name
and assign values sequentially from the
list arg. If +A is used, the variable
name is not unset first.
-a All subsequent defined parameters are
automatically exported.
-e If the shell is non-interactive and if a
command fails, execute the ERR trap, if
set, and exit immediately. This mode is
disabled while reading profiles.
-f Disables file name generation.
-h Each command whose name is an identifier
becomes a tracked alias when first
encountered.
-k All parameter assignment arguments (not
just those that precede the command name)
are placed in the environment for a
command.
-m Background jobs are run in a separate
process group and a line is printed upon
completion. The exit status of background
jobs is reported in a completion message.
This option is turned on automatically for
interactive shells.
-n Read commands and check them for syntax
errors, but do not execute them. The -n
option is ignored for interactive shells.
-o The -o argument takes any of several
option names, but only one option can be
specified with each -o option. If none is
supplied, the current option settings are
printed. The -o argument option names
follow:
allexport Same as -a.
bgnice All background jobs are
run at a lower priority.
errexit Same as -e.
emacs Activates an emacs-style
in-line editor for
command entry.
gmacs Activates a gmacs-style
in-line editor for
command entry.
ignoreeof The shell does not exit
on end-of-file. The
command exit must be
used.
keyword Same as -k.
markdirs All directory names
resulting from file name
generation have a
trailing / appended.
monitor Same as -m.
noclobber Prevents redirection >
from truncating existing
files. Requires >| to
truncate a file when
turned on.
noexec Same as -n.
noglob Same as -f.
nolog Do not save function
definitions in history
file.
nounset Same as -u.
privileged Same as -p.
verbose Same as -v.
trackall Same as -h.
vi Activates the insert
mode of a vi-style in-
line editor until you
press the ESC key which
puts you in move mode.
A return sends the line.
viraw Each character is
processed as it is typed
in vi mode.
xtrace Same as -x.
-p Disables processing of the $HOME/.profile file and
uses the file /etc/suid_profile instead of the ENV
file. This mode is on whenever the effective uid
(gid) is not equal to the real uid (gid). Turning
this off causes the effective uid and gid to be
set to the real uid and gid.
-s Sort the positional parameters.
-t Exit after reading and executing one command.
-u Treat unset parameters as an error when
substituting.
-v Print shell input lines as they are read.
-x Print commands and their arguments as they are
executed.
- Turns off -x and -v options and stops examining
arguments for options.
-- Do not change any of the options; useful in
setting $1 to a value beginning with -. If no
arguments follow this option, the positional
parameters are unset.
Using + instead of - before a option causes the option
to be turned off. These options can also be used when
invoking the shell. The current set of options can be
examined by using $-.
Unless -A is specified, the remaining arg arguments are
positional parameters and are assigned consecutively to
$1, $2, .... If neither arguments nor options are
given, the values of all names are printed on the
standard output.
| shift [n] The positional parameters from $n+1 ... are renamed
$1 ...; default n is 1. The parameter n can be any
arithmetic expression that evaluates to a non-negative
number less than or equal to $#.
test [expr] Evaluate conditional expression expr. See test(1) for
usage and description. The arithmetic comparison
operators are not restricted to integers. They allow
any arithmetic expression. Four additional primitive
expressions are allowed:
-L file True if file is a symbolic
link.
file1 -nt file2 True if file1 is newer than
file2.
file1 -ot file2 True if file1 is older than
file2.
file1 -ef file2 True if file1 has the same
device and i-node number as
file2.
| times Print the accumulated user and system times for the
shell and for processes run from the shell.
| trap [arg] [sig ...]
arg is a command read and executed when the shell
receives signal(s) sig. (Note that arg is scanned once
when the trap is set and once when the trap is taken.)
Each sig can be given as a number or name of the
signal. Trap commands are executed in signal number
order. Any attempt to set a trap on a signal that was
ignored upon entering the current shell has no effect.
If arg is omitted or is -, all traps for sig are reset
to their original values. If arg is the null string,
this signal is ignored by the shell and by the commands
it invokes. If sig is DEBUG, arg is executed after
each command. If sig is ERR, arg is executed whenever
a command has a non-zero exit code. If sig is 0 or
EXIT and the trap statement is executed inside the body
of a function, the command arg is executed after the
function completes. If sig is 0 or EXIT for a trap set
outside any function, the command arg is executed on
exit from the shell. The trap command with no
arguments prints a list of commands associated with
each signal number.
|| typeset [+LRZfilrtux[n]] [name[ = value]] ...
Parameter assignments remain in effect after the
command completes. When invoked inside a function, a
new instance of the parameter name is created. The
parameter value and type are restored when the function
completes. The following list of attributes can be
specified:
-L Left justify and remove leading blanks from
value. If n is non-zero, it defines the
width of the field. Otherwise, it is
determined by the width of the value of first
assignment. When the name is assigned, the
value is filled on the right with blanks or
truncated, if necessary, to fit into the
field. Leading zeros are removed if the -Z
option is also set. The -R option is turned
off.
-R Right justify and fill with leading blanks.
If n is non-zero, it defines the width of the
field. Otherwise, it is determined by the
width of the value of first assignment. The
field is left-filled with blanks or truncated
from the end if the parameter is reassigned.
The -L option is turned off.
-Z Right justify and fill with leading zeros if
the first non-blank character is a digit and
the -L option has not been set. If n is
non-zero, it defines the width of the field.
Otherwise, it is determined by the width of
the value of first assignment.
-f Cause name to refer to function names rather
than parameter names. No assignments can be
made to the name declared with the typeset
statement. The only other valid options are
-t (which turns on execution tracing for this
function) and -x (which allows the function
to remain in effect across shell procedures
executed in the same process environment).
-i Parameter is an integer. This makes
arithmetic faster. If n is non-zero, it
defines the output arithmetic base; otherwise
the first assignment determines the output
base.
-l Convert all uppercase characters to
lowercase. The uppercase -u option is turned
off.
-r Any given name is marked "read only" and
cannot be changed by subsequent assignment.
-t Tag the named parameters. Tags are user
definable and have no special meaning to the
shell.
-u Convert all lowercase characters to uppercase
characters. The lowercase -l option is
turned off.
-x Mark any given name for automatic export to
the environment of subsequently executed
commands.
Using + instead of - causes these options to
be turned off. If no name arguments are
given but options are specified, a list of
names (and optionally the values) of the
parameters that have these options set is
printed. Using + instead of - retains the
values to be printed. If neither names nor
options are given, the names and attributes
of all parameters are printed.
ulimit [n] If n is given, impose a size limit of n 512 byte blocks
on files written by child processes (files of any size
can be read). If n is not given, the current limit is
printed.
umask [mask] The user file-creation mask is set to mask (see
umask(2)). mask can either be an octal number or a
symbolic value as described in chmod(1). If a symbolic
value is given, the new umask value is the complement
of the result of applying mask to the complement of the
previous umask value. If mask is omitted, the current
value of the mask is printed.
unalias name ...
The parameters given by the list of names are removed
from the alias list.
unset [-f] name ...
The parameters given by the list of names are
unassigned; that is, their values and attributes are
erased. Read-only variables cannot be unset. If the
-f option is set, names refer to function names.
Unsetting ERRNO, LINENO, MAILCHECK, OPTARG, OPTIND,
RANDOM, SECONDS, TMOUT, and _ removes their special
meaning even if they are subsequently assigned to.
| wait [job] Wait for the specified job to terminate or stop, and
report its status. This status becomes the return code
for the wait command. If job is not given, wait waits
for all currently active child processes to terminate
or stop. The termination status returned is that of
the last process. See Jobs for a description of the
format of a job.
whence [-pv] name ...
For each name, indicate how it would be interpreted if
used as a command name. The -v option produces a more
verbose report. The -p option does a path search for
name even if name is an alias, a function, or a
reserved word.
Invoking ksh
If the shell is invoked by exec (see exec(2)), and the first character
of argument zero ($0) is -, the shell is assumed to be a login shell
and commands are read first from /etc/profile. The expression
${HOME:-.}/.profile is then evaluated and an attempt to open the
resulting filename is made. If the file is opened successfully, the
file is read. Next, commands are read from the file named by
performing parameter substitution on the value of the environment
parameter ENV, if the file exists. If the -s option is not present
and arg is, a path search is performed on the first arg to determine
the name of the script to execute. When running ksh with arg, the
script arg must have read permission and any setuid and getgid
settings are ignored. Commands are then read as described below. The
following options are interpreted by the shell when it is invoked:
-c string If the -c option is present, commands are read
from string.
-s If the -s option is present or if no arguments
remain, commands are read from the standard input.
Shell output, except for the output of some of the
Special commands listed above, is written to file
descriptor 2.
-i If the -i option is present or if the shell input
and output are attached to a terminal (as reported
by tty(3C)), the shell is interactive. In this
case SIGTERM is ignored (so that kill 0 does not
kill an interactive shell) and SIGINT +1 is caught
and ignored (so that wait is interruptible). In
all cases, SIGQUIT is ignored by the shell. (See
signal(5).)
-r If the -r option is present, the shell is a
restricted shell.
The remaining options and arguments are described under the set
command above.
rksh Only
rksh is used to set up login names and execution environments where
capabilities are more controlled than those of the standard shell.
The actions of rksh are identical to those of ksh, except that the
following are forbidden:
o Changing directory (see cd(1))
o Setting the value of SHELL, ENV, or PATH
o Specifying path or command names containing /
o Redirecting output (>, >|, <>, and >>)
The restrictions above are enforced after the .profile and ENV files
are interpreted.
When a command to be executed is found to be a shell procedure, rksh
invokes ksh to execute it. Thus, the end-user is provided with shell
procedures accessible to the full power of the standard shell, while
being restricted to a limited menu of commands. This scheme assumes
that the end-user does not have write and execute permissions in the
same directory.
These rules effectively give the writer of the .profile file complete
control over user actions, by performing guaranteed set-up actions and
leaving the user in an appropriate directory (probably not the login
directory).
The system administrator often sets up a directory of commands
(usually /usr/rbin) that can be safely invoked by rksh. HP-UX systems
provide a restricted editor red (see ed(1)), suitable for restricted
users.
COMMAND-LINE EDITING
In-line Editing Options
Normally, each command line typed at a terminal device is followed by
a new-line (carriage-return or line-feed). If either the emacs,
gmacs, or vi option is set, the user can edit the command line. An
editing option is automatically selected each time the VISUAL or
EDITOR variable 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 character must
overwrite the current character on the screen. ADM terminal users
should set the ``space/advance'' switch to ``space''. Hewlett-Packard
terminal users should set the straps to ``bcGHxZ etX''.
The editing modes enable the user to look through a window at the
current line. The default window width is 80, unless the value of
COLUMNS is defined. If the line is longer than the window width minus
two, a mark displayed at the end of the window notifies the user. The
mark is a >, <, or * if the line extends respectively on the right,
left, or both side(s) of the window. As the cursor moves and reaches
the window boundaries, the window is centered about the cursor.
The search commands in each edit mode provide access to the history
file. Only strings are matched, not patterns, although a leading ^ in
the string restricts the match to begin at the first character in the
line.
Emacs Editing Mode
This mode is invoked by either the emacs or gmacs option. Their sole
difference is their handling of ^T. To edit, the user moves the
cursor to the point needing correction and inserts or deletes
characters or words. All editing commands are control characters or
escape sequences. The notation for control characters is circumflex
(^) followed by the character. For example, ^F is the notation for
Ctrl-F. This is entered by pressing the f key while holding down the
Ctrl (control) key. The Shift key is not pressed. (The notation ^?
indicates the DEL (delete) key.)
The notation for escape sequences is M- followed by a character. 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 only at the
beginning). Neither the Return nor the Line Feed key is entered after
edit commands, except when noted.
^F Move cursor forward (right) one character.
M-f Move cursor forward one word. (The editor's idea of a
word is a string of characters consisting of only
letters, digits and underscores.)
^B Move cursor backward (left) one character.
M-b Move cursor backward one word.
^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.
eof End-of-file character, normally ^D, terminates the
shell if the current line is null.
M-d Delete current word.
M-^H (Meta-backspace) Delete previous word.
M-h Delete previous word.
M-^? (Meta-DEL) Delete previous word (if interrupt character
is ^? (DEL, the default) this command does not work).
^T Transpose current character with next character in
emacs mode. Transpose two previous characters in gmacs
mode.
^C Capitalize current character.
M-c Capitalize current word.
M-l Change the current word to lowercase.
^K Delete from the cursor to the end of the line. If
preceded by a numerical parameter whose value is less
that the current cursor position, delete from the given
position up to the cursor. If preceded by a numerical
parameter whose value is greater than the current
cursor position, from the cursor up to the given
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 characters are entered in
succession, all subsequent consecutive kill characters
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.
^@ (Null character) Set mark.
M-space (Meta space) Set mark.
^J (New line) Execute the current line.
^M (Return) Execute the current line.
^P Fetch previous command. Each time ^P is entered, the
next previous command in the history list is accessed.
^N Fetch next command. Each time ^N is entered the next
command in the history list is accessed.
M-< Fetch the least recent (oldest) history line.
M-> Fetch the most recent (youngest) history line.
^Rstring Reverse search history for a previous command 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, the
next command 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 from the
history file the next line relative to current line.
M-digits (Escape) Define numeric parameter, the digits are taken
as a parameter to the next command. The commands that
accept a parameter are ^F, ^B, erase, ^C, ^D, ^K, ^R,
^P, ^N, ^], M-., M-_, M-b, M-c, M-d, M-f, M-h, M-l and
M-^H.
M-letter Softkey. User's 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.
This letter must not be one of the above meta-
functions.
M-. The last word of the previous command is inserted on
the line. If preceded by a numeric parameter, the
value of this parameter determines which word to insert
rather than the last word.
M-_ Same as M-..
M-* Attempt file-name generation on the current word.
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 as 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 (normally ^?) characters can
be entered in a command line or in a search string if
preceded 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. Entering a command puts you into input
mode. To edit, the user enters control mode by pressing ESC and moves
the cursor to the point needing correction, then inserts or deletes
characters or words. Most control commands accept an optional repeat
count prior to the command.
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 contains any control characters, or if 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
then modify the command line. This scheme has the advantages of
canonical processing with the type-ahead echoing of raw mode.
Setting the viraw option always disables canonical processing on the
terminal. This mode is implicit for systems that do not support two
alternate end-of-line delimiters, and can be helpful for certain
terminals.
Input Edit Commands
By default the editor is in input mode.
erase Delete previous character. (erase is a user-defined
erase character, as defined by the stty(1) command,
usually ^H or #.)
^W Delete the previous blank separated word.
^D Terminate the shell.
^V Escape next character. Editing characters, erase or
kill characters can be entered in a command line or in
a search string if preceded by a ^V. ^V removes the
next character's editing features (if any).
\ Escape the next erase or kill character.
Motion Edit Commands
These commands move the cursor. The designation [count] causes a
repetition of the command the cited number of times.
[count]l Cursor forward (right) one character.
[count]w Cursor forward one alphanumeric word.
[count]W Cursor to the beginning of the next word that
follows a blank.
[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. Default is 1.
[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 the last single character find command, f,
F, t, or T.
[count], Reverses the last single character find command.
0 Cursor to start of line.
^ Cursor to first nonblank character in line.
$ Cursor to end of line.
Search Edit Commands
These commands access your command history.
[count]k Fetch previous command. Each time k is
pressed, the next earlier command in the
history list is accessed.
[count]- Equivalent to k.
[count]j Fetch next command. Each time j is entered,
the next later command in the history list is
accessed.
[count]+ Equivalent to j.
[count]G The command number count is fetched. The
default is the first command in the history
list.
/string Search backward through history for a previous
command containing string. 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 null, the
previous string is used.
?string Same as / but search in the forward 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 previous /
command.
Text Modification Edit Commands
These commands modify 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
c[count]motion Move cursor to the character position specified
by motion, deleting all characters between the
original cursor position and new position, 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$.
S Equivalent to cc.
D Delete the current character through end of
line. Equivalent to d$.
[count]dmotion
d[count]motion Move cursor to the character position specified
by motion, deleting all characters between the
original cursor position and new position. 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 the two-character sequence 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 characters on the
screen with characters you type in overlay
fashion.
[count]rc Replace the current character with c.
[count]x Delete current character.
[count]X Delete preceding character.
[count]. Repeat the previous text modification command.
[count]~ Invert the case of the current character and
advance the cursor.
[count]_ Causes the count word of the previous command
to be appended at the current cursor location
and places the editor in input mode at the end
of the appended text. The last word is used if
count is omitted.
* Appends an * to the current word and attempts
file name generation. If no match is found,
the bell rings. If a match is found, the word
is replaced by the matching string and the
command places the editor in input mode.
ESC
\ Attempt file name completion on the current
word. 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.
Other Edit Commands
[count]ymotion
y[count]motion Yank current character through character that
motion would move the cursor to and puts them
into the delete buffer. The text and cursor
are unchanged.
Y Yanks from current position to end of line.
Equivalent to y$.
u Undo the last text modifying command.
U Undo all the text modifying commands performed
on the line.
[count]v Returns the command fc -e ${VISUAL:-${EDITOR:-
vi}} count in the input buffer. If count is
omitted, the current line is used.
^L Line feed and print current line. Has effect
only in control mode.
^J (New line) Execute the current line,
regardless of mode.
^M (Return) Execute the current line, regardless
of mode.
# Equivalent to I# followed by Return. Sends the
line after inserting a # in front of the line
and after each new-line. Useful for inserting
the current command line in the history list
without executing it.
= List the filenames that match the current word
if an asterisk were appended to it.
@letter The user's 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 for processing.
EXTERNAL INFLUENCES
Environment Variables
LC_COLLATE determines the collating sequence used in evaluating
pattern matching notation for file name generation.
LC_CTYPE determines the classification of characters as letters, and
the characters matched by character class expressions in pattern
matching notation.
If LC_COLLATE or LC_CTYPE is not specified in the environment or is
set to the empty string, the value of LANG is used as a default for
each unspecified or empty variable. If LANG is not specified or is
set to the empty string, a default of "C" (see lang(5)) is used
instead of LANG. If any internationalization variable contains an
invalid setting, ksh behaves as if all internationalization variables
are set to "C". See environ(5).
International Code Set Support
Single-byte character code sets are supported.
RETURN VALUE
Errors detected by the shell, such as syntax errors, cause the shell
to return a non-zero exit status. Otherwise, the shell returns the
exit status of the last command executed (also see the exit command
above). If the shell is being used non-interactively, execution of
the shell file is abandoned. Runtime errors detected by the shell are
reported by printing the command or function name and the error
condition. If the line number on which the error occurred is greater
than one, the line number is also printed in brackets ([]) after the
command or function name.
WARNINGS
File descriptors 10 and 54 through 60 are used internally by the Korn
Shell. Applications using these and forking a subshell should not
depend upon them surviving in the subshell or its descendants.
If a command which is a tracked alias is executed, and a command with
the same name is installed in a directory in the search path before
the directory where the original command was found, the shell
continues to load and execute the original command. Use the -t option
of the alias command to correct this situation.
If you move the current directory or one above it, pwd may not give
the correct response. Use the cd command with a full path name to
correct this situation.
Some very old shell scripts contain a caret (^) as a synonym for the
pipe character (|). Note however, ksh does not recognize the caret as
a pipe character.
If a command is piped into a shell command, all variables set in the
shell command are lost when the command completes.
Using the fc built-in command within a compound command causes the
entire command to disappear from the history file.
The built-in command . file reads the entire file before any commands
are executed. Therefore, alias and unalias commands in the file do
not apply to any functions defined in the file.
Traps are not processed while the shell is waiting for a foreground
job. Thus, a trap on CHLD is not executed until the foreground job
terminates.
The export built-in command does not handle arrays properly. Only the
first element of an array is exported to the environment.
Background processes started from a non-interactive shell cannot be
accessed by using job control commands.
In an international environment, character ordering is determined by
the setting of LC_COLLATE, rather than by the binary ordering of
character values in the machine collating sequence. This brings with
it certain attendant dangers, particularly when using range
expressions in file name generation patterns. For example, the
command,
rm [a-z]*
might be expected to match all file names beginning with a lowercase
alphabetic character. However, if dictionary ordering is specified by
LC_COLLATE, it would also match file names beginning with an uppercase
character (as well as those beginning with accented letters).
Conversely, it would fail to match letters collated after z in
languages such as Danish or Norwegian.
The correct (and safe) way to match specific character classes in an
international environment is to use a pattern of the form:
rm [[:lower:]]*
This uses LC_CTYPE to determine character classes and works
predictably for all supported languages and codesets. For shell
scripts produced on non-internationalized systems (or without
consideration for the above dangers), it is recommended that they be
executed in a non-NLS environment. This requires that LANG,
LC_COLLATE, etc., be set to "C" or not set at all.
Be aware that the value of the IFS variable in the user's environment
affects the behavior of scripts.
ksh implements command substitution by creating a pipe between itself
and the command. If the root file system is full, the substituted
command cannot write to the pipe. As a result, the shell receives no
input from the command, and the result of the substitution is null.
In particular, using command substitution for variable assignment
under such circumstances results in the variable being silently
assigned a NULL value.
At HP-UX version B10.10, the history file has a new internal magic
number. This will cause a pre-10.10 history file to be discarded.
Users who use multiple versions of HP-UX that NFS mount the same
directory that contains the history file (usually the home directory)
may want to have a separate history file for each HP-UX version by
setting the HISTFILE parameter as:
HISTFILE=$HOME/.sh_hist_`uname -r`
Users on windowing systems may want to have separate history files for
each window by setting the HISTFILE parameter as follows:
HISTFILE=$HOME/.sh_hist$$
A cron job may be used to expire old history files.
AUTHOR
ksh was developed by AT&T.
FILES
/etc/passwd to find home directories
/etc/profile read to set up system environment
/etc/suid_profile security profile
$HOME/.profile read to set up user's custom environment
/tmp/sh* for here-documents
SEE ALSO
cat(1), cd(1), echo(1), env(1), test(1), umask(1), vi(1), dup(2),
exec(2), fork(2), gtty(2), pipe(2), signal(5), umask(2), ulimit(2),
wait(2), rand(3C), a.out(4), profile(4), environ(5), lang(5),
regexp(5).