.\" .\" Copyright (c) 2003-2007 .\" Jeffrey Allen Neitzel . .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY JEFFREY ALLEN NEITZEL ``AS IS'', AND ANY .\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE .\" DISCLAIMED. IN NO EVENT SHALL JEFFREY ALLEN NEITZEL BE LIABLE FOR ANY .\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES .\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; .\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED .\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, .\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE .\" USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" @(#)$Id: osh.1 32 2007-03-05 04:30:43Z jneitzel $ .\" .\" Derived from: Sixth Edition Unix /usr/man/man1/sh.1 .\" .\" Copyright (C) Caldera International Inc. 2001-2002. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code and documentation must retain the above .\" copyright notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed or owned by Caldera .\" International, Inc. .\" 4. Neither the name of Caldera International, Inc. nor the names of other .\" contributors may be used to endorse or promote products derived from .\" this software without specific prior written permission. .\" .\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA .\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, .\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES .\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR .\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, .\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING .\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" .TH OSH 1 "March 5, 2007" "@OSH_VERSION@" "General Commands" .SH NAME osh \- old shell (command interpreter) .SH SYNOPSIS .B osh [\fB\-\fR | \fB\-c\fR \fIstring\fR | \fB\-t\fR | \fIfile\fR [\fIarg1 ...\fR]] .SH DESCRIPTION .I Osh is an enhanced, backward-compatible port of the standard command interpreter from Sixth Edition Unix. It may be used either as an interactive shell or as a non-interactive shell. Throughout this manual, `(+)' indicates those cases where .I osh is known to differ from the original .IR sh (1), as it appeared in Sixth Edition Unix. .PP The options are as follows: .TP .B \- The shell reads and executes command lines from the standard input until end-of-file or .BR exit . .TP .BI \-c \ string The shell executes .I string as a command line and exits. .TP .B \-t The shell reads a single line from the standard input, executes it as a command line, and exits. .PP The shell may also be invoked non-interactively to interpret a command file, which is specified by .I file and optionally followed by any number of positional parameters (see .I "Parameter substitution" below). .PP Otherwise, if no arguments are specified and if both the standard input and standard error are connected to a terminal, the shell is interactive. An interactive shell prompts the user with a `%\ ' (or `#\ ' for the superuser) before reading each command line from the terminal. .PP (+) Whenever an interactive shell starts, it first tries to execute commands from the appropriate initialization file(s) before reading command lines from the terminal (see .I "Initialization" below). .SS Commands Each command is a sequence of non-blank command arguments separated by blanks (spaces or tabs). The first argument specifies the name of a command to be executed. Except for certain types of special arguments described below, the arguments other than the command name are passed without interpretation to the invoked command. .PP If the first argument names a special command, the shell executes it (see .I "Special commands" below). Otherwise, the shell treats it as an external command, which is located as follows. .PP (+) If the command name contains no `/' characters, the sequence of directories in the environment variable PATH is searched for the first occurrence of an executable file by that name, which the shell attempts to execute. However, if the command name contains one or more `/' characters, the shell attempts to execute it without performing any PATH search. .PP If an executable file does not begin with the proper magic number or a `#!shell' sequence, it is assumed to be a shell command file, and a new shell is automatically invoked to execute it. (+) The environment variable EXECSHELL specifies the shell which is invoked to execute such a file. .PP If a command cannot be found or executed, a diagnostic is printed. .SS Command lines Commands separated by `|' or `^' constitute a chain of .IR filters , or a .IR pipeline . The standard output of each command but the last is taken as the standard input of the next command. Each command is run as a separate process, connected by pipes (see .IR pipe (2)) to its neighbors. .PP A .IR "command line" , or .IR list , consists of one or more pipelines separated, and perhaps terminated by `;' or `&'. The semicolon designates sequential execution. The ampersand designates asynchronous execution, which causes the preceding pipeline to be executed without waiting for it to finish. The process ID of each command in such a pipeline is reported, so that it may be used if necessary for a subsequent .IR kill (1). .PP A list contained within parentheses such as `(\ list\ )' is executed in a subshell and may appear in place of a simple command as a filter. .PP If a command line is syntactically incorrect, a diagnostic is printed. .SS Termination reporting All terminations other than exit and interrupt are considered to be abnormal. If a sequential process terminates abnormally, a message is printed. The termination report for an asynchronous process is given upon execution of the first sequential command subsequent to its termination, or when the .B wait special command is executed. The following is a list of the possible termination messages: .PP .nf Hangup Quit Illegal instruction Trace/BPT trap IOT trap EMT trap Floating exception Killed Bus error Memory fault Bad system call .fi .PP For an asynchronous process, its process ID is prepended to the appropriate message. If a core image is produced, `\ \-\-\ Core\ dumped' is appended to the appropriate message. .SS I/O redirection Each of the following argument forms is interpreted as a .I redirection by the shell itself. Such a redirection may appear anywhere among the arguments of a simple command, or before or after a parenthesized command list, and is associated with that command or command list. .PP A redirection of the form `arg' causes the file `arg' to be used as the standard output (file descriptor 1) for the associated command. If `arg' does not already exist, it is created; otherwise, it is truncated at the outset. .PP A redirection of the form `>>arg' is the same as `>arg', except if `arg' already exists the command output is always appended to the end of the file. .PP For example, either of the following command lines: .PP .nf % date >dirlist; pwd >>dirlist; ls \-l >>dirlist % ( date; pwd; ls \-l ) >dirlist .fi .PP creates on the file `dirlist', the current date and time, followed by the name and a long listing of the current working directory. .PP (+) A `<\-' redirection causes input for the associated command to be redirected from the standard input which existed when the shell was invoked. This allows a command file to be used as a filter. .PP A `>arg' or `>>arg' redirection associated with any but the last command of a pipeline is ineffectual, as is a `', and others described in this manual. If such characters are quoted, they represent themselves and may be passed as part of arguments. .PP A .I backslash (\\) quotes, or .IR escapes , the next individual character. A backslash followed by a newline is a special case which allows the continuation of commands onto more than one line. Each backslash-newline sequence in the input is translated into a blank. .PP Individual characters, and sequences of characters, are also quoted when enclosed by a matched pair of .I double (") or .I single (') quotes. For example: .PP .nf % awk '{print NR "\\t" $0}' README ^ more .fi .PP causes .IR awk (1) to write each line in `README', preceded by its line number and a tab, to the standard output which is piped to .IR more (1) for viewing. The quotes prevent the shell from trying to interpret any part of the string, which is then passed as a single argument to awk. .PP If a double or single quote appears but is not part of a matched pair, a diagnostic is printed. .SS Parameter substitution When the shell is invoked as a non-interactive command, it has additional string processing capabilities which are not available when it is interactive. A non-interactive shell may be invoked as follows: .PP .nf \fBosh\fR \fIname\fR [\fIarg1 ...\fR] .fi .PP If the first character of .I name is not `\-', it is taken as the name of a .IR "command file" , or .IR "shell script" , which is opened as the standard input for a new instance of the shell. Thus, the new shell reads and interprets command lines from the named file. .PP Otherwise, .I name is taken as one of the shell options, and a new instance of the shell is invoked to read and interpret command lines from its standard input. However, notice that the .B \-c option followed by a .I string is the one case where the shell does not read and interpret command lines from its standard input. Instead, the string itself is taken as a command line and executed. .PP In each command line, an unquoted character sequence of the form `$N', where .I N is a digit, is treated as a .I "positional parameter" by the shell. Each occurrence of a positional parameter in the command line is substituted with the value of the \fIN\fRth argument to the invocation of the shell (\fIargN\fR). `$0' is substituted with .IR name . .PP In both interactive and non-interactive shells, `$$' is substituted with the process ID of the current shell. The value is represented as a 5-digit ASCII string, padded on the left with zeros when the process ID is less than 10000. .PP (+) Interactive and non-interactive shells also attempt to set the following special parameters. `(*)' indicates those parameters which are always set; otherwise, the parameter is unset when the shell cannot determine its value. .TP 10 $d The value of the environment variable OSHDIR. .TP $e The value of the environment variable EXECSHELL. .TP $h The value of the environment variable HOME. .TP $n (*) The number of positional parameters currently known to the shell. .TP $p The value of the environment variable PATH. .TP $s (*) The exit status of the last sequential command from the .I previous command line. .TP $t The terminal name with which the standard input was associated when the shell was invoked, as determined by .IR ttyname (3). The value (if any) is equivalent to that given by `tty\ <\-'. .TP $u The effective user name of the current user, as determined by .IR getpwuid (3). The value (if any) is equivalent to that given by `id\ -un'. .TP $v (*) The version of the current shell represented as a one-word, read-only string. .PP All substitution on a command line is performed .I before the line is interpreted. Thus, no action which alters the value of any parameter can have any effect on a reference to that parameter occurring on the .I same line. .PP A positional-parameter value may contain any number of characters with special meaning to the shell. Each one which is .IR unquoted , or .IR unescaped , within a positional-parameter value retains its special meaning when the value is substituted in a command line by the invoked shell. .PP Take the following two shell invocations for example: .PP .nf % osh \-c '$1' 'echo Hello! >/dev/null' % osh \-c '$1' 'echo Hello! \\>/dev/null' Hello! >/dev/null .fi .PP In the first invocation, the `>' in the value substituted by `$1' retains its special meaning. This causes output from .IR echo (1) to be redirected to `/dev/null'. However, in the second invocation, the meaning of `>' is escaped by `\\' in the value substituted by `$1'. This causes the shell to pass `>/dev/null' as an argument to echo instead of interpreting it as a redirection. .SS File name generation Prior to executing an external command, the shell scans each argument for unquoted `*', `?', or `[' characters. If one or more of these characters appears, the argument is treated as a .I pattern and causes the shell to search for file names which .I match it. Otherwise, the argument is used as is. .PP The meaning of each pattern character is as follows: .IP o 4 The `*' character in a pattern matches any string of characters in a file name (including the null string). .IP o The `?' character in a pattern matches any single character in a file name. .IP o The `[...]' brackets in a pattern specifies a class of characters which matches any single file-name character in the class. Within the brackets, each character is taken to be a member of the class. A pair of characters separated by an unquoted `\-' specifies the class as a range which matches each character lexically between the first and second member of the pair, inclusive. A `\-' matches itself when quoted or when first or last in the class. .PP Any other character in a pattern matches itself in a file name. .PP Notice that the `.' character at the beginning of a file name, or immediately following a `/', is always special in that it must be matched explicitly. The same is true of the `/' character itself. .PP If the pattern contains no `/' characters, the current directory is always used. Otherwise, the specified directory is the one obtained by taking the pattern up to the last `/' before the first unquoted `*', `?', or `['. The matching process matches the remainder of the pattern after this `/' against the files in the specified directory. .PP In any event, a list of file names is obtained from the current (or specified) directory which match the given pattern. This list is sorted in ascending ASCII order, and the new sequence of arguments replaces the given pattern. The same process is carried out for each of the given pattern arguments; the resulting lists are .I not merged. Finally, the shell attempts to execute the command with the resulting argument list. .PP If a pattern argument refers to a directory which cannot be opened, a `No\ directory' diagnostic is printed. .PP If a command has only .I one pattern argument, a `No\ match' diagnostic is printed if it fails to match any files. However, if a command has more than one pattern argument, a diagnostic is printed only when they .I all fail to match any files. Otherwise, each pattern argument failing to match any files is simply removed from the argument list. .SS Initialization (+) If the first character of the name used to invoke an interactive shell is `\-' (e.g.,\ \-osh), it is assumed to be a login shell and tries to read the following three files in sequence: .IR @SYSCONFDIR@/osh.login , .IR $h/.osh.login , and .IR $h/.oshrc . For each file which exists and is readable, the shell reads and executes the commands contained within. .PP In the case where an interactive shell is not a login shell, it only tries to read and execute commands from one file: .IR $h/.oshrc . In any case, after the shell finishes with the appropriate initialization file(s) it then prompts the user for input as usual. .PP In the normal case, a SIGINT or SIGQUIT signal received by the shell during execution of any initialization file causes it to cease execution of that file without terminating. Thus, it may be desirable to use the .B sigign special command to ignore these and other signals in some cases. This is particularly true in the case of .IR @SYSCONFDIR@/osh.login . .PP An .B exit command always causes the shell to terminate if it occurs in any initialization file. .PP Notice that if any initialization file is .I not a regular file (or a link to a regular file), the shell ignores it, prints a diagnostic, and then continues with the normal initialization actions described above. .SS End of file An end-of-file in the shell's input causes it to exit. If the shell is interactive, this means it exits when the user types an EOT (^D). .SS Special commands The following commands are special in that they are executed by the shell without creating a new process. .TP \fB:\fR [\fIarg ...\fR] Does nothing and sets the exit status to zero. .TP \fBchdir\fR [\fIdir\fR] Changes the shell's current working directory to .IR dir . (+) If .I dir is an unquoted `-', the shell's previous working directory is used instead. Otherwise, if .I dir is not specified, the user's home directory is used by default. .TP \fBexec\fR \fIcommand\fR [\fIarg ...\fR] (+) Replaces the current shell with an instance of the specified command. Pipes and I/O redirection are permitted. .TP .B exit Causes the shell to cease execution of a file. .TP \fBlogin\fR [\fIarg ...\fR] Replaces the current interactive shell with .IR login (1). .TP \fBnewgrp\fR [\fIarg ...\fR] Replaces the current interactive shell with .IR newgrp (1). .TP \fBsetenv\fR \fIname\fR [\fIvalue\fR] (+) Sets the environment variable \fIname\fR to the string \fIvalue\fR. If \fIvalue\fR is not specified, the environment variable \fIname\fR is set to the empty string. .TP .B shift Shifts all positional-parameter values to the left by 1, so that the old value of `$2' becomes the new value of `$1' and so forth. The value of `$0' does not shift. .TP \fBsigign\fR [\fB+\fR | \fB\-\fR \fIsignal_number ...\fR] (+) \fB+\fR causes the specified signals to be ignored if possible, and \fB-\fR causes the specified signals to be reset to the default action if possible. If a signal was already ignored when the shell was invoked, it can never be reset with \fB-\fR. If no arguments are specified, a list is printed of those signals which .\" are ignored because of a previous invocation .\" of sigign in the current shell. are ignored by sigign in the current shell. .TP \fBsource\fR \fIfile\fR [\fIarg1 ...\fR] (+) Causes the shell to read and execute commands from \fIfile\fR and return. Any specified arguments are treated as positional parameters during execution of the file. The source command may be nested. As with command files, most shell-detected errors cause the shell to cease execution of the file. If the source command is nested and such an error occurs, all nested source commands terminate. .TP \fBumask\fR [\fImask\fR] (+) Sets the file creation mask (see .IR umask (2)) to the octal value specified by .IR mask . If the mask is not specified, its current value is printed. .TP \fBunsetenv\fR \fIname\fR (+) Removes the variable \fIname\fR from the environment. .TP .B wait Waits for all asynchronous processes to terminate, reporting on abnormal terminations. .SS Signals (+) If the shell is interactive, it ignores the SIGINT, SIGQUIT, and SIGTERM signals (see .IR signal (3)). However, if the shell is invoked with any option argument, it only ignores SIGINT and SIGQUIT. .PP If SIGINT or SIGQUIT is already ignored when the shell starts, it is also ignored for all of the shell's child processes. Otherwise, each signal is reset to its default action for sequential child processes. SIGTERM is always reset to its default action for all child processes by default. .PP For all other signals, the shell inherits the signal action (default or ignore) from its parent and passes it to its children. Remember that the .B sigign special command may be used to ignore signals in those cases where the shell does not do so automatically. .PP Asynchronous child processes always ignore both SIGINT and SIGQUIT. Also, if such a process has not redirected its input with a `<', `|', or `^', the shell automatically redirects it to come from .IR /dev/null . .SH "EXIT STATUS (+)" The exit status of the shell is generally that of the last command executed prior to end-of-file or .BR exit . .PP However, if the shell is interactive and detects an error, it exits with a non-zero status if the user types an EOT at the next prompt. .PP Otherwise, if the shell is non-interactive and is reading commands from a file, any shell-detected error causes the shell to cease execution of that file. This results in a non-zero exit status. .PP A non-zero exit status returned by the shell itself is always one of the values described in the following list, each of which may be accompanied by an appropriate diagnostic: .TP 2 The shell detected a syntax, redirection, or other error not described in this list. .TP 125 An external command was found but did not begin with the proper magic number or a `#!shell' sequence, and a valid shell was not specified by EXECSHELL with which to execute it. .TP 126 An external command was found but could not be executed. .TP 127 An external command was not found. .TP >128 An external command was terminated by a signal. .SH "ENVIRONMENT (+)" Notice that the concept of `user environment' was not defined in Sixth Edition Unix. Thus, use of the following environment variables by this port of the shell is an enhancement: .TP .B EXECSHELL If set to a non-empty string, the value of this variable is taken as the path name of the shell which is invoked to execute an external command when it does not begin with the proper magic number or a `#!shell' sequence. Its value is available to the shell via the `$e' special parameter. .TP .B HOME If set to a non-empty string, the value of this variable is taken as the user's home directory. Its value is available to the shell via the `$h' special parameter and is the default directory for the .B chdir special command. .TP .B OSHDIR If set to a non-empty string, the value of this variable is taken as the path name of a directory which may be used for temporary files. Its value is available to the shell via the `$d' special parameter. .TP .B PATH If set to a non-empty string, the value of this variable is taken as the sequence of directories used by the shell to search for external commands. Its value is available to the shell via the `$p' special parameter. Notice that the Sixth Edition Unix shell always used the equivalent of `.:/bin:/usr/bin', not PATH. .SH FILES .TP .I /dev/null default source of input for asynchronous processes .TP .IR @SYSCONFDIR@/osh.login \ (+) system-wide initialization file for interactive login shells .TP .IR $h/.osh.login \ (+) user initialization file for interactive login shells .TP .IR $h/.oshrc \ (+) user initialization file for \fIall\fR interactive shells .SH "SEE ALSO" awk(1), echo(1), env(1), expr(1), fd2(1), goto(1), grep(1), if(1), kill(1), login(1), newgrp(1), sed(1), sh6(1) .PP Osh home page: http://jneitzel.sdf1.org/osh/ .SH AUTHORS This enhanced port of the Thompson shell is derived from Sixth Edition Unix /usr/source/s2/sh.c, which was principally written by Ken Thompson of Bell Labs. Jeffrey Allen Neitzel initially ported it in January 2004 and currently maintains it as .IR sh6 (1). In addition, he is the principal developer and maintainer of this enhanced version of the shell, which is hereby made available as .IR osh (1). .SH HISTORY A .I sh command appeared as .I /bin/sh in First Edition Unix. .PP The Thompson shell was used as the standard command interpreter through Sixth Edition Unix. Then, in the Seventh Edition, it was replaced by the Bourne shell. However, the Thompson shell was still distributed with the system as .I osh because of known portability problems with the Bourne shell's memory management in Seventh Edition Unix. .SH LICENSE See either the LICENSE file which is distributed with .I osh or http://jneitzel.sdf1.org/osh/license/ for full details. .SH NOTES Notice that this port of the shell can handle 8-bit character sets. However, the original can only handle 7-bit ASCII. .PP Notice also that certain shell oddities were historically undocumented in this manual page. Particularly noteworthy is the fact that there is no such thing as a usage error. Thus, the following shell invocations are perfectly valid: .PP .nf osh \-cats_are_nice!!! ': "Good kitty =)"' osh \-tabbies_are_too! osh \-s .fi .PP The first two cases correspond to the .B \-c and .B \-t options respectively; the third case corresponds to the .B \- option. .SH SECURITY This port of the Thompson shell does not support being used in a set-ID context. If the effective user (group) ID of the shell process is not equal to its real user (group) ID, the shell prints a diagnostic and exits with a non-zero status. The reasons for this are as follows. .PP First, the way in which the shell uses positional parameters (see .I "Parameter substitution" above) makes it a simple matter to invoke an interactive shell from a command file if the user knows the name of the current terminal (if any). This is distinctly .I not a bug and can be very useful in the normal case. .PP However, if the shell did support set-ID execution, this could possibly allow a user to violate the security policy on a host where the shell is used. For example, if the shell were running a setuid-root command file, a regular user could invoke an interactive root shell as a result. .SH BUGS The shell makes no attempt to recover from .IR read (2) errors and exits if this system call fails for any reason.