| .\" Copyright (c) 1991 The Regents of the University of California. |
| .\" All rights reserved. |
| .\" |
| .\" This code is derived from software contributed to Berkeley by |
| .\" Kenneth Almquist. |
| .\" |
| .\" 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. |
| .\" 3. All advertising materials mentioning features or use of this software |
| .\" must display the following acknowledgement: |
| .\" This product includes software developed by the University of |
| .\" California, Berkeley and its contributors. |
| .\" 4. Neither the name of the University nor the names of its contributors |
| .\" may be used to endorse or promote products derived from this software |
| .\" without specific prior written permission. |
| .\" |
| .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 THE REGENTS OR CONTRIBUTORS 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. |
| .\" |
| .\" from: @(#)sh.1 5.1 (Berkeley) 3/7/91 |
| .\" sh.1,v 1.6 1993/08/01 07:58:14 mycroft Exp |
| .\" |
| .TH SH 1 "March 7, 1991" |
| .UC 7 |
| .de h \" subheading |
| .sp |
| .ti -0.3i |
| .B "\\$1" |
| .PP |
| .. |
| .de d \" begin display |
| .sp |
| .in +4 |
| .nf |
| .. |
| .de e \" end display |
| .in -4 |
| .fi |
| .sp |
| .. |
| .de c \" command, etc. |
| .br |
| .HP 5 |
| \fB\\$1\fR |
| .br |
| .. |
| .de b \" begin builtin command |
| .HP 5 |
| .B \\$1 |
| .. |
| .SH NAME |
| ash \- a shell |
| .SH SYNOPSIS |
| .B ash |
| [ |
| .B -efIijnsxz |
| ] [ |
| .B +efIijnsxz |
| ] [ |
| .B -c |
| .I command |
| ] [ |
| .I arg |
| ] ... |
| .SH COPYRIGHT |
| Copyright 1989 by Kenneth Almquist. |
| .SH DESCRIPTION |
| .I Ash |
| is a version of |
| .I sh |
| with features similar to those of the System V shell. |
| This manual page lists all the features of |
| .I ash |
| but concentrates on the ones not in other shells. |
| .h "Invocation" |
| If the |
| .B -c |
| options is given, then the shell executes the specified shell command. |
| The |
| .B -s |
| flag cause the shell to read commands from the standard input (after |
| executing any command specified with the |
| .B -c |
| option. |
| If neither the |
| .B -s |
| or |
| .B -c |
| options are set, then the first |
| .I arg |
| is taken as the name of a file to read commands from. |
| If this is impossible because there are no arguments following |
| the options, then |
| .I ash |
| will set the |
| .B -s |
| flag and will read commands from the standard input. |
| .PP |
| The shell sets the initial value of the positional parameters from the |
| .IR arg s |
| remaining after any |
| .I arg |
| used as the name of a file of commands is deleted. |
| .PP |
| The flags (other than |
| .BR -c ) |
| are set by preceding them with ``-'' and cleared by preceding them |
| with ``+''; see the |
| .I set |
| builtin command for a list of flags. |
| If no value is specified for the |
| .B -i |
| flag, the |
| .B -s |
| flag is set, and the standard input and output of the shell |
| are connected to terminals, then the |
| .B -i |
| flag will be set. |
| If no value is specified for the |
| .B -j |
| flag, then the |
| .B -j |
| flag will be set if the |
| .B -i |
| flag is set. |
| .PP |
| When the shell is invoked with the |
| .B -c |
| option, it is good practice to include the |
| .I -i |
| flag if the command was entered interactively by a user. |
| For compatibility with the System V shell, the |
| .I -i |
| option should come after the |
| .B -c |
| option. |
| .PP |
| If the first character of argument zero to the shell is ``-'', |
| the shell is assumed to be a login shell, and the files |
| .B /etc/profile |
| and |
| .B .profile |
| are read if they exist. |
| If the environment variable SHINIT is set on entry to the shell, |
| the commands in SHINIT are normally parsed and executed. SHINIT is |
| not examined if the shell is a login shell, or if it the shell is running a |
| shell procedure. (A shell is considered to be running a shell |
| procedure if neither the |
| .B -s |
| nor the |
| .B -c |
| options are set.) |
| .h "Control Structures" |
| A |
| .I list |
| is a sequence of zero or more commands separated by newlines, |
| semicolons, or ampersands, and optionally terminated by one of these |
| three characters. (This differs from the System V shell, which |
| requires a list to contain at least one command in most cases.) The |
| commands in a list are executed in the order they are written. |
| If command is followed by an ampersand, the shell starts the command |
| and immediately proceed onto the next command; otherwise it waits |
| for the command to terminate before proceeding to the next one. |
| .PP |
| ``&&'' and ``||'' are binary operators. |
| ``&&'' executes the first command, and then executes the second command |
| iff the exit status of the first command is zero. ``||'' is similar, |
| but executes the second command iff the exit status of the first command |
| is nonzero. ``&&'' and ``||'' both have the same priority. |
| .PP |
| The ``|'' operator is a binary operator which feeds the standard output |
| of the first command into the standard input of the second command. |
| The exit status of the ``|'' operator is the exit status of the second |
| command. ``|'' has a higher priority than ``||'' or ``&&''. |
| .PP |
| An |
| .I if |
| command looks like |
| .d |
| \fBif\fR list |
| \fBthen\fR list |
| .ti -\w'[ 'u |
| [ \fBelif\fR list |
| \fBthen\fR list ] ... |
| .ti -\w'[ 'u |
| [ \fBelse\fR list ] |
| \fBfi\fR |
| .e |
| .PP |
| A |
| .I while |
| command looks like |
| .d |
| \fBwhile\fR list |
| \fBdo\fR list |
| \fBdone\fR |
| .e |
| The two lists are executed repeatedly while the exit status of the first |
| list is zero. The |
| .I until |
| command is similar, but has the word |
| .B until |
| in place of |
| .B while |
| repeats until the exit status of the first list |
| is zero. |
| .PP |
| The |
| .I for |
| command looks like |
| .d |
| \fBfor\fR variable \fBin\fR word... |
| \fBdo\fR list |
| \fBdone\fR |
| .e |
| The words are expanded, and then the list is executed repeatedly with |
| the variable set to each word in turn. |
| .B do |
| and |
| .B done |
| may be replaced with |
| ``{'' and ``}''. |
| .PP |
| The |
| .I break |
| and |
| .I continue |
| commands look like |
| .d |
| \fBbreak\fR [ num ] |
| \fBcontinue\fR [ num ] |
| .e |
| .I Break |
| terminates the |
| .I num |
| innermost |
| .I for |
| or |
| .I while |
| loops. |
| .I Continue |
| continues with the next iteration of the |
| .IR num'th |
| innermost loop. |
| These are implemented as builtin commands. |
| .PP |
| The |
| .I case |
| command looks like |
| .d |
| \fBcase\fR word \fBin\fR |
| pattern\fB)\fR list \fB;;\fR |
| \&... |
| \fBesac\fR |
| .e |
| The pattern can actually be one or more patterns (see |
| .I Patterns |
| below), separated by ``|'' characters. |
| .PP |
| Commands may be grouped by writing either |
| .d |
| \fB(\fRlist\fB)\fR |
| .e |
| or |
| .d |
| \fB{\fR list; \fB}\fR |
| .e |
| The first of these executes the commands in a subshell. |
| .PP |
| A function definition looks like |
| .d |
| name \fB( )\fR command |
| .e |
| A function definition is an executable statement; when executed it installs |
| a function named |
| .B name |
| and returns an exit status of zero. |
| The command is normally a list enclosed between ``{'' and ``}''. |
| .PP |
| Variables may be declared to be local to a function by using a |
| .I local |
| command. This should appear as the first staement of a function, |
| and looks like |
| .d |
| \fBlocal\fR [ variable | \fB-\fR ] ... |
| .e |
| .I Local |
| is implemented as a builtin command. |
| .PP |
| When a variable is made local, it inherits the initial value and |
| exported and readonly flags from the variable with the same name in the |
| surrounding scope, if there is one. Otherwise, the variable is |
| initially unset. |
| .I Ash |
| uses dynamic scoping, so that if you make the variable |
| .B x |
| local to function |
| .IR f , |
| which then calls function |
| .IR g , |
| references to the variable |
| .B x |
| made inside |
| .I g |
| will refer to the variable |
| .B x |
| declared inside |
| .IR f , |
| not to the global variable named |
| .BR x . |
| .PP |
| The only special parameter than can be made local is ``\fB-\fR''. |
| Making ``\fB-\fR'' local any shell options that are changed via the |
| .I set |
| command inside the function to be restored to their original values |
| when the function returns. |
| .PP |
| The |
| .I return |
| command looks like |
| .d |
| \fBreturn\fR [ exitstatus ] |
| .e |
| It terminates the currently executing function. |
| .I Return |
| is implemented as a builtin command. |
| .h "Simple Commands" |
| A simple command is a sequence of words. The execution of a simple |
| command proceeds as follows. First, the leading words of the form |
| ``name=value'' are stripped off and assigned to the environment of |
| the command. Second, the words are expanded. Third, the first |
| remaining word is taken as the command name that command is located. |
| Fourth, any redirections are performed. Fifth, the command is |
| executed. We look at these operations in reverse order. |
| .PP |
| The execution of the command varies with the type of command. |
| There are three types of commands: shell functions, builtin commands, |
| and normal programs. |
| .PP |
| When a shell function is executed, all of the shell positional parameters |
| (except $0, which remains unchanged) are set to the parameters to the shell |
| function. The variables which are explicitly placed in the environment |
| of the command (by placing assignments to them before the function name) |
| are made local to the function and are set to values given. |
| Then the command given in the function definition is executed. |
| The positional parameters are restored to their original values when |
| the command completes. |
| .PP |
| Shell builtins are executed internally to the shell, without spawning |
| a new process. |
| .PP |
| When a normal program is executed, the shell runs the program, passing |
| the parameters and the environment to the program. If the program is |
| a shell procedure, the shell will interpret the program in a subshell. |
| The shell will reinitialize itself in this case, so that the effect |
| will be as if a new shell had been invoked to handle the shell procedure, |
| except that the location of commands located in the parent shell will |
| be remembered by the child. If the program is a file beginning with |
| ``#!'', the remainder of the first line specifies an interpreter for |
| the program. The shell (or the operating system, under Berkeley UNIX) |
| will run the interpreter in this case. The arguments to the interpreter |
| will consist of any arguments given on the first line of the program, |
| followed by the name of the program, followed by the arguments passed |
| to the program. |
| .h "Redirection" |
| Input/output redirections can be intermixed with the words in a simple |
| command and can be placed following any of the other commands. When |
| redirection occurs, the shell saves the old values of the file descriptors |
| and restores them when the command completes. The ``<'', ``>'', and ``>>'' |
| redirections open a file for input, output, and appending, respectively. |
| The ``<&digit'' and ``>&digit'' makes the input or output a duplicate |
| of the file descriptor numbered by the digit. If a minus sign is used |
| in place of a digit, the standard input or standard output are closed. |
| .PP |
| The ``<<\ word'' redirection |
| takes input from a |
| .I here |
| document. |
| As the shell encounters ``<<'' redirections, it collects them. The |
| next time it encounters an unescaped newline, it reads the documents |
| in turn. The word following the ``<<'' specifies the contents of the |
| line that terminates the document. If none of the quoting methods |
| ('', "", or \e) are used to enter the word, then the document is treated |
| like a word inside double quotes: ``$'' and backquote are expanded |
| and backslash can be used to escape these and to continue long lines. |
| The word cannot contain any variable or command substitutions, and |
| its length (after quoting) must be in the range of 1 to 79 characters. |
| If ``<<-'' is used in place of ``<<'', then leading tabs are deleted |
| from the lines of the document. (This is to allow you do indent shell |
| procedures containing here documents in a natural fashion.) |
| .PP |
| Any of the preceding redirection operators may be preceded by a single |
| digit specifying the file descriptor to be redirected. There cannot |
| be any white space between the digit and the redirection operator. |
| .h "Path Search" |
| When locating a command, the shell first looks to see if it has a |
| shell function by that name. Then, if PATH does not contain an |
| entry for "%builtin", it looks for a builtin command by that name. |
| Finally, it searches each entry in PATH in turn for the command. |
| .PP |
| The value of the PATH variable should be a series of entries separated |
| by colons. |
| Each entry consists of a directory name, or a directory name followed |
| by a flag beginning with a percent sign. |
| The current directory should be indicated by an empty directory name. |
| .PP |
| If no percent sign is present, then the entry causes the shell to |
| search for the command in the specified directory. If the flag is |
| ``%builtin'' then the list of shell builtin commands is searched. |
| If the flag is ``%func'' then the directory is searched for a file which |
| is read as input to the shell. This file should define a function |
| whose name is the name of the command being searched for. |
| .PP |
| Command names containing a slash are simply executed without performing |
| any of the above searches. |
| .h "The Environment" |
| The environment of a command is a set of name/value pairs. When the |
| shell is invoked, it reads these names and values, sets the shell |
| variables with these names to the corresponding values, and marks |
| the variables as exported. The |
| .I export |
| command can be used to mark additional variables as exported. |
| .PP |
| The environment of a command is constructed by constructing name/value |
| pairs from all the exported shell variables, and then modifying this |
| set by the assignments which precede the command, if any. |
| .h "Expansion" |
| The process of evaluating words when a shell procedure is executed is |
| called |
| .IR expansion . |
| Expansion consists of four steps: variable substitution, command |
| substitution, word splitting, and file name generation. If a word |
| is the expression following the word |
| .B case |
| in a case statement, the file name |
| which follows a redirection symbol, or an assignment to the environment |
| of a command, then the word cannot be split into multiple words. In |
| these cases, the last two steps of the expansion process are omitted. |
| .h "Variable Substitution" |
| To be written. |
| .h "Command Substitution" |
| .I Ash |
| accepts two syntaxes for command substitution: |
| .b |
| `\fIlist\fR` |
| .e |
| and |
| .b |
| $(\fIlist\fR) |
| .e |
| Either of these may be included in a word. |
| During the command substitution process, the command (syntactly a |
| .IR list ) |
| will be executed and anything that the command writes to the standard |
| output will be captured by the shell. The final newline (if any) of |
| the output will be deleted; the rest of the output will be substituted |
| for the command in the word. |
| .h "Word Splitting" |
| When the value of a variable or the output of a command is substituted, |
| the resulting text is subject to word splitting, unless the dollar sign |
| introducing the variable or backquotes containing the text were enclosed |
| in double quotes. In addition, ``$@'' is subject to a special type of |
| splitting, even in the presence of double quotes. |
| .PP |
| Ash uses two different splitting algorithms. The normal approach, which |
| is intended for splitting text separated by which space, is used if the |
| first character of the shell variable IFS is a space. Otherwise an alternative |
| experimental algorithm, which is useful for splitting (possibly empty) |
| fields separated by a separator character, is used. |
| .PP |
| When performing splitting, the shell scans the replacement text looking |
| for a character (when IFS does not begin with a space) or a sequence of |
| characters (when IFS does begin with a space), deletes the character or |
| sequence of characters, and spits the word into two strings at that |
| point. When IFS begins with a space, the shell deletes either of the |
| strings if they are null. As a special case, if the word containing |
| the replacement text is the null string, the word is deleted. |
| .PP |
| The variable ``$@'' is special in two ways. First, splitting takes |
| place between the positional parameters, even if the text is enclosed |
| in double quotes. Second, if the word containing the replacement |
| text is the null string and there are no positional parameters, then |
| the word is deleted. The result of these rules is that "$@" is |
| equivalent to "$1" "$2" ... "$\fIn\fR", where \fIn\fR is the number of |
| positional parameters. (Note that this differs from the System V shell. |
| The System V documentation claims that "$@" behaves this way; in fact |
| on the System V shell "$@" is equivalent to "" when there are no |
| positional paramteters.) |
| .h "File Name Generation" |
| Unless the |
| .B -f |
| flag is set, file name generation is performed after word splitting is |
| complete. Each word is viewed as a series of patterns, separated by |
| slashes. The process of expansion replaces the word with the names of |
| all existing files whose names can be formed by replacing each pattern |
| with a string that matches the specified pattern. There are two |
| restrictions on this: first, a pattern cannot match a string containing |
| a slash, and second, a pattern cannot match a string starting with a |
| period unless the first character of the pattern is a period. |
| .PP |
| If a word fails to match any files and the |
| .B -z |
| flag is not set, then the word will be left unchanged (except that the |
| meta-characters will be converted to normal characters). If the |
| .B -z |
| flag is set, then the word is only left unchanged if none |
| of the patterns contain a character that can match anything besides |
| itself. Otherwise the |
| .B -z |
| flag forces the word to be replaced with the names of the files that it |
| matches, even if there are zero names. |
| .h "Patterns" |
| A |
| .I pattern |
| consists of normal characters, which match themselves, and meta-characters. |
| The meta-characters are ``!'', ``*'', ``?'', and ``[''. These characters lose |
| there special meanings if they are quoted. When command or variable |
| substitution is performed and the dollar sign or back quotes are not |
| double quoted, the value of the variable or the output of the command |
| is scanned for these characters and they are turned into meta-characters. |
| .PP |
| Two exclamation points at the beginning of a pattern function as a ``not'' |
| operator, causing the pattern to match any string that the remainder of |
| the pattern does |
| .I not |
| match. Other occurances of exclamation points in a pattern match |
| exclamation points. Two exclamation points are required rather than one |
| to decrease the incompatibility with the System V shell (which does not |
| treat exclamation points specially). |
| .PP |
| An asterisk (``*'') matches any string of characters. |
| A question mark matches any single character. |
| A left bracket (``['') introduces a character class. The end of the |
| character class is indicated by a ``]''; if the ``]'' is missing then |
| the ``['' matches a ``['' rather than introducing a character class. |
| A character class matches any of the characters between the square |
| brackets. A range of characters may be specified using a minus sign. |
| The character class may be complemented by making an exclamation point |
| the first character of the character class. |
| .PP |
| To include a ``]'' in a character class, make it the first character listed |
| (after the ``!'', if any). |
| To include a minus sign, make it the first or last character listed. |
| .h "The /u Directory" |
| By convention, the name ``/u/user'' refers to the home directory of the |
| specified user. There are good reasons why this feature should be supported |
| by the file system (using a feature such as symbolic links) rather than |
| by the shell, but |
| .I ash |
| is capable of performing this mapping if the file system doesn't. |
| If the mapping is done by |
| .IR ash , |
| setting the |
| .B -f |
| flag will turn it off. |
| .h "Character Set" |
| .I Ash |
| silently discards nul characters. Any other character will be handled |
| correctly by |
| .IR ash , |
| including characters with the high order bit set. |
| .h "Job Names and Job Control" |
| The term |
| .I job |
| refers to a process created by a shell command, or in the case of a |
| pipeline, to the set of processes in the pipeline. The ways to refer |
| to a job are: |
| .b |
| %\fInumber\fR |
| %\fIstring\fR |
| %% |
| \fIprocess_id\fR |
| .e |
| The first form identifies a job by job number. |
| When a command is run, |
| .I ash |
| assigns it a job number |
| (the lowest unused number is assigned). |
| The second form identifies a job by giving a prefix of the command used |
| to create the job. The prefix must be unique. If there is only one job, |
| then the null prefix will identify the job, so you can refer to the job |
| by writing ``%''. The third form refers to the \fIcurrent job\fR. The |
| current job is the last job to be stopped while it was in the foreground. |
| (See the next paragraph.) The last form identifies a job by giving the |
| process id of the last process in the job. |
| .PP |
| If the operating system that |
| .I ash |
| is running on supports job control, |
| .I ash |
| will allow you to use it. |
| In this case, typing the suspend character (typically ^Z) while running |
| a command will return you to |
| .I ash |
| and will make the suspended command the current job. You can then continue |
| the job in the background by typing |
| .IR bg , |
| or you can continue it in the foreground by typing |
| .IR fg . |
| .h "Atty" |
| If the shell variable ATTY is set, and the shell variable TERM is not |
| set to ``emacs'', then \fIash\fR generates appropriate escape sequences |
| to talk to |
| .IR atty (1). |
| .h "Exit Statuses" |
| By tradition, an exit status of zero means that a command has succeeded |
| and a nonzero exit status indicates that the command failed. This is |
| better than no convention at all, but in practice it is extremely useful |
| to allow commands that succeed to use the exit status to return information |
| to the caller. A variety of better conventions have been proposed, but |
| none of them has met with universal approval. The convention used by |
| \fIash\fR and all the programs included in the \fIash\fR distribution is |
| as follows: |
| .ta 1i 2i |
| .nf |
| 0 Success. |
| 1 Alternate success. |
| 2 Failure. |
| 129-... Command terminated by a signal. |
| .fi |
| The \fIalternate success\fR return is used by commands to indicate various |
| conditions which are not errors but which can, with a little imagination, |
| be conceived of as less successful than plain success. For example, |
| .I test |
| returns 1 when the tested condition is false and |
| .I getopts |
| returns 1 when there are no more options. |
| Because this convention is not used universally, the |
| .B -e |
| option of |
| .I ash |
| causes the shell to exit when a command returns 1 even though that |
| contradicts the convention described here. |
| .PP |
| When a command is terminated by a signal, the uses 128 plus the signal |
| number as the exit code for the command. |
| .h "Builtin Commands" |
| This concluding section lists the builtin commands which are builtin |
| because they need to perform some operation that can't be performed by a |
| separate process. In addition to these, there are several other commands |
| .RI ( catf , |
| .IR echo , |
| .IR expr , |
| .IR line , |
| .IR nlecho , |
| .IR test , |
| .RI `` : '', |
| and |
| .IR true ) |
| which can optionally be compiled into the shell. The builtin |
| commands described below that accept options use the System V Release 2 |
| .IR getopt (3) |
| syntax. |
| .sp |
| .b bg |
| [ |
| .I job |
| ] ... |
| .br |
| Continue the specified jobs (or the current job if no jobs are given) |
| in the background. |
| This command is only available on systems with Bekeley job control. |
| .b bltin |
| .IR "command arg" ... |
| .br |
| Execute the specified builtin command. (This is useful when you have a |
| shell function with the same name as a builtin command.) |
| .b cd |
| [ |
| .I directory |
| ] |
| .br |
| Switch to the specified directory (default $HOME). |
| If the an entry for CDPATH appears in the environment of the cd command |
| or the shell variable CDPATH is set and the directory name does not |
| begin with a slash, then the directories listed in CDPATH will be |
| searched for the specified directory. The format of CDPATH is the |
| same as that of PATH. |
| In an interactive shell, the cd command will print out the name of the |
| directory that it actually switched to if this is different from the |
| name that the user gave. These may be different either because |
| the CDPATH mechanism was used or because a symbolic link was crossed. |
| .b ".\fI\h'0.1i'file" |
| .br |
| The commands in the specified file are read and executed by the shell. |
| A path search is not done to find the file because the directories in |
| PATH generally contain files that are intended to be executed, not read. |
| .b eval |
| .IR string ... |
| .br |
| The strings are parsed as shell commands and executed. |
| (This differs from the System V shell, which concatenates the arguments |
| (separated by spaces) and parses the result as a single command.) |
| .b exec |
| [ |
| .IR "command arg" ... |
| ] |
| .br |
| Unless |
| .I command |
| is omitted, |
| the shell process is replaced with the specified program (which must be a real |
| program, not a shell builtin or function). |
| Any redirections on the exec command are marked as permanent, so that they |
| are not undone when the exec command finishes. |
| If the command is not found, the exec command causes the shell to exit. |
| .b exit |
| [ |
| .I exitstatus |
| ] |
| .br |
| Terminate the shell process. If |
| .I exitstatus |
| is given it is used as the |
| exit status of the shell; otherwise the exit status of the preceding |
| command is used. |
| .b export |
| .IR name ... |
| .br |
| The specified names are exported so that they will appear in the environment |
| of subsequent commands. The only way to un-export a variable is to unset it. |
| .I Ash |
| allows the value of a variable to be set at the same time it is exported |
| by writing |
| .d |
| \fBexport\fR name=value |
| .e |
| With no arguments the export command lists the names of all exported variables. |
| .b fg |
| [ |
| .I job |
| ] |
| .br |
| Move the specified job or the current job to the foreground. |
| This command is only available on systems with Bekeley job control. |
| .b getopts |
| .I optstring |
| .I var |
| .br |
| The System V |
| .I getopts |
| command. |
| .b hash |
| .B -rv |
| .IR command ... |
| .br |
| The shell maintains a hash table which remembers the locations of |
| commands. With no arguments whatsoever, the hash command prints |
| out the contents of this table. Entries which have not been looked |
| at since the last |
| .I cd |
| command are marked with an asterisk; it is possible for these entries |
| to be invalid. |
| .sp |
| With arguments, the hash command removes the specified commands from |
| the hash table (unless they are functions) and then locates them. |
| With the |
| .B -v |
| option, |
| .I hash |
| prints the locations of the commands as it finds them. |
| The |
| .B -r |
| option causes the |
| .I hash |
| command to delete all the entries in the hash table except for |
| functions. |
| .b jobid |
| [ |
| .I job |
| ] |
| .br |
| Print the process id's of the processes in the job. If the job argument |
| is omitted, use the current job. |
| .b jobs |
| .br |
| This command lists out all the background processes which are children |
| of the current shell process. |
| .b lc |
| [ |
| .I function-name |
| ] |
| .br |
| The function name is defined to execute the last command entered. |
| If the function name is omitted, the last command executed is |
| executed again. This command only works if the |
| .B -i |
| flag is set. |
| .b pwd |
| .br |
| Print the current directory. The builtin command may differ from the |
| program of the same name because the builtin command remembers what |
| the current directory is rather than recomputing it each time. This |
| makes it faster. However, if the current directory is renamed, the |
| builtin version of pwd will continue to print the old name for the |
| directory. |
| .b read |
| [ |
| .B -p |
| .I prompt |
| ] |
| [ |
| .B -e |
| ] |
| .IR variable ... |
| .br |
| The prompt is printed if the |
| .B -p |
| option is specified and the standard input is a terminal. Then a |
| line is read from the standard input. The trailing newline is deleted |
| from the line and the line is split as described |
| in the section on word splitting above, and the pieces are assigned to |
| the variables in order. If there are more pieces than variables, the |
| remaining pieces (along with the characters in IFS that separated them) |
| are assigned to the last variable. If there are more variables than |
| pieces, the remaining variables are assigned the null string. |
| .sp |
| The |
| .B -e |
| option causes any backslashes in the input to be treated specially. |
| If a backslash is followed by a newline, the backslash and the newline |
| will be deleted. If a backslash is followed by any other character, |
| the backslash will be deleted and the following character will be treated |
| as though it were not in IFS, even if it is. |
| .b readonly |
| .IR name ... |
| .br |
| The specified names are marked as read only, so that they cannot be |
| subsequently modified or unset. |
| .I Ash |
| allows the value of a variable to be set at the same time it is marked |
| read only by writing |
| .d |
| \fBreadonly\fR name=value |
| .e |
| With no arguments the readonly command lists the names of all |
| read only variables. |
| .b set |
| [ |
| { |
| .BI - options |
| | |
| .BI + options |
| | |
| .B -- |
| } |
| ] |
| .IR arg ... |
| .br |
| The |
| .I set |
| command performs three different functions. |
| .sp |
| With no arguments, it lists the values of all shell variables. |
| .sp |
| If options are given, it sets the specified option flags, or clears |
| them if the option flags are introduced with a |
| .B + |
| rather than a |
| .BR - . |
| Only the first argument to |
| .I set |
| can contain options. |
| The possible options are: |
| .sp |
| .ta 0.4i |
| .in +0.4i |
| .ti -0.4i |
| \fB-e\fR Causes the shell to exit when a command terminates with |
| a nonzero exit status, except when the exit status of the command is |
| explicitly tested. The exit status of a command is considered to be |
| explicitly tested if the command is used to control an |
| .IR if , |
| .IR elif , |
| .IR while , |
| or |
| .IR until ; |
| or if the command is the left hand operand of an ``&&'' or ``||'' |
| operator. |
| .sp |
| .ti -0.4i |
| \fB-f\fR Turn off file name generation. |
| .sp |
| .ti -0.4i |
| \fB-I\fR Cause the shell to ignore end of file conditions. |
| (This doesn't apply when the shell a script sourced using the ``.'' |
| command.) The shell will in fact exit if it gets 50 eof's in a |
| row. |
| .sp |
| .ti -0.4i |
| \fB-i\fR Make the shell interactive. This causes the shell to |
| prompt for input, to trap interrupts, to ignore quit and terminate signals, |
| and to return to the main command loop rather than exiting on error. |
| .sp |
| .ti -0.4i |
| \fB-j\fR Turns on Berkeley job control, on systems that support it. |
| When the shell starts up, the |
| .B -j |
| is set by default if the |
| .B -i |
| flag is set. |
| .sp |
| .ti -0.4i |
| \fB-n\fR Causes the shell to read commands but not execute them. |
| (This is marginally useful for checking the syntax of scripts.) |
| .sp |
| .ti -0.4i |
| \fB-s\fR If this flag is set when the shell starts up, the shell |
| reads commands from its standard input. The shell doesn't examine the |
| value of this flag any other time. |
| .sp |
| .ti -0.4i |
| \fB-x\fR If this flag is set, the shell will print out each |
| command before executing it. |
| .sp |
| .ti -0.4i |
| \fB-z\fR If this flag is set, the file name generation process |
| may generate zero files. If it is not set, then a pattern which does |
| not match any files will be replaced by a quoted version of the pattern. |
| .in -0.4i |
| .sp |
| The third use of the set command is to set the values of the shell's |
| positional parameters to the specified |
| .IR args . |
| To change the positional parameters without changing any options, |
| use ``\fB--\fR'' as the first argument to |
| .IR set . |
| If no args are present, the set command will leave the value of the |
| positional parameters unchanged, so to set the positional parameters |
| to set of values that may be empty, execute the command |
| .d |
| shift $# |
| .e |
| first to clear out the old values of the positional parameters. |
| .b setvar |
| .I variable |
| .I value |
| .br |
| Assigns |
| .I value |
| to |
| .IR variable . |
| (In general it is better to write |
| .I variable=value |
| rather than using |
| .IR setvar . |
| .I Setvar |
| is intended to be used in functions that assign values to variables whose |
| names are passed as parameters.) |
| .b shift |
| [ |
| .I n |
| ] |
| .br |
| Shift the positional parameters |
| .I n |
| times. |
| A shift sets the value of $1 to the value of $2, the value of $2 to |
| the value of $3, and so on, decreasing the value of $# by one. |
| If there are zero positional parameters, shifting doesn't do anything. |
| .b trap |
| [ |
| .I action |
| ] |
| .IR signal ... |
| .br |
| Cause the shell to parse and execute |
| .I action |
| when any of the specified signals are received. |
| The signals are specified by signal number. |
| .I Action |
| may be null or omitted; |
| the former causes the specified signal to be ignored and the latter |
| causes the default action to be taken. |
| When the shell forks off a subshell, it resets trapped (but not ignored) |
| signals to the default action. |
| The trap command has no effect on signals that were ignored on entry |
| to the shell. |
| .b umask |
| [ |
| .I mask |
| ] |
| .br |
| Set the value of umask (see |
| .IR umask (2)) |
| to the specified octal value. If the argument is omitted, the umask |
| value is printed. |
| .b unset |
| .IR name ... |
| .br |
| The specified variables and functions are unset and unexported. |
| If a given name corresponds to both a variable and a function, both the |
| variable and the function are unset. |
| .b wait |
| [ |
| .I job |
| ] |
| .br |
| Wait for the specified job to complete and return the exit status of the |
| last process in the job. If the argument is omitted, wait for all jobs |
| to complete and the return an exit status of zero. |
| .SH EXAMPLES |
| The following function redefines the \fIcd\fR command: |
| .d |
| cd() { |
| if bltin cd "$@" |
| then if test -f .enter |
| then . .enter |
| else return 0 |
| fi |
| fi |
| } |
| .e |
| This function causes the file ``.enter'' to be read when you enter a |
| directory, if it exists. The \fIbltin\fR command is used to access the |
| real \fIcd\fR command. The ``return 0'' ensures that the function will |
| return an exit status of zero if it successfully changes to a directory |
| that does not contain a ``.enter'' file. Redefining existing commands |
| is not always a good idea, but this example shows that you can do it if |
| you want to. |
| .PP |
| The suspend function distributed with |
| .I ash |
| looks like |
| .d |
| # Copyright (C) 1989 by Kenneth Almquist. All rights reserved. |
| # This file is part of ash, which is distributed under the terms |
| # specified by the Ash General Public License. |
| |
| suspend() { |
| local - |
| set +j |
| kill -TSTP 0 |
| } |
| .e |
| This turns off job control and then sends a stop signal to the current |
| process group, which suspends the shell. (When job control is turned |
| on, the shell ignores the TSTP signal.) Job control will be turned back |
| on when the function returns because ``-'' is local to the function. |
| As an example of what \fInot\fR to do, consider an earlier version of |
| \fIsuspend\fR: |
| .d |
| suspend() { |
| suspend_flag=$- |
| set +j |
| kill -TSTP 0 |
| set -$suspend_flag |
| } |
| .e |
| There are two problems with this. First, \fBsuspend_flag\fR is a global |
| variable rather than a local one, which will cause problems in the |
| (unlikely) circumstance that the user is using that variable for some |
| other purpose. Second, consider what happens if shell received an interrupt |
| signal after it executes the first \fIset\fR command but before it executes |
| the second one. The interrupt signal will abort the shell function, so |
| that the second \fIset\fR command will never be executed and job control |
| will be left off. The first version of \fIsuspend\fR avoids this problem |
| by turning job control off only in a local copy of the shell options. The |
| local copy of the shell options is discarded when the function is terminated, |
| no matter how it is terminated. |
| .SH HINTS |
| Shell variables can be used to provide abbreviations for things which |
| you type frequently. For example, I set |
| .br |
| \h'1i'export h=$HOME |
| .br |
| in my .profile so that I can type the name of my home directory simply |
| by typing ``$h''. |
| .PP |
| When writing shell procedures, try not to make assumptions about what is |
| imported from the environment. Explicitly unset or initialize all variables, |
| rather than assuming they will be unset. If you use cd, it is a good idea |
| to unset CDPATH. |
| .PP |
| People sometimes use ``<&-'' or ``>&-'' to provide no input to a command |
| or to discard the output of a command. A better way to do this is |
| to redirect the input or output of the command to |
| .BR /dev/null . |
| .PP |
| Word splitting and file name generation are performed by default, |
| and you have to explicitly use double quotes to suppress it. This is |
| backwards, but you can learn to live with it. Just get in the habit of |
| writing double quotes around variable and command substitutions, and |
| omit them only when you really want word splitting and file name generation. |
| If you want word splitting but not file name generation, use the |
| .B -f |
| option. |
| .SH AUTHORS |
| Kenneth Almquist |
| .SH "SEE ALSO" |
| echo(1), expr(1), line(1), pwd(1), true(1). |
| .SH BUGS |
| When command substitution occurs inside a here document, the commands inside |
| the here document are run with their standard input closed. For example, |
| the following will not word because the standard input of the |
| .I line |
| command will be closed when the command is run: |
| .d |
| cat <<-! |
| Line 1: $(line) |
| Line 2: $(line) |
| ! |
| .e |
| .PP |
| Unsetting a function which is currently being executed may cause strange |
| behavior. |
| .PP |
| The shell syntax allows a here document to be terminated by an end of file |
| as well as by a line containing the terminator word which follows the ``<<''. |
| What this means is that if you mistype the terminator line, the shell |
| will silently swallow up the rest of your shell script and stick it |
| in the here document. |