SH

Section: Misc. Reference Manual Pages (1L)
Updated: Data Logic Limited
Index Return to Main Contents
 

NAME

sh, rsh - shell, the standard/restricted command programming language  

SYNOPSIS

sh [ -acefhiknmrstuvx0 ] [ args ]
rsh [ -acefhiknmrstuvx0 ] [ args ]  

DESCRIPTION

Sh is a command programming language that executes commands read from a terminal or a file. Rsh is a restricted version of the standard command interpreter sh; it is used to set 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.  

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 ;. Of these three symbols, ; has a lower precedence than that of && and ||. The symbols && and || also have equal precedence. A semicolon (;) causes sequential execution of the preceding pipeline. The symbol && (||) causes the list following it to be executed 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, then 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 file-name generation (see File Name Generation) except that a slash, a leading dot, or a dot immediately following a slash need not be matched explicitly, and the match is case sensitive.
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, then 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, then the while command returns a zero exit status; until may be used in place of while to negate the loop termination test.
(list)

Execute list in a sub-shell. The shell creates a new environment in which to execute the list, but does not fork a sub-shell as a Unix system would. The original environment is restored on completion.
{ list; }

list is simply executed.
name () { list; }
Define a function which is 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 only recognized as the first word of a command and when not quoted:

if then else elif fi case esac for while until do done { }  

Comments

A word beginning with # causes that word and all the following characters up to a new-line to be ignored.  

Tilde Substitution

Each word is checked to see if it begins with an unquoted~. If it is, the ~ is replaced by the value of the HOME parameter.   
 

Command Substitution

The standard output from a command enclosed in parenthesis preceded by a dollar sign ($()), or 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 $ is used to introduce substitutable parameters. There are two types of parameters, positional and keyword. If parameter is a digit, it is a positional parameter. 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}
If parameter is * or @, the number of positional parameters is substituted. Otherwise, the length of the value of the parameter is substituted.
${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 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.
${parameter#pattern}
${parameter##pattern} If the Shell pattern matches the beginning of the value of parameter, then 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 first form the smallest matching pattern is deleted and in the latter form the largest matching pattern is deleted.
${parameter%pattern}
${parameter%%pattern} If the Shell pattern matches the end of the value of parameter, then 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 first form the smallest matching pattern is deleted and in the latter form the largest matching pattern is deleted.

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 or not (It is not clear what this means).

The following parameters are automatically set by the shell:

#
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 shell reserves all variables beginning with a ~ for its own internal use and these variables cannot be accessed by the user.

The following parameters are used by the shell:

CDPATH
The search path for the cd command. (Note that because a colon is used by MSDOS to indicate a drive, a semi-colon is used to separate the path names instead of a colon - this implies that the CDPATH variable must be set using single or double quotes to surround the value).
COMSPEC
When the shell has to process an MSDOS .bat file, it expects the file indicated by the value of this environment variable to be an executable program capable of processing the MSDOS .bat file. The program is invoked with the arguments /c bat_file_name.
EXTENDED_LINE
This parameter defines a file containing a list of command which can accept an Extended Command Line using the indirect command file character @. When a command which can process the Extended Command Line finds a parameter starting with a @ in the command list, treats the rest of the parameter as a file and reads the parameters from that file. Examples of this functionality include the Standard Linker and Librarian. The filename defined by EXTENDED_LINE contains a list of command (including the .exe or .com extension) separated by a newlines. If the command is in upper case, the file name on the command line is set up with backslashes as the directory separator. Otherwise, slashes (Unix style) are used. This functionality allows the user to get round the 127 byte command line length limit of MSDOS.
HISTFILE
The file where command history is saved across login sessions. The default value is $HOME/history.sh.
HOME
The default argument (home directory) for the cd command.
IFS
Internal field separators, normally space, tab, and new-line.
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 the arrival of mail in the files specified by the MAILPATH or MAIL parameters. If set to 0, the shell will check before each prompt.
MAILPATH
A semi-colon (;) separated list of file names. If this parameter is set, the shell informs the user of the arrival of mail in any of the specified files. Each file name can be followed by % and a message that will be printed when the modification time changes. The default message is "you have mail".
PATH
The search path for commands (see Execution below). The user may not change PATH if executing under rsh. (Note that because a colon is used by MSDOS to indicate a drive, a semi-colon is used to separate the path names instead of a colon - this implies that the PATH variable must be set using single or double quotes to surround the value). The Shell automatically converts Unix format PATH assignments to MSDOS format when appropriate. A assignment is converted if there are no semi-colons, no backslashes and one or more colons. If there is only one colon, it must not be the second character of the new value.
PS1
Primary prompt string, by default ``$ ´´.
PS2
Secondary prompt string, by default ``> ´´.
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 file name part of its value, the shell becomes a restricted shell. The shell also uses this variable to decide which program to spawn to interpret shell scripts (see Execution below).
TMP
The location of temporary files created by the shell. If this variable is not defined, the Shell uses the HOME directory for temporary files. Failing that, the root directory of the current drive is used.

The shell gives default values to PATH, PS1, PS2, SHELL, HOME and IFS.

 

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.  

File Name 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 file names that match the pattern. If no file name is found that matches the pattern, the word is left unchanged. The character . at the start of a file name or immediately following a /, as well as the character / itself, must be matched explicitly. When matching patterns for file names, the shell ignores the case of the pattern and the file directory entries. Generated file names are always in lower case.

*
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.

If the shell has to open or create the file /dev/tty or /dev/null (which are Unix special files), they are converted to the equivalent MSDOS file names (/dev/con and /dev/nul respectively). Any user programs which could expect /dev/tty or /dev/null as arguments must do its own mapping to the MSDOS equivalents.  

Quoting

The following characters have a special meaning to the shell and cause termination of a word unless quoted:

; & ( ) | ^ < > new-line space tab

A character may 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 (´´), 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.

Many people like to have the shell provide them with useful information in their prompt. To accommodate this, the shell recognises special sequences of characters in the values of PS1 and PS2, and substitutes the appropriate information for them. The special sequences and what they signify are:

%d
Place the current date, in the form DAY DD-MM-YY into the prompt.
%e
Place the current event number (as defined by the history command) into the prompt. If history evaluation has been turned off (via history -d), no number will be substituted in (i.e. the %e will be removed).
%n
Place the current working drive into the prompt.
%p
Place the current working directory into the prompt.
%t
Place the current time of day, in the form HH:MM into the prompt. The time is on a 24 hour clock, i.e. 1:30 in the afternoon will be 13:30.
%v
Place the MSDOS version number, in the form MSDOS MM:MM into the prompt.
%%
Place the character % into the prompt.
\xxx
Place the character \xxx into the prompt. The processing of escape sequences is the same as that for echo.

Some of these facilities are of more use than others.  

Input/Output

Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell. The following may appear anywhere in a simple-command or may precede or follow a command and 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.
>>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 >&-.
n<>word
causes the file word to be opened on file descriptor n for both reading and writing. The file must already exist.

If any of the above is preceded by a digit, the file descriptor which will be 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 left-to-right. For example:

... 1>xxx 2>&1

first associates file descriptor 1 with file xxx. It associates file descriptor 2 with the file associated with file descriptor 1 (i.e. 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 .

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.

The environment for any simple-command may be augmented by prefixing it with one or more assignments to parameters. Thus:

TERM=450 cmd args                      and

(export TERM; TERM=450; cmd args)

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 have the values inherited by the shell from its parent, with the exception of signal 11 (but see also the trap command below).  

History

When reading input from an interactive terminal, a ``!´´ at the start of a line signals to the shell that it should attempt to perform a history subsitution. A history subsitution is a short-hand method which allows the user to recall a previous command for execution or editing. The recalled command is placed in the command line for editing or passing to the rest of the shell for normal processing. A history substitution takes the form:

! [ ! | str | num ] terminator

!! will place the previous command in the command line. !num will place the history command with the specified number in the command line. !str will find the most recent command line that started with the characters in str.

The terminator determines what action is performed after the history line has been found. If the original history command is entered using the <return> key, the new command line is passed directly to the shell. If the <end> key is pressed, the new command line can be edited in the manner described below.  

Command Line Editing

When reading input from an interactive terminal, certain keystrokes allow the current input line to be edited. The following keystrokes corresponding to the following functions are defined in the initialisation file sh.ini. The keywords in the initialisation file which provide the functions are listed below:
Right
Move the cursor right one character
WordRight
Move the cursor right one word
Left
Move the cursor left one character
WordLeft
Move the cursor left one word
Previous
Get the previous command from the history file
Next
Get the next command from the history file
Insert
Toggle insert/overwrite mode (note the shape of the cursor changes to indicate the current mode)
DeleteRight
Delete the current character unless the cursor is at the end of line when no action is taken
Start
Move the cursor to the start of the command
Complete
Attempt to complete the filename. The shell attempts to complete the file name at the current cursor position. The file name is delimited by white space characters. If the shell is unable to complete the file name (ie no match can be found in the appropriate directory), the bell is rung. If a single match is found, the new file name is displayed. If multiple matches are found, the file name is replaced by the longest non-unique part of the file name and the bell is rung.
End
Move the cursor to the end of the command, unless the first character of the command is a !, in which case the appropriate history search is done. The cursor is placed at the end of the command line.
Flush
Delete to the end of the line
ScanBackward
Search backwards from the current history command for the next match against the last history request or the string currently in the command line if there has been no previous history request.
ScanForeward
Search forewards from the current history command for the next match against the last history request or the string currently in the command line if there has been no previous history request.
Clear
Erase the complete line.
Directory
Display the file name list matching the partially entered file name under the cursor. If no matches are found the bell is rung. To display the whole directory, enter the directory name followed by a slash /. After the directory listing has been displayed, the entered command line is redisplayed.
DeleteLeft
Delete the character to the left of the cursor.
Return
Execute the command line, unless the first character of the command is a !, in which case the appropriate history processing is done. This is the actual key pressed and cannot be modified by the initialisation file.
 

Initialisation File

When the shell is run in interactive mode, the Command Line Editing keys and other user configuration parameters are read from the initialisation file sh.ini. This shell looks for this file in the same directory as the sh executable which is running. It does not use the SHELL environment variable or search the directories in the PATH environment variable. At present, there are two types of entry in this file: keyboard configuration; and others. The entry is contained in a single line and consists of a keyword (in upper or lower case), white space, an equals symbols, white space and one or two numeric values (see strtol for valid formats where base parameter is zero), followed by an end of line character.

For the keyboard entries, the numeric values give the MSDOS Function 8 (Console Input without Echo) return values for that entry. Note that extended codes (function keys) require two calls to this function. The first call returns zero and the second the extended code. In the configuration file, a first numeric value of zero indicates a extended code and must be followed by a second value. A non-zero first numeric value must not be followed by anything else on the line.

Other entries must only have one numeric value. A zero value disables the function and a non-zero value enables the function. At present, there are two other functions:

Bell
Enable/disable warning bells
HalfHeight
Use full or halfheight block cursor to indicate Insert mode

Invalid lines or lines beginning with a # are ignored.

The following table gives the list of valid keywords and their default values:
KeywordFirst numericSecond numericActual Key

KEYBOARD ENTRIES
ScanBackward00x49PAGE UP
ScanForeward00x51PAGE DOWN
Previous00x48UP ARROW
Next00x50DOWN ARROW
Left00x4bLEFT ARROW
Right00x4dRIGHT ARROW
WordRight00x74Control RIGHT ARROW
WordLeft00x73Control LEFT ARROW
Start00x47HOME
Clear00x76Control PAGE DOWN
Flush00x75Control END
End00x4fEND
Insert00x52INSERT
DeleteRight00x53DELETE
DeleteLeft0x08BACKSPACE
Complete00x77Control HOME
Directory00x0fShift TAB

OTHER FUNCTIONS
Bell0
HalfHeight0
 

Execution

Each time a command is executed, the above substitutions are carried out. 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 an attempt is made to execute the command via exec(2).

The shell parameter PATH defines the search path for the directory containing the command. Alternative directory names are separated by a semi-colon (;). The default path is ;c:/bin;c:/usr/bin (specifying the current directory, c:/bin, and c:/usr/bin, in that order). Note that the current directory is specified by a null path name, which can appear immediately after the equal sign or between the semi-colon delimiters anywhere else in the path list. If the command name contains a / or starts with x: (where x is a drive letter) 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. Executable files are indicated by a .exe or .com extension. This extension is automatically supplied by the shell and not have to be entered by the user.

If the file with a .com or .exe extension cannot be found in the directory, the file is opened and first 512 characters are read. If there are no characters in the block with a value in the range 0 to 7, the file is assumed to be a script file containing shell commands. Note that the shell will check the file and if that file does not exist or is not a script, it will try the file with an extension of .sh. If a .sh file is found, that will be processed. A sub-shell (given by the environment variable SHELL) is spawned to read it.

If the script file starts with the a line of the form #! interpreter [arguments], the interpreter is invoked instead of the shell to process the script. Optional arguments can be supplied in the script file which are passed before the name of the script file. Thus, if the file demo contained the following string as the first line

#! perl -sP

Entering demo name would be equivalent to entering the perl -sP name at the command prompt. Note that no other processing of the first line other that the separation (by white space) into arguments is done.

If none of the above conditions for a executable file are detected and a file with a .bat extension exists in the directory, the command processor given by the COMSPEC environment variable is spawned to process the file. This is normally the standard MSDOS command.com processor.

A parenthesized command is also executed in a sub-shell.  

Special Commands

Input/output redirection is permitted for these commands. File descriptor 1 is the default output location.

:
No effect; the command does nothing. A zero exit code is returned.
letter:
Select the drive specified by letter.
. file
Read and execute commands from file and return. The search path specified by PATH is used to find the directory containing file.
break [ n ]
Exit from the enclosing for or while loop, if any. If n is specified, break n levels.
builtin [ args ... ]
Force the selection of the builtin version of a command. The builtin shell command selected by the first args value is executed with the parameters defined by the remaining argss. If no arguments are given, a list of all builtin commands is printed.

If the first argument is one of the following, the processing of the builtin command in the following arguments are changed as indicated:

-a
Set the following builtin commands to use builtin version in preference to any function or external versions.
-d
Set the following builtin commands to use the function or external version in preference to the builtin version.
-s
Display the current status of the following builtin commands.
continue [ n ]
Resume the next iteration of the enclosing for or while loop. If n is specified, resume at the n-th 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 semi-colon (;). The default path is <null> (specifying 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 semi-colon delimiters anywhere else in the path list. If arg begins with a / or x: (where x is a drive letter), 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. Echo writes its arguments separated by blanks and terminated by a new-line on the standard output. It also understands C-like escape conventions; beware of conflicts with the shell's use of \:

\b
backspace
\c
print line without new-line
\f
form-feed
\n
new-line
\r
carriage return
\t
tab
\v
vertical tab
\\
backslash
\n
the 8-bit character whose ASCII code is the 1-, 2- or 3-digit octal number n, which must start with a zero.

Echo is useful for producing diagnostics in command files and for sending known data into a pipe.

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 arguments are given, a list of all names that are exported in this shell is printed. Function names may not be exported.
getopt optstring name [ args ... ]
Parse command options and write them to standard output. Getopt is used to break up options in command lines for easy parsing by shell procedures and to check for legal options. Optstring is a string of recognized option letters (see getopt(3C)); if a letter is followed by a colon, the option is expected to have an argument which may or may not be separated from it by white space. The special option -- is used to delimit the end of the options. If it is used explicitly, getopt will recognize it; otherwise, getopt will generate it; in either case, getopt will place it at the end of the options. Each option is preceded by a - and is in its own positional parameter; each option argument is also parsed into its own positional parameter.

The following code fragment shows how one might process the arguments for a command that can take the options a or b, as well as the option o, which requires an argument:

set -- `getopt abo: $*`
if [ $? != 0 ]
then
     echo $USAGE
     exit 2
fi
for i in $*
do
     case $i in
     -a | -b)  FLAG=$i; shift;;
     -o)       OARG=$2; shift 2;;
     --)       shift; break;;
     esac
done

This code will accept any of the following as equivalent:

cmd -aoarg file file
cmd -a -o arg file file
cmd -oarg -a file file
cmd -a -oarg -- file file
history [ -dei ]
The history command, with no arguments, will print all the commands that are currently saved in the shell's history buffers. As new commands are executed, and space in the buffers runs out, old commands will be deleted. The history commands prints out the stored commands with sequence numbers. Negative numbered commands, through command number zero, are commands that were retrieved from the saved history file. Commands starting at one were entered during the current login session. If a saved command contains embedded newlines, these will be printed out as the sequence \n, so that individual command stay on one line.

The arguments changes the way the shell processes history information as follows:

-d
Disable the saving of commands in the history file.
-e
Enable the saving of commands in the history file.
-i
Initialise the history file.
msdos [ name ... ]
The given names are marked msdos format and if the -m flag is set, the values of the these names are exported to child processes with any slashes in the value replaced by backslashes. If no arguments are given, a list of all msdos names is printed.
pwd
Print the current working directory.
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 the 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 [ --aefkmntuvx [ arg ... ] ]
-a
Mark variables which are modified or created for export.
-e
Exit immediately if a command exits with a non-zero exit status.
-f
Disable file name generation
-k
All keyword arguments are placed in the environment for a command, not just those that precede the command name.
-m
For those variables marked as msdos variables, the values are exported to child processes with the slashes replaced by backslashes. Most MSDOS utilities do not care if a file name contains a slash or backslash as a directory separator. However, some like the linker require backslashes in the value of the LIB variable.
-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 - causes these flags to be turned off. These flags can also be used upon invocation of the shell. The current set 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.
swap [ options ]
This command defines how the shell will handle swapping. The options are
off
Disable swapping. The shell remains in memory whilst the child is running and reduces the available memory by about 200K (depending on the size of the environment and history).
on
Enable all devices. The shell will swap out to either expanded or extended memory or to disk, execute the command and then swap back in. Whilest swapped, the shell reduces the available memory by about 3K.
expand
Enable swapping to Expanded Memory. The EMS driver must exist on your system for this to work.
extent [ start address ]
Enable swapping to Extended Memory. If you have an XMS driver on your system, the shell will use the XMS driver. Otherwise, the BIOS Interrupt 15 interface is used. The optional start address defines the based address in the Extended Memory at which point the shell writes its swap area when the BIOS interface is used. The default location is 0x100000.
disk
Enable swapping to disk. The shell creates a temporary file and saves itself in it. On completion, the file is deleted. This is the slowest method of swapping.

With no options, the current swapping options are displayed.

test expr or [ expr ]
Evaluate conditional expressions. Test evaluates the expression expr and, if its value is true, returns a zero (true) exit status; otherwise, a non-zero (false) exit status is returned; test also returns a non-zero exit status if there are no arguments. The following primitives are used to construct expr:
-r file
true if file exists and is readable.
-w file
true if file exists and is writable.
-x file
true if file exists and is executable.
-f file
true if file exists and is a regular file.
-d file
true if file exists and is a directory.
-c file
true if file exists and is a character special file.
-b file
true if file exists and is a block special file.
-s file
true if file exists and has a size greater than zero.
-t [ fildes ]
true if the open file whose file descriptor number is fildes (1 by default) is associated with a terminal device.
-z s1
true if the length of the string s1 is zero.
-n s1
true if the length of the string s1 is non-zero.
s1 = s2
true if strings s1 and s2 are identical.
s1 != s2
true if strings s1 and s2 are not identical.
s1
true if s1 is not the null string.
n1 -eq n2
true if the integers n1 and n2 are algebraically equal. Any of the comparisons -ne, -gt, -ge, -lt, and -le may be used in place of R-eq.

These primaries may be combined with the following operators:

!
unary negation operator.
-a
binary and operator.
-o
binary or operator (-a has higher precedence than -o).
( expr )
parentheses for grouping.

Notice that all the operators and flags are separate arguments to test. Notice also that parentheses are meaningful to the shell and, therefore, must be escaped.

trap [ arg ] [ n ] ...
The command arg is to be read and executed 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) produces an error. If arg is absent all trap(s) n 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 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.
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.
unset [ name ... ]
For each name, remove the corresponding variable or function. The variables PATH, PS1, PS2, and IFS cannot be unset.
ver
Display the current version of the shell.

 

Invocation

If the shell is invoked through exec(2) and the first character of argument zero is - or the -0(zero) switch is in the invokation line, commands are initially read from /etc/profile.sh and from $HOME/profile.sh, 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; Note that 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
If the -c flag is present commands are read from string.
-s
If the -s flag is present or 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 -i flag is present or if the shell input and output are attached to a terminal, this shell is interactive. In this case, the TERMINATE signal is ignored and the INTERRUPT signal is caught and ignored. In all cases, the QUIT signal is ignored by the shell.
-r
If the -r flag is present, the shell is a restricted shell.
-0(zero)
If the -0(zero) flag is present, this has the same effect as starting the shell with the first character of argument zero as a - (see above).

The remaining flags and arguments are described under the set command above.  

Rsh Only

Rsh is used to set up login names and execution environments whose capabilities are more controlled than those of the standard shell. The actions of rsh are identical to those of sh, except that the following are disallowed:

changing directory (see cd(1)),
setting the value of $PATH
specifying path or command names containing /,
redirecting output (> and >>).

The restrictions above are enforced after profile.sh is interpreted.

When a command to be executed is found to be a shell procedure, rsh invokes sh to execute it. Thus, it is possible to provide to the end-user shell procedures 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 that the writer of the profile.sh has 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. Otherwise, the shell returns the exit status of the last command executed (see also the exit command above).  

FILES

/etc/profile.sh
$HOME/profile.sh
$TMP/sh*
??/sh.ini  

CRITICAL ERRORS

The Shell provide a Critical Error Handler (Interrupt 24) similar to the standard MSDOS handler. In addition to the standard message, the handler also displays the Extended Error Code information in hexadecimal.  

LIMIITATIONS

Any TSR (Terminate Stay Resident) programs must be loaded before loading Sh as the shell will overwrite the TSR when it reloads itself after swapping out.  

SEE ALSO

cd(1), env(1), test(1), umask(1).
dup(2), exec(2), pipe(2), signal(2), umask(2), wait(2), strtol(3), profile(4), environ(5) in the UNIX System Programmer Reference Manual.


 

Index

NAME
SYNOPSIS
DESCRIPTION
Definitions
Commands
Comments
Tilde Substitution
Command Substitution
Parameter Substitution
Blank Interpretation
File Name Generation
Quoting
Prompting
Input/Output
Environment
Signals
History
Command Line Editing
Initialisation File
Execution
Special Commands
Invocation
Rsh Only
EXIT STATUS
FILES
CRITICAL ERRORS
LIMIITATIONS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 19:05:03 GMT, January 30, 2023