sh(1) DG/UX 4.30 sh(1)
NAME
sh, rsh - shell, the command programming language
SYNOPSIS
sh [ -acefhiknrstuvx ] [ args ]
rsh [ -acefhiknrstuvx ] [ args ]
DESCRIPTION
Sh is a command programming language that executes commands
read from a terminal or a file. A file of commands must have
read and execute permissions set in order for you to run
it-see also umask under "Special Commands," below. Rsh is a
restricted version of the standard command interpreter sh;
it sets up login names and execution environments whose
capabilities are more controlled than those of the standard
shell. See "Invocation," below for the meaning of arguments
to the shell. Sh also provides editread, an optional
interface used for editing command lines entered from the
shell. It also provides a history facility that saves
previously typed commands (see Using the DG/UX System for
more information).
Definitions
A blank is a tab or a space. A name is a sequence of
letters, digits, or underscores beginning with a letter or
underscore. A parameter is a name, a digit, or any of the
characters *, @, #, ?, -, $, and ! .
Commands
A simple-command is a sequence of non-blank words separated
by blanks. The first word specifies the name of the command
to be executed. Except as specified below, 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
terminates normally, or (octal) 200+status if it terminates
abnormally (see signal(2) for a list of status values).
A pipeline is a sequence of one or more commands separated
by | (or, for historical compatibility, 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 four symbols, ; and & have equal precedence, which is
lower than that of && and ||. The symbols && and || also
have equal precedence. A semicolon (;) causes sequential
execution of the preceding pipeline; an ampersand (&) causes
Licensed material--property of copyright holder(s) Page 1
sh(1) DG/UX 4.30 sh(1)
asynchronous execution of the preceding pipeline (i.e., the
shell does not wait for that pipeline to finish). The
symbol && (||) executes the list following it only if the
preceding pipeline returns a zero (non-zero) exit status.
An arbitrary number of new-lines may 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 name [ in word ... ] do list done
Each time a for command is executed, name is set to the
next word taken from the in word list. If in word ...
is omitted, the for command executes the do list once
for each positional parameter that is set (see
Parameter Substitution below). Execution ends when
there are no more words in the list.
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
patterns is the same as that used for filename
generation (see "Filename Generation") except that a
slash, a leading dot, or a dot immediately following a
slash need not be matched explicitly.
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,
the if command returns a zero exit status.
while 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; use until
in place of while to negate the loop termination test.
(list)
Execute list in a sub-shell.
{list;}
list is simply executed.
name () {list;}
Licensed material--property of copyright holder(s) Page 2
sh(1) DG/UX 4.30 sh(1)
Define a function referenced by name. The body of the
function is the list of commands between { and }.
Execution of functions is described below (see
"Execution").
The following words are recognized only when they are the
first word of a command and when they are not quoted:
if then else elif fi case esac for while until do done { }
Comments
# before a word causes that word and all the following
characters up to a new-line to be ignored.
Command Substitution
The standard output from a command enclosed in a pair of
grave accents (``) may be used as part or all of a word;
trailing new-lines are removed.
Parameter Substitution
The character $ introduces substitutable parameters. There
are two types of parameters, positional and keyword. If
parameter is a digit, it is positional. Positional
parameters may be assigned values by set. Keyword
parameters (also known as variables) may be assigned values
by writing:
name=value [ name=value ] ...
Pattern-matching is not performed on value. There cannot be
a function and a variable with the same name.
${parameter}
The value, if any, of the parameter is substituted.
The braces are required only when parameter is followed
by a letter, digit, or underscore that is not to be
interpreted as part of its name. If parameter is * or
@, all the positional parameters, starting with $1, are
substituted (separated by spaces). Parameter $0 is set
from argument zero when the shell is invoked.
${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; the
value of the parameter is substituted. Positional
parameters may not be assigned to in this way.
${parameter:?word}
If parameter is set and is non-null, substitute its
Licensed material--property of copyright holder(s) Page 3
sh(1) DG/UX 4.30 sh(1)
value; otherwise, print word and exit from the shell.
If word is omitted, the message "parameter null or not
set" is printed.
${parameter:+word}
If parameter is set and is non-null, substitute word;
otherwise, substitute nothing.
In the above, word is not evaluated unless it is to be used
as the substituted string, so that, 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 whether parameter is set.
The shell sets these parameters automatically:
# 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
synchronously executed command.
$ The process number of this shell.
! The process number of the last background command
invoked.
The following parameters are used by the shell:
HOME The default argument (home directory) for the cd
command.
PATH The search path for commands (see "Execution,"
below). The user may not change PATH if executing
under rsh.
CDPATH
The search path 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 the arrival of mail in
the specified file.
MAILCHECK
This parameter specifies how often (in seconds)
the shell will check for mail in the files
Licensed material--property of copyright holder(s) Page 4
sh(1) DG/UX 4.30 sh(1)
specified by the MAILPATH or MAIL parameters. The
default value is 600 seconds (10 minutes). If set
to 0, the shell will check before each prompt.
MAILPATH
A colon (:) separated list of filenames. If this
parameter is set, the shell informs the user of
the arrival of mail in any of the specified files.
Each filename can be followed by % and a message
that will be printed when the modification time
changes. The default message is you have mail.
PS1 Primary prompt string, by default $ .
PS2 Secondary prompt string, by default > .
IFS Internal field separators, normally space, tab,
and new-line.
SHACCT
If this parameter is set to the name of a file
writable by the user, the shell will write an
accounting record in the file for each shell
procedure executed. Accounting routines such as
acctcom(1) and acctcms(1M) can be used to analyze
the data collected.
SHELL
When the shell is invoked, it scans the
environment (see "Environment," below) for this
name. If it is found and there is an r in the
filename part of its value, the shell becomes a
restricted shell.
The shell gives default values to PATH, PS1, PS2, MAILCHECK
and IFS. HOME and MAIL are set by login(1).
Blank Interpretation
After parameter and command substitution, the results of
substitution are scanned for internal 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.
Filename Generation
Following substitution, each command word is scanned for the
characters *, ?, and [. If one of these characters appears,
the word is regarded as a pattern. The word is replaced
with alphabetically sorted filenames that match the pattern.
If no filename matches the pattern, the word is left
Licensed material--property of copyright holder(s) Page 5
sh(1) DG/UX 4.30 sh(1)
unchanged. The character . at the start of a filename or
immediately following a /, as well as the character /
itself, must be matched explicitly.
* 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 !, any character not enclosed is matched.
Quoting
The following characters have a special meaning to the shell
and terminate a word unless quoted:
; & ( ) | ^ < > new-line space tab
You can make a character stand for itself by preceding it
with a \. This is called quoting. The pair \new-line is
ignored. All characters enclosed between a pair of single
quote marks (''), except a single quote, are quoted. Inside
double quote marks (""), parameter and command substitution
occurs and \ quotes the characters \, `, ", and $. "$*" is
equivalent to "$1 $2 ...", whereas "$@" is equivalent to
"$1" "$2" ....
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 (i.e., the value of PS2) is issued.
Input/Output
Before a command is executed, you can redirect its input and
output using a special notation interpreted by the shell.
The following may appear anywhere in a simple-command or may
precede or follow a command. They are not passed on to the
invoked command; substitution occurs before word or digit is
used:
<word Use file word as standard input (file
descriptor 0).
>word Use file word as standard output (file
descriptor 1). If the file does not exist, it
is created; otherwise, it is truncated to zero
length.
Licensed material--property of copyright holder(s) Page 6
sh(1) DG/UX 4.30 sh(1)
>>word Use file word as standard output. If the file
exists, output is appended to it (by first
seeking to the end-of-file); otherwise, the
file is created.
<<[-]word The shell input is read up to a line that is
the same as word, or to an end-of-file. The
resulting 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, (unescaped)
\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 Use the file associated with file descriptor
digit as standard input. Similarly for the
standard output using >&digit.
<&- The standard input is closed. Similarly for
the standard output using >&-.
Note that when the shell creates a file, the base mode is
666, rather than 777. The mode is then filtered through the
current umask. See umask under "Special Commands," below,
and umask(1).
If any of the above is preceded by a digit, the file
descriptor associated with the file is that specified by the
digit (instead of the default 0 or 1). For example:
... 2>&1
associates file descriptor 2 with the file currently
associated with file descriptor 1.
The order in which redirections are specified is
significant. The shell evaluates redirections from left to
right. For example:
... 1>xxx 2>&1
first associates file descriptor 1 with file xxx. It then
associates file descriptor 2 with xxx. If the order of
redirections were reversed, file descriptor 2 would be
associated with the terminal (assuming file descriptor 1 had
been) and file descriptor 1 would be associated with file
xxx.
Licensed material--property of copyright holder(s) Page 7
sh(1) DG/UX 4.30 sh(1)
If a command is followed by &, 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.
Redirection of output is not allowed in the restricted
shell.
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 shell interacts with the
environment in several ways. On invocation, the shell scans
the environment and creates a parameter for each name found,
giving it the corresponding value. If the user modifies the
value of any of these parameters or creates new parameters,
none of these affects the environment unless the export
command is used to bind the shell's parameter to the
environment (see also set -a). A parameter may be removed
from the environment with the unset command.
The environment seen by any executed command is thus
composed of any unmodified name-value pairs originally
inherited by the shell, minus any pairs removed by unset,
plus any modifications or additions, all of which must be
noted in export commands.
You can augment the environment for any simple-command by
prefixing it with one or more assignments to parameters.
Thus:
TERM=605x cmd
and
(export TERM; TERM=605x; cmd)
are equivalent (as far as the execution of cmd is
concerned).
If the -k flag is set, all keyword arguments are placed in
the environment, even if they occur after the command name.
The following first prints a=b c and c:
echo a=b c
set -k
echo a=b c
Signals
The INTERRUPT and QUIT signals for an invoked command are
ignored if the command is followed by &; otherwise, signals
Licensed material--property of copyright holder(s) Page 8
sh(1) DG/UX 4.30 sh(1)
have the values inherited by the shell from its parent, with
the exception of signal 11. See also the trap command
below.
Execution
Each time a command is executed, the above substitutions are
made. If the command name matches one of the special
commands listed below, it is executed in the shell process.
If the command name does not match a special command but
matches the name of a defined function, the function is
executed in the shell process (note how this differs from
the execution of shell procedures). The positional
parameters $1, $2, .... are set to the arguments of the
function. If the command name matches neither a special
command nor the name of a defined function, a new process is
created and the system tries to execute the command using
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
:/bin:/usr/bin (specifying the current directory, /bin, and
/usr/bin, in that order). Note that the current directory
is specified by a null pathname, which can appear
immediately after the equal sign or between the colon
delimiters anywhere else in the path list.
If the command name contains a /, the search path is not
used; such commands will not be executed by the restricted
shell. Otherwise, each directory in the path is searched
for an executable file. If the file has execute permission
but is not an executable program (binary) file, it is
assumed to be a file containing shell commands. A sub-shell
is spawned to read it. A parenthesized command is also
executed in a sub-shell.
The shell remembers a command's location in the search path
(to avoid having to search through your path again should
you invoke the command again later). If the command was
found in a relative directory, however, its location must be
re-determined whenever the current directory changes. The
shell forgets all remembered locations whenever the PATH
variable is changed or the hash -r command is executed (see
below).
Special Commands
Input/output redirection is now permitted for these
commands. File descriptor 1 is the default output location.
: No effect; the command does nothing. A zero exit code
is returned.
Licensed material--property of copyright holder(s) Page 9
sh(1) DG/UX 4.30 sh(1)
. file
Read and execute commands from file and return. The
search path specified by PATH finds the directory
containing file. You must have read and execute
permission for the file.
break [ n ]
Exit from the enclosing for or while loop, if any. If
n is specified, break n levels.
continue [ n ]
Resume the next iteration of the enclosing for or while
loop. If n is specified, resume at the nth enclosing
loop.
cd [ arg ]
Change the current directory to arg. The shell
parameter HOME is the default arg. The shell parameter
CDPATH defines the search path for the directory
containing arg. Alternative directory names are
separated by a colon (:). The default path is <null>
(specifying the current directory). Note that the
current directory is specified by a null pathname,
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 cd command may not be executed by rsh.
echo [ arg ... ]
Echo arguments. See echo(1) for usage and description.
eval [ arg ... ]
The arguments are read as input to the shell and the
resulting command(s) executed.
exec [ arg ... ]
The command specified by the arguments is executed in
place of this shell without creating a new process.
Input/output arguments may appear and, if no other
arguments are given, cause the shell input/output to be
modified.
exit [ n ]
Causes a 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 will also cause
the shell to exit.
export [ name ... ]
The given names are marked for automatic export to the
environment of subsequently-executed commands. If no
Licensed material--property of copyright holder(s) Page 10
sh(1) DG/UX 4.30 sh(1)
arguments are given, a list of all names that are
exported in this shell is printed. Function names may
not be exported.
hash [ -r ] [ name ... ]
This option is available in DG/UX only. The shell
finds and remembers the location in the search path of
each command specified by name. The -r option makes
the shell forget all remembered locations. If no
arguments are given, information about remembered
commands is presented. Hits is the number of times a
command has been invoked by the shell process. Cost is
a measure of the work required to locate a command in
the search path. Some situations require that the
stored location of a command be recalculated. These
commands are indicated by an asterisk (*) adjacent to
the hits information. Cost is incremented when the
recalculation is done.
limit [ resource [ maximum-use ] ]
Limits resource consumption for each process and each
of its forked processes to no more than maximum-use on
the specified resource. If no maximum-use is given,
the current limit is printed; if no resource is given,
all limitations are given.
Resource is one of the following:
cputime Maximum number of CPU-seconds to be
used by each process.
filesize Largest single file that can be
created.
datasize Maximum growth of the data and
stack for the process beyond the
end of text.
stacksize Maximum size of the stack for the
process.
coredumpsize Size of the largest core dump file
that will be created.
memoryuse Maximum size that a process'
resident set size may grow to.
numopenfiles Maximum number of open files that a
process may have at one time.
Maximum-use can be a number (floating point or integer)
followed by a scale factor.
Licensed material--property of copyright holder(s) Page 11
sh(1) DG/UX 4.30 sh(1)
nk (kilobytes); default for all limits
other than cputime and
numopenfiles.
nm (megabytes); an alternative to
kilobytes for all limits other than
cputime and numopenfiles.
n Default cputime limit in seconds.
nm n minutes for cputime.
nh n hours for cputime.
mm:ss Minutes and seconds for cputime.
newgrp [ arg ... ]
Equivalent to exec newgrp arg .... See newgrp(1).
pwd Print the current working directory. This is a sh
built-in command that is not the same as the /bin/pwd
command discussed in the pwd(1) manual page. The
/bin/pwd program exists for the csh--it does not have a
built-in pwd command.
read [ name ... ]
One line is read from the standard input and the first
word is assigned to the first name, the second word to
the second name, etc., with leftover words assigned to
the last name. The return code is 0 unless an end-of-
file is encountered.
readonly [ name ... ]
The given names are marked readonly and the values of
these names may not be changed by subsequent
assignment. If no arguments are given, a list of all
readonly names is printed.
return [ n ]
Causes a function to exit with the return value
specified by n. If n is omitted, the return status is
that of the last command executed.
set [ --aefhkntuvx [ arg ... ] ]
-a Mark variables that are modified or created for
export.
-e Exit immediately if a command exits with a non-
zero exit status.
-f Disable filename generation.
Licensed material--property of copyright holder(s) Page 12
sh(1) DG/UX 4.30 sh(1)
-h Find and remember function commands as functions
are defined (function commands are normally
located when the function is executed).
-k All keyword arguments are placed in the
environment for a command, not just those that
precede the command name.
-n Read commands but do not execute them.
-t Exit after reading and executing one command.
-u Treat unset variables as an error when
substituting.
-v Print shell input lines as they are read.
-x Print commands and their arguments as they are
executed.
-- Do not change any of the flags; useful in setting
$1 to -.
Using + rather than - turns these flags off. These
flags can also be used upon invocation of the shell.
The current setting of flags may be found in $-. The
remaining arguments are positional parameters and are
assigned, in order, to $1, $2, .... If no arguments
are given, the values of all names are printed.
shift [ n ]
The positional parameters from $n+1 ... are renamed $1
.... If n is not given, it is assumed to be 1.
test
Evaluate conditional expressions. See test(1) for usage
and description.
times
Print the accumulated user and system times for
processes run from the shell.
trap [ arg ] [ n ] ...
Read and execute the command arg when the shell
receives signal(s) n. (Note that arg is scanned once
when the trap is set and once when the trap is taken.)
Trap commands are executed in order of signal number.
Any attempt to set a trap on a signal that was ignored
on entry to the current shell is ineffective. An
attempt to trap on signal 11 (memory fault) or signal
18 (termination of child process) produces an error.
If arg is absent, all trap(s) n are reset to their
Licensed material--property of copyright holder(s) Page 13
sh(1) DG/UX 4.30 sh(1)
original values. If arg is the null string, this
signal is ignored by the shell and by the commands it
invokes. If n is 0, 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.
type [ name ... ]
For each name, indicate how it would be interpreted if
used as a command name.
ulimit [ -f ] [ n ]
-f Imposes a size limit of n blocks on files written
by child processes (files of any size may be
read). With no argument, the current limit is
printed.
If no option is given, -f is assumed.
umask [ nnn ]
The user file-creation mask is set to nnn (see
umask(2)). If nnn is omitted, the current value of the
mask is printed. Note that the shell and any programs
running under the shell, like ed(1), create files with
a maximum permission of 666, even if you set the mask
to 000. The mask value is subtracted from 777 to
arrive at the final mode, however. A mask of 012 yields
a mode of 665, for example. You must use chmod to add
the execution permission. This is especially important
if you are creating a shell program, since it must have
read and execute permissions in order to run.
unlimit [ resource ]
If no resource is specified, all resource limitations
are removed. (Refer to the limit command for
information on resource names.) Otherwise, it removes
the limitation on the specified resource.
unset [ name ... ]
For each name, remove the corresponding variable or
function. The variables PATH, PS1, PS2, MAILCHECK and
IFS cannot be unset.
wait [ n ]
Wait for the specified process and report its
termination status. If n is not given, all currently
active child processes are waited for and the return
code is zero.
Invocation
If the shell is invoked through exec(2) and the first
Licensed material--property of copyright holder(s) Page 14
sh(1) DG/UX 4.30 sh(1)
character of argument zero is -, commands are initially read
from /etc/profile and from $HOME/.profile, if such files
exist. Thereafter, commands are read as described below,
which is also the case when the shell is invoked as /bin/sh.
The flags below are interpreted by the shell on invocation
only. Unless the -c or -s flag is specified, the first
argument is assumed to be the name of a file containing
commands, and the remaining arguments are passed as
positional parameters to that command file:
-c string Commands are read from string.
-s If no arguments remain, commands are read from
the standard input. Any remaining arguments
specify the positional parameters. Shell
output (except for Special Commands) is written
to file descriptor 2.
-i If the shell input and output are attached to a
terminal, this shell is interactive. In this
case TERMINATE is ignored (so that kill 0 does
not kill an interactive shell) and INTERRUPT is
caught and ignored (so that wait is
interruptible). In all cases, QUIT is ignored
by the shell.
-r The shell is a restricted shell.
The remaining flags and arguments are described under the
set command above.
Rsh Only
Rsh sets up login names and execution environments that are
more controlled than those of the standard shell. Rsh is
identical to sh, except that the following are disallowed:
changing directory (see cd(1))
setting the value of $PATH and $SHELL
specifying command names containing /
redirecting output (> and >>)
The restrictions above are enforced after .profile is
interpreted.
When a command to be executed is a shell procedure, rsh
invokes sh to execute it. Thus, you can give procedures to
the end-user shell that have access to the full power of the
standard shell, while imposing a limited menu of commands;
this scheme assumes that the end-user does not have write
and execute permissions in the same directory.
The net effect of these rules is to give the writer of the
Licensed material--property of copyright holder(s) Page 15
sh(1) DG/UX 4.30 sh(1)
.profile complete control over user actions, by performing
guaranteed setup actions and leaving the user in an
appropriate directory (probably not the login directory).
The system administrator often sets up a directory of
commands (i.e., /usr/rbin) that can be safely invoked by
rsh. Some systems also provide a restricted editor red.
EXIT STATUS
Errors detected by the shell, such as syntax errors, cause
the shell to return a non-zero exit status. If the shell is
being used non-interactively, execution of the shell file is
abandoned except under special conditions:
The "echo" and "pwd" built-in commands have
counterparts in the /bin directory. If you use
/bin/echo or /bin/pwd in a shell script rather than the
built-in echo or bin, execution of the script will
continue after an error.
Otherwise, the shell returns the exit status of the last
command executed (see also the exit command above).
FILES
/etc/profile
$HOME/.profile
/tmp/sh*
/dev/null
SEE ALSO
acctcom(1), cd(1), echo(1), env(1), login(1), newgrp(1),
test(1), umask(1).
acctcms(1M) in the System Manager's Reference for the DG/UX
System
dup(2), exec(2), fork(2), pipe(2), signal(2), ulimit(2),
umask(2), wait(2), a.out(4), profile(4), environ(5) in the
Programmer's Reference for the DG/UXTM System
See Using the DG/UXTM System for complete information on
using the Bourne shell.
WARNINGS
If a command 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 execute (with exec) the original command. Use
the hash 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 pathname to correct this situation.
Licensed material--property of copyright holder(s) Page 16