8167 lines
		
	
	
	
		
			291 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			8167 lines
		
	
	
	
		
			291 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| \input texinfo.tex @c -*- texinfo -*-
 | |
| @c %**start of header
 | |
| @setfilename bashref.info
 | |
| @settitle Bash Reference Manual
 | |
| @c %**end of header
 | |
| 
 | |
| @setchapternewpage odd
 | |
| 
 | |
| @include version.texi
 | |
| 
 | |
| @copying
 | |
| This text is a brief description of the features that are present in
 | |
| the Bash shell (version @value{VERSION}, @value{UPDATED}).
 | |
| 
 | |
| This is Edition @value{EDITION}, last updated @value{UPDATED},
 | |
| of @cite{The GNU Bash Reference Manual},
 | |
| for @code{Bash}, Version @value{VERSION}.
 | |
| 
 | |
| Copyright @copyright{} 1988--2011 Free Software Foundation, Inc.
 | |
| 
 | |
| Permission is granted to make and distribute verbatim copies of
 | |
| this manual provided the copyright notice and this permission notice
 | |
| are preserved on all copies.
 | |
| 
 | |
| @quotation
 | |
| Permission is granted to copy, distribute and/or modify this document
 | |
| under the terms of the GNU Free Documentation License, Version 1.3 or
 | |
| any later version published by the Free Software Foundation; with no
 | |
| Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
 | |
| and with the Back-Cover Texts as in (a) below.  A copy of the license is
 | |
| included in the section entitled ``GNU Free Documentation License''.
 | |
| 
 | |
| (a) The FSF's Back-Cover Text is: You are free to copy and modify
 | |
| this GNU manual.  Buying copies from GNU Press supports the FSF in
 | |
| developing GNU and promoting software freedom.''
 | |
| 
 | |
| @end quotation
 | |
| @end copying
 | |
| 
 | |
| @defcodeindex bt
 | |
| @defcodeindex rw
 | |
| @set BashFeatures
 | |
| 
 | |
| @dircategory Basics
 | |
| @direntry
 | |
| * Bash: (bash).                     The GNU Bourne-Again SHell.
 | |
| @end direntry
 | |
| 
 | |
| @finalout
 | |
| 
 | |
| @titlepage
 | |
| @title Bash Reference Manual
 | |
| @subtitle Reference Documentation for Bash
 | |
| @subtitle Edition @value{EDITION}, for @code{Bash} Version @value{VERSION}.
 | |
| @subtitle @value{UPDATED-MONTH}
 | |
| @author Chet Ramey, Case Western Reserve University
 | |
| @author Brian Fox, Free Software Foundation
 | |
| 
 | |
| @page
 | |
| @vskip 0pt plus 1filll
 | |
| @insertcopying
 | |
| 
 | |
| @sp 1
 | |
| Published by the Free Software Foundation @*
 | |
| 59 Temple Place, Suite 330, @*
 | |
| Boston, MA 02111-1307 @*
 | |
| USA @*
 | |
| 
 | |
| @end titlepage
 | |
| 
 | |
| @contents
 | |
| 
 | |
| @ifnottex
 | |
| @node Top, Introduction, (dir), (dir)
 | |
| @top Bash Features
 | |
| 
 | |
| This text is a brief description of the features that are present in
 | |
| the Bash shell (version @value{VERSION}, @value{UPDATED}).
 | |
| 
 | |
| This is Edition @value{EDITION}, last updated @value{UPDATED},
 | |
| of @cite{The GNU Bash Reference Manual},
 | |
| for @code{Bash}, Version @value{VERSION}.
 | |
| 
 | |
| Bash contains features that appear in other popular shells, and some
 | |
| features that only appear in Bash.  Some of the shells that Bash has
 | |
| borrowed concepts from are the Bourne Shell (@file{sh}), the Korn Shell
 | |
| (@file{ksh}), and the C-shell (@file{csh} and its successor,
 | |
| @file{tcsh}). The following menu breaks the features up into
 | |
| categories based upon which one of these other shells inspired the
 | |
| feature.
 | |
| 
 | |
| This manual is meant as a brief introduction to features found in
 | |
| Bash.  The Bash manual page should be used as the definitive
 | |
| reference on shell behavior.
 | |
| 
 | |
| @menu
 | |
| * Introduction::		An introduction to the shell.
 | |
| * Definitions::			Some definitions used in the rest of this
 | |
| 				manual.
 | |
| * Basic Shell Features::	The shell "building blocks".
 | |
| * Shell Builtin Commands::	Commands that are a part of the shell.
 | |
| * Shell Variables::		Variables used or set by Bash.
 | |
| * Bash Features::		Features found only in Bash.
 | |
| * Job Control::			What job control is and how Bash allows you
 | |
| 				to use it.
 | |
| * Command Line Editing::	Chapter describing the command line
 | |
| 				editing features.
 | |
| * Using History Interactively::	Command History Expansion
 | |
| * Installing Bash::		How to build and install Bash on your system.
 | |
| * Reporting Bugs::		How to report bugs in Bash.
 | |
| * Major Differences From The Bourne Shell::	A terse list of the differences
 | |
| 						between Bash and historical
 | |
| 						versions of /bin/sh.
 | |
| * GNU Free Documentation License::	Copying and sharing this documentation.
 | |
| * Indexes::			Various indexes for this manual.
 | |
| @end menu
 | |
| @end ifnottex
 | |
| 
 | |
| @node Introduction
 | |
| @chapter Introduction
 | |
| @menu
 | |
| * What is Bash?::		A short description of Bash.
 | |
| * What is a shell?::		A brief introduction to shells.
 | |
| @end menu
 | |
| 
 | |
| @node What is Bash?
 | |
| @section What is Bash?
 | |
| 
 | |
| Bash is the shell, or command language interpreter,
 | |
| for the @sc{gnu} operating system.
 | |
| The name is an acronym for the @samp{Bourne-Again SHell},
 | |
| a pun on Stephen Bourne, the author of the direct ancestor of
 | |
| the current Unix shell @code{sh}, 
 | |
| which appeared in the Seventh Edition Bell Labs Research version
 | |
| of Unix.
 | |
| 
 | |
| Bash is largely compatible with @code{sh} and incorporates useful
 | |
| features from the Korn shell @code{ksh} and the C shell @code{csh}.
 | |
| It is intended to be a conformant implementation of the @sc{ieee}
 | |
| @sc{posix} Shell and Tools portion of the @sc{ieee} @sc{posix}
 | |
| specification (@sc{ieee} Standard 1003.1).
 | |
| It offers functional improvements over @code{sh} for both interactive and
 | |
| programming use.
 | |
| 
 | |
| While the @sc{gnu} operating system provides other shells, including
 | |
| a version of @code{csh}, Bash is the default shell.
 | |
| Like other @sc{gnu} software, Bash is quite portable.  It currently runs
 | |
| on nearly every version of Unix and a few other operating systems @minus{}
 | |
| independently-supported ports exist for @sc{ms-dos}, @sc{os/2},
 | |
| and Windows platforms.
 | |
| 
 | |
| @node What is a shell?
 | |
| @section What is a shell?
 | |
| 
 | |
| At its base, a shell is simply a macro processor that executes
 | |
| commands.  The term macro processor means functionality where text
 | |
| and symbols are expanded to create larger expressions.
 | |
| 
 | |
| A Unix shell is both a command interpreter and a programming
 | |
| language.  As a command interpreter, the shell provides the user
 | |
| interface to the rich set of @sc{gnu} utilities.  The programming
 | |
| language features allow these utilities to be combined.
 | |
| Files containing commands can be created, and become
 | |
| commands themselves.  These new commands have the same status as
 | |
| system commands in directories such as @file{/bin}, allowing users
 | |
| or groups to establish custom environments to automate their common
 | |
| tasks.
 | |
| 
 | |
| Shells may be used interactively or non-interactively.  In
 | |
| interactive mode, they accept input typed from the keyboard.
 | |
| When executing non-interactively, shells execute commands read
 | |
| from a file.
 | |
| 
 | |
| A shell allows execution of @sc{gnu} commands, both synchronously and
 | |
| asynchronously.
 | |
| The shell waits for synchronous commands to complete before accepting
 | |
| more input; asynchronous commands continue to execute in parallel
 | |
| with the shell while it reads and executes additional commands.
 | |
| The @dfn{redirection} constructs permit
 | |
| fine-grained control of the input and output of those commands.
 | |
| Moreover, the shell allows control over the contents of commands'
 | |
| environments.
 | |
| 
 | |
| Shells also provide a small set of built-in
 | |
| commands (@dfn{builtins}) implementing functionality impossible
 | |
| or inconvenient to obtain via separate utilities.
 | |
| For example, @code{cd}, @code{break}, @code{continue}, and
 | |
| @code{exec}) cannot be implemented outside of the shell because
 | |
| they directly manipulate the shell itself.
 | |
| The @code{history}, @code{getopts}, @code{kill}, or @code{pwd}
 | |
| builtins, among others, could be implemented in separate utilities,
 | |
| but they are more convenient to use as builtin commands.
 | |
| All of the shell builtins are described in
 | |
| subsequent sections.
 | |
| 
 | |
| While executing commands is essential, most of the power (and
 | |
| complexity) of shells is due to their embedded programming
 | |
| languages.  Like any high-level language, the shell provides
 | |
| variables, flow control constructs, quoting, and functions. 
 | |
| 
 | |
| Shells offer features geared specifically for
 | |
| interactive use rather than to augment the programming language. 
 | |
| These interactive features include job control, command line
 | |
| editing, command history and aliases.  Each of these features is
 | |
| described in this manual.
 | |
| 
 | |
| @node Definitions
 | |
| @chapter Definitions
 | |
| These definitions are used throughout the remainder of this manual.
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item POSIX
 | |
| @cindex POSIX
 | |
| A family of open system standards based on Unix.  Bash
 | |
| is primarily concerned with the Shell and Utilities portion of the
 | |
| @sc{posix} 1003.1 standard. 
 | |
| 
 | |
| @item blank
 | |
| A space or tab character.
 | |
| 
 | |
| @item builtin
 | |
| @cindex builtin
 | |
| A command that is implemented internally by the shell itself, rather
 | |
| than by an executable program somewhere in the file system.
 | |
| 
 | |
| @item control operator
 | |
| @cindex control operator
 | |
| A @code{token} that performs a control function.  It is a @code{newline}
 | |
| or one of the following:
 | |
| @samp{||}, @samp{&&}, @samp{&}, @samp{;}, @samp{;;},
 | |
| @samp{|}, @samp{|&}, @samp{(}, or @samp{)}.
 | |
| 
 | |
| @item exit status
 | |
| @cindex exit status
 | |
| The value returned by a command to its caller.  The value is restricted
 | |
| to eight bits, so the maximum value is 255.
 | |
| 
 | |
| @item field
 | |
| @cindex field
 | |
| A unit of text that is the result of one of the shell expansions.  After
 | |
| expansion, when executing a command, the resulting fields are used as
 | |
| the command name and arguments.
 | |
| 
 | |
| @item filename
 | |
| @cindex filename
 | |
| A string of characters used to identify a file.
 | |
| 
 | |
| @item job
 | |
| @cindex job
 | |
| A set of processes comprising a pipeline, and any processes descended
 | |
| from it, that are all in the same process group.
 | |
| 
 | |
| @item job control
 | |
| @cindex job control
 | |
| A mechanism by which users can selectively stop (suspend) and restart
 | |
| (resume) execution of processes.
 | |
| 
 | |
| @item metacharacter
 | |
| @cindex metacharacter
 | |
| A character that, when unquoted, separates words.  A metacharacter is
 | |
| a @code{blank} or one of the following characters:
 | |
| @samp{|}, @samp{&}, @samp{;}, @samp{(}, @samp{)}, @samp{<}, or
 | |
| @samp{>}.
 | |
| 
 | |
| @item name
 | |
| @cindex name
 | |
| @cindex identifier
 | |
| A @code{word} consisting solely of letters, numbers, and underscores,
 | |
| and beginning with a letter or underscore.  @code{Name}s are used as
 | |
| shell variable and function names.
 | |
| Also referred to as an @code{identifier}.
 | |
| 
 | |
| @item operator
 | |
| @cindex operator, shell
 | |
| A @code{control operator} or a @code{redirection operator}.
 | |
| @xref{Redirections}, for a list of redirection operators.
 | |
| Operators contain at least one unquoted @code{metacharacter}.
 | |
| 
 | |
| @item process group
 | |
| @cindex process group
 | |
| A collection of related processes each having the same process
 | |
| group @sc{id}.
 | |
| 
 | |
| @item process group ID
 | |
| @cindex process group ID
 | |
| A unique identifier that represents a @code{process group}
 | |
| during its lifetime.
 | |
| 
 | |
| @item reserved word
 | |
| @cindex reserved word
 | |
| A @code{word} that has a special meaning to the shell.  Most reserved
 | |
| words introduce shell flow control constructs, such as @code{for} and
 | |
| @code{while}.
 | |
| 
 | |
| @item return status
 | |
| @cindex return status
 | |
| A synonym for @code{exit status}.
 | |
| 
 | |
| @item signal
 | |
| @cindex signal
 | |
| A mechanism by which a process may be notified by the kernel
 | |
| of an event occurring in the system.
 | |
| 
 | |
| @item special builtin
 | |
| @cindex special builtin
 | |
| A shell builtin command that has been classified as special by the
 | |
| @sc{posix} standard.
 | |
| 
 | |
| @item token
 | |
| @cindex token
 | |
| A sequence of characters considered a single unit by the shell.
 | |
| It is either a @code{word} or an @code{operator}.
 | |
| 
 | |
| @item word
 | |
| @cindex word
 | |
| A sequence of characters treated as a unit by the shell.
 | |
| Words may not include unquoted @code{metacharacters}.
 | |
| @end table
 | |
| 
 | |
| @node Basic Shell Features
 | |
| @chapter Basic Shell Features
 | |
| @cindex Bourne shell
 | |
| 
 | |
| Bash is an acronym for @samp{Bourne-Again SHell}.
 | |
| The Bourne shell is
 | |
| the traditional Unix shell originally written by Stephen Bourne.
 | |
| All of the Bourne shell builtin commands are available in Bash,
 | |
| The rules for evaluation and quoting are taken from the @sc{posix}
 | |
| specification for the `standard' Unix shell.
 | |
| 
 | |
| This chapter briefly summarizes the shell's `building blocks':
 | |
| commands, control structures, shell functions, shell @i{parameters},
 | |
| shell expansions,
 | |
| @i{redirections}, which are a way to direct input and output from
 | |
| and to named files, and how the shell executes commands.
 | |
| 
 | |
| @menu
 | |
| * Shell Syntax::		What your input means to the shell.
 | |
| * Shell Commands::		The types of commands you can use.
 | |
| * Shell Functions::		Grouping commands by name.
 | |
| * Shell Parameters::		How the shell stores values.
 | |
| * Shell Expansions::		How Bash expands parameters and the various
 | |
| 				expansions available.
 | |
| * Redirections::		A way to control where input and output go.
 | |
| * Executing Commands::		What happens when you run a command.
 | |
| * Shell Scripts::		Executing files of shell commands.
 | |
| @end menu
 | |
| 
 | |
| @node Shell Syntax
 | |
| @section Shell Syntax
 | |
| @menu
 | |
| * Shell Operation::	The basic operation of the shell.
 | |
| * Quoting::		How to remove the special meaning from characters.
 | |
| * Comments::		How to specify comments.
 | |
| @end menu
 | |
| 
 | |
| When the shell reads input, it proceeds through a
 | |
| sequence of operations.  If the input indicates the beginning of a
 | |
| comment, the shell ignores the comment symbol (@samp{#}), and the rest
 | |
| of that line.
 | |
|                                 
 | |
| Otherwise, roughly speaking,  the shell reads its input and
 | |
| divides the input into words and operators, employing the quoting rules
 | |
| to select which meanings to assign various words and characters.
 | |
| 
 | |
| The shell then parses these tokens into commands and other constructs,
 | |
| removes the special meaning of certain words or characters, expands
 | |
| others, redirects input and output as needed, executes the specified
 | |
| command, waits for the command's exit status, and makes that exit status
 | |
| available for further inspection or processing.
 | |
| 
 | |
| @node Shell Operation
 | |
| @subsection Shell Operation
 | |
| 
 | |
| The following is a brief description of the shell's operation when it
 | |
| reads and executes a command.  Basically, the shell does the
 | |
| following:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| Reads its input from a file (@pxref{Shell Scripts}), from a string
 | |
| supplied as an argument to the @option{-c} invocation option
 | |
| (@pxref{Invoking Bash}), or from the user's terminal.
 | |
| 
 | |
| @item
 | |
| Breaks the input into words and operators, obeying the quoting rules
 | |
| described in @ref{Quoting}.  These tokens are separated by
 | |
| @code{metacharacters}.  Alias expansion is performed by this step
 | |
| (@pxref{Aliases}).
 | |
| 
 | |
| @item
 | |
| Parses the tokens into simple and compound commands
 | |
| (@pxref{Shell Commands}).
 | |
| 
 | |
| @item
 | |
| Performs the various shell expansions (@pxref{Shell Expansions}), breaking
 | |
| the expanded tokens into lists of filenames (@pxref{Filename Expansion})
 | |
| and commands and arguments.
 | |
| 
 | |
| @item
 | |
| Performs any necessary redirections (@pxref{Redirections}) and removes
 | |
| the redirection operators and their operands from the argument list.
 | |
| 
 | |
| @item
 | |
| Executes the command (@pxref{Executing Commands}).
 | |
| 
 | |
| @item
 | |
| Optionally waits for the command to complete and collects its exit
 | |
| status (@pxref{Exit Status}).
 | |
| 
 | |
| @end enumerate
 | |
| 
 | |
| @node Quoting
 | |
| @subsection Quoting
 | |
| @cindex quoting
 | |
| @menu
 | |
| * Escape Character::	How to remove the special meaning from a single
 | |
| 			character.
 | |
| * Single Quotes::	How to inhibit all interpretation of a sequence
 | |
| 			of characters.
 | |
| * Double Quotes::	How to suppress most of the interpretation of a
 | |
| 			sequence of characters.
 | |
| * ANSI-C Quoting::	How to expand ANSI-C sequences in quoted strings.
 | |
| * Locale Translation::	How to translate strings into different languages.
 | |
| @end menu
 | |
| 
 | |
| Quoting is used to remove the special meaning of certain
 | |
| characters or words to the shell.  Quoting can be used to
 | |
| disable special treatment for special characters, to prevent
 | |
| reserved words from being recognized as such, and to prevent
 | |
| parameter expansion.
 | |
| 
 | |
| Each of the shell metacharacters (@pxref{Definitions})
 | |
| has special meaning to the shell and must be quoted if it is to
 | |
| represent itself.
 | |
| When the command history expansion facilities are being used
 | |
| (@pxref{History Interaction}), the
 | |
| @var{history expansion} character, usually @samp{!}, must be quoted
 | |
| to prevent history expansion.  @xref{Bash History Facilities}, for
 | |
| more details concerning history expansion.
 | |
| 
 | |
| There are three quoting mechanisms: the
 | |
| @var{escape character}, single quotes, and double quotes.
 | |
| 
 | |
| @node Escape Character
 | |
| @subsubsection Escape Character
 | |
| A non-quoted backslash @samp{\} is the Bash escape character.
 | |
| It preserves the literal value of the next character that follows,
 | |
| with the exception of @code{newline}.  If a @code{\newline} pair
 | |
| appears, and the backslash itself is not quoted, the @code{\newline}
 | |
| is treated as a line continuation (that is, it is removed from
 | |
| the input stream and effectively ignored).
 | |
| 
 | |
| @node Single Quotes
 | |
| @subsubsection Single Quotes
 | |
| 
 | |
| Enclosing characters in single quotes (@samp{'}) preserves the literal value
 | |
| of each character within the quotes.  A single quote may not occur
 | |
| between single quotes, even when preceded by a backslash.
 | |
| 
 | |
| @node Double Quotes
 | |
| @subsubsection Double Quotes
 | |
| 
 | |
| Enclosing characters in double quotes (@samp{"}) preserves the literal value
 | |
| of all characters within the quotes, with the exception of
 | |
| @samp{$}, @samp{`}, @samp{\},
 | |
| and, when history expansion is enabled, @samp{!}.
 | |
| The characters @samp{$} and @samp{`}
 | |
| retain their special meaning within double quotes (@pxref{Shell Expansions}).
 | |
| The backslash retains its special meaning only when followed by one of
 | |
| the following characters:
 | |
| @samp{$}, @samp{`}, @samp{"}, @samp{\}, or @code{newline}.
 | |
| Within double quotes, backslashes that are followed by one of these
 | |
| characters are removed.  Backslashes preceding characters without a
 | |
| special meaning are left unmodified.
 | |
| A double quote may be quoted within double quotes by preceding it with
 | |
| a backslash.
 | |
| If enabled, history expansion will be performed unless an @samp{!}
 | |
| appearing in double quotes is escaped using a backslash.
 | |
| The backslash preceding the @samp{!} is not removed.
 | |
| 
 | |
| The special parameters @samp{*} and @samp{@@} have special meaning
 | |
| when in double quotes (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @node ANSI-C Quoting
 | |
| @subsubsection ANSI-C Quoting
 | |
| @cindex quoting, ANSI
 | |
| 
 | |
| Words of the form @code{$'@var{string}'} are treated specially.  The
 | |
| word expands to @var{string}, with backslash-escaped characters replaced
 | |
| as specified by the ANSI C standard.  Backslash escape sequences, if
 | |
| present, are decoded as follows:
 | |
| 
 | |
| @table @code
 | |
| @item \a
 | |
| alert (bell)
 | |
| @item \b
 | |
| backspace
 | |
| @item \e
 | |
| @itemx \E
 | |
| an escape character (not ANSI C)
 | |
| @item \f
 | |
| form feed
 | |
| @item \n
 | |
| newline
 | |
| @item \r
 | |
| carriage return
 | |
| @item \t
 | |
| horizontal tab
 | |
| @item \v
 | |
| vertical tab
 | |
| @item \\
 | |
| backslash
 | |
| @item \'
 | |
| single quote
 | |
| @item \"
 | |
| double quote
 | |
| @item \@var{nnn}
 | |
| the eight-bit character whose value is the octal value @var{nnn}
 | |
| (one to three digits)
 | |
| @item \x@var{HH}
 | |
| the eight-bit character whose value is the hexadecimal value @var{HH}
 | |
| (one or two hex digits)
 | |
| @item \u@var{HHHH}
 | |
| the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value
 | |
| @var{HHHH} (one to four hex digits)
 | |
| @item \U@var{HHHHHHHH}
 | |
| the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value
 | |
| @var{HHHHHHHH} (one to eight hex digits)
 | |
| @item \c@var{x}
 | |
| a control-@var{x} character
 | |
| @end table
 | |
| 
 | |
| @noindent
 | |
| The expanded result is single-quoted, as if the dollar sign had not
 | |
| been present.
 | |
| 
 | |
| @node Locale Translation
 | |
| @subsubsection Locale-Specific Translation
 | |
| @cindex localization
 | |
| @cindex internationalization
 | |
| @cindex native languages
 | |
| @cindex translation, native languages
 | |
| 
 | |
| A double-quoted string preceded by a dollar sign (@samp{$}) will cause
 | |
| the string to be translated according to the current locale.
 | |
| If the current locale is @code{C} or @code{POSIX}, the dollar sign
 | |
| is ignored.
 | |
| If the string is translated and replaced, the replacement is
 | |
| double-quoted.
 | |
| 
 | |
| @vindex LC_MESSAGES
 | |
| @vindex TEXTDOMAIN
 | |
| @vindex TEXTDOMAINDIR
 | |
| Some systems use the message catalog selected by the @env{LC_MESSAGES}
 | |
| shell variable.  Others create the name of the message catalog from the
 | |
| value of the @env{TEXTDOMAIN} shell variable, possibly adding a
 | |
| suffix of @samp{.mo}.  If you use the @env{TEXTDOMAIN} variable, you
 | |
| may need to set the @env{TEXTDOMAINDIR} variable to the location of
 | |
| the message catalog files.  Still others use both variables in this
 | |
| fashion:
 | |
| @env{TEXTDOMAINDIR}/@env{LC_MESSAGES}/LC_MESSAGES/@env{TEXTDOMAIN}.mo.
 | |
| 
 | |
| @node Comments
 | |
| @subsection Comments
 | |
| @cindex comments, shell
 | |
| 
 | |
| In a non-interactive shell, or an interactive shell in which the
 | |
| @code{interactive_comments} option to the @code{shopt}
 | |
| builtin is enabled (@pxref{The Shopt Builtin}),
 | |
| a word beginning with @samp{#}
 | |
| causes that word and all remaining characters on that line to
 | |
| be ignored.  An interactive shell without the @code{interactive_comments}
 | |
| option enabled does not allow comments.  The @code{interactive_comments}
 | |
| option is on by default in interactive shells.
 | |
| @xref{Interactive Shells}, for a description of what makes
 | |
| a shell interactive.
 | |
| 
 | |
| @node Shell Commands
 | |
| @section Shell Commands
 | |
| @cindex commands, shell
 | |
| 
 | |
| A simple shell command such as @code{echo a b c} consists of the command
 | |
| itself followed by arguments, separated by spaces.
 | |
| 
 | |
| More complex shell commands are composed of simple commands arranged together
 | |
| in a variety of ways: in a pipeline in which the output of one command
 | |
| becomes the input of a second, in a loop or conditional construct, or in
 | |
| some other grouping.
 | |
| 
 | |
| @menu
 | |
| * Simple Commands::		The most common type of command.
 | |
| * Pipelines::			Connecting the input and output of several
 | |
| 				commands.
 | |
| * Lists::			How to execute commands sequentially.
 | |
| * Compound Commands::		Shell commands for control flow.
 | |
| * Coprocesses::			Two-way communication between commands.
 | |
| * GNU Parallel::		Running commands in parallel.
 | |
| @end menu
 | |
| 
 | |
| @node Simple Commands
 | |
| @subsection Simple Commands
 | |
| @cindex commands, simple
 | |
| 
 | |
| A simple command is the kind of command encountered most often.
 | |
| It's just a sequence of words separated by @code{blank}s, terminated
 | |
| by one of the shell's control operators (@pxref{Definitions}).  The
 | |
| first word generally specifies a command to be executed, with the
 | |
| rest of the words being that command's arguments.
 | |
| 
 | |
| The return status (@pxref{Exit Status}) of a simple command is
 | |
| its exit status as provided
 | |
| by the @sc{posix} 1003.1 @code{waitpid} function, or 128+@var{n} if
 | |
| the command was terminated by signal @var{n}.
 | |
| 
 | |
| @node Pipelines
 | |
| @subsection Pipelines
 | |
| @cindex pipeline
 | |
| @cindex commands, pipelines
 | |
| 
 | |
| A @code{pipeline} is a sequence of simple commands separated by one of
 | |
| the control operators @samp{|} or @samp{|&}.
 | |
| 
 | |
| @rwindex time
 | |
| @rwindex !
 | |
| @cindex command timing
 | |
| The format for a pipeline is
 | |
| @example
 | |
| [@code{time} [@code{-p}]] [@code{!}] @var{command1} [ [@code{|} or @code{|&}] @var{command2} @dots{}]
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| The output of each command in the pipeline is connected via a pipe
 | |
| to the input of the next command.
 | |
| That is, each command reads the previous command's output.  This
 | |
| connection is performed before any redirections specified by the
 | |
| command.
 | |
| 
 | |
| If @samp{|&} is used, the standard error of @var{command1} is connected to
 | |
| @var{command2}'s standard input through the pipe; it is shorthand for
 | |
| @code{2>&1 |}.  This implicit redirection of the standard error is
 | |
| performed after any redirections specified by the command.
 | |
| 
 | |
| The reserved word @code{time} causes timing statistics
 | |
| to be printed for the pipeline once it finishes.
 | |
| The statistics currently consist of elapsed (wall-clock) time and
 | |
| user and system time consumed by the command's execution.
 | |
| The @option{-p} option changes the output format to that specified
 | |
| by @sc{posix}.
 | |
| When the shell is in @sc{posix} mode (@pxref{Bash POSIX Mode}),
 | |
| it does not recognize @code{time} as a reserved word if the next
 | |
| token begins with a @samp{-}.
 | |
| The @env{TIMEFORMAT} variable may be set to a format string that
 | |
| specifies how the timing information should be displayed.
 | |
| @xref{Bash Variables}, for a description of the available formats.
 | |
| The use of @code{time} as a reserved word permits the timing of
 | |
| shell builtins, shell functions, and pipelines.  An external
 | |
| @code{time} command cannot time these easily.
 | |
| 
 | |
| When the shell is in @sc{posix} mode (@pxref{Bash POSIX Mode}), @code{time}
 | |
| may be followed by a newline.  In this case, the shell displays the
 | |
| total user and system time consumed by the shell and its children.
 | |
| The @env{TIMEFORMAT} variable may be used to specify the format of
 | |
| the time information.
 | |
| 
 | |
| If the pipeline is not executed asynchronously (@pxref{Lists}), the
 | |
| shell waits for all commands in the pipeline to complete.
 | |
| 
 | |
| Each command in a pipeline is executed in its own subshell
 | |
| (@pxref{Command Execution Environment}).  The exit
 | |
| status of a pipeline is the exit status of the last command in the
 | |
| pipeline, unless the @code{pipefail} option is enabled
 | |
| (@pxref{The Set Builtin}).
 | |
| If @code{pipefail} is enabled, the pipeline's return status is the
 | |
| value of the last (rightmost) command to exit with a non-zero status,
 | |
| or zero if all commands exit successfully.
 | |
| If the reserved word @samp{!} precedes the pipeline, the
 | |
| exit status is the logical negation of the exit status as described
 | |
| above.
 | |
| The shell waits for all commands in the pipeline to terminate before
 | |
| returning a value.
 | |
| 
 | |
| @node Lists
 | |
| @subsection Lists of Commands
 | |
| @cindex commands, lists
 | |
| 
 | |
| A @code{list} is a sequence of one or more pipelines separated by one
 | |
| of the operators @samp{;}, @samp{&}, @samp{&&}, or @samp{||},
 | |
| and optionally terminated by one of @samp{;}, @samp{&}, or a
 | |
| @code{newline}.
 | |
| 
 | |
| Of these list operators, @samp{&&} and @samp{||}
 | |
| have equal precedence, followed by @samp{;} and @samp{&},
 | |
| which have equal precedence.
 | |
| 
 | |
| A sequence of one or more newlines may appear in a @code{list}
 | |
| to delimit commands, equivalent to a semicolon.
 | |
| 
 | |
| If a command is terminated by the control operator @samp{&},
 | |
| the shell executes the command asynchronously in a subshell.
 | |
| This is known as executing the command in the @var{background}.
 | |
| The shell does not wait for the command to finish, and the return
 | |
| status is 0 (true).
 | |
| When job control is not active (@pxref{Job Control}),
 | |
| the standard input for asynchronous commands, in the absence of any
 | |
| explicit redirections, is redirected from @code{/dev/null}.
 | |
| 
 | |
| Commands separated by a @samp{;} are executed sequentially; the shell
 | |
| waits for each command to terminate in turn.  The return status is the
 | |
| exit status of the last command executed.
 | |
| 
 | |
| @sc{and} and @sc{or} lists are sequences of one or more pipelines
 | |
| separated by the control operators @samp{&&} and @samp{||},
 | |
| respectively.  @sc{and} and @sc{or} lists are executed with left
 | |
| associativity.
 | |
| 
 | |
| An @sc{and} list has the form
 | |
| @example
 | |
| @var{command1} && @var{command2}
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| @var{command2} is executed if, and only if, @var{command1}
 | |
| returns an exit status of zero.
 | |
| 
 | |
| An @sc{or} list has the form
 | |
| @example
 | |
| @var{command1} || @var{command2}
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| @var{command2} is executed if, and only if, @var{command1}
 | |
| returns a non-zero exit status.
 | |
| 
 | |
| The return status of
 | |
| @sc{and} and @sc{or} lists is the exit status of the last command
 | |
| executed in the list.
 | |
| 
 | |
| @node Compound Commands
 | |
| @subsection Compound Commands
 | |
| @cindex commands, compound
 | |
| 
 | |
| @menu
 | |
| * Looping Constructs::		Shell commands for iterative action.
 | |
| * Conditional Constructs::	Shell commands for conditional execution.
 | |
| * Command Grouping::		Ways to group commands.
 | |
| @end menu
 | |
| 
 | |
| Compound commands are the shell programming constructs.
 | |
| Each construct begins with a reserved word or control operator and is
 | |
| terminated by a corresponding reserved word or operator.
 | |
| Any redirections (@pxref{Redirections}) associated with a compound command
 | |
| apply to all commands within that compound command unless explicitly overridden.
 | |
| 
 | |
| Bash provides looping constructs, conditional commands, and mechanisms
 | |
| to group commands and execute them as a unit.
 | |
| 
 | |
| @node Looping Constructs
 | |
| @subsubsection Looping Constructs
 | |
| @cindex commands, looping
 | |
| 
 | |
| Bash supports the following looping constructs.
 | |
| 
 | |
| Note that wherever a @samp{;} appears in the description of a
 | |
| command's syntax, it may be replaced with one or more newlines.
 | |
| 
 | |
| @table @code
 | |
| @item until
 | |
| @rwindex until
 | |
| @rwindex do
 | |
| @rwindex done
 | |
| The syntax of the @code{until} command is:
 | |
| @example
 | |
| until @var{test-commands}; do @var{consequent-commands}; done
 | |
| @end example
 | |
| Execute @var{consequent-commands} as long as
 | |
| @var{test-commands} has an exit status which is not zero.
 | |
| The return status is the exit status of the last command executed
 | |
| in @var{consequent-commands}, or zero if none was executed.
 | |
| 
 | |
| @item while
 | |
| @rwindex while
 | |
| The syntax of the @code{while} command is:
 | |
| @example
 | |
| while @var{test-commands}; do @var{consequent-commands}; done
 | |
| @end example
 | |
| 
 | |
| Execute @var{consequent-commands} as long as
 | |
| @var{test-commands} has an exit status of zero.
 | |
| The return status is the exit status of the last command executed
 | |
| in @var{consequent-commands}, or zero if none was executed.
 | |
| 
 | |
| @item for
 | |
| @rwindex for
 | |
| The syntax of the @code{for} command is:
 | |
| 
 | |
| @example
 | |
| for @var{name} [ [in [@var{words} @dots{}] ] ; ] do @var{commands}; done
 | |
| @end example
 | |
| Expand @var{words}, and execute @var{commands} once for each member
 | |
| in the resultant list, with @var{name} bound to the current member.
 | |
| If @samp{in @var{words}} is not present, the @code{for} command
 | |
| executes the @var{commands} once for each positional parameter that is
 | |
| set, as if @samp{in "$@@"} had been specified
 | |
| (@pxref{Special Parameters}).
 | |
| The return status is the exit status of the last command that executes.
 | |
| If there are no items in the expansion of @var{words}, no commands are
 | |
| executed, and the return status is zero.
 | |
| 
 | |
| An alternate form of the @code{for} command is also supported:
 | |
| 
 | |
| @example
 | |
| for (( @var{expr1} ; @var{expr2} ; @var{expr3} )) ; do @var{commands} ; done
 | |
| @end example
 | |
| First, the arithmetic expression @var{expr1} is evaluated according
 | |
| to the rules described below (@pxref{Shell Arithmetic}).
 | |
| The arithmetic expression @var{expr2} is then evaluated repeatedly
 | |
| until it evaluates to zero.   
 | |
| Each time @var{expr2} evaluates to a non-zero value, @var{commands} are
 | |
| executed and the arithmetic expression @var{expr3} is evaluated.       
 | |
| If any expression is omitted, it behaves as if it evaluates to 1.
 | |
| The return value is the exit status of the last command in @var{commands}
 | |
| that is executed, or false if any of the expressions is invalid.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| The @code{break} and @code{continue} builtins (@pxref{Bourne Shell Builtins})
 | |
| may be used to control loop execution.
 | |
| 
 | |
| @node Conditional Constructs
 | |
| @subsubsection Conditional Constructs
 | |
| @cindex commands, conditional
 | |
| 
 | |
| @table @code
 | |
| @item if
 | |
| @rwindex if
 | |
| @rwindex then
 | |
| @rwindex else
 | |
| @rwindex elif
 | |
| @rwindex fi
 | |
| The syntax of the @code{if} command is:
 | |
| 
 | |
| @example
 | |
| if @var{test-commands}; then
 | |
|   @var{consequent-commands};
 | |
| [elif @var{more-test-commands}; then
 | |
|   @var{more-consequents};]
 | |
| [else @var{alternate-consequents};]
 | |
| fi
 | |
| @end example
 | |
| 
 | |
| The @var{test-commands} list is executed, and if its return status is zero,
 | |
| the @var{consequent-commands} list is executed.
 | |
| If @var{test-commands} returns a non-zero status, each @code{elif} list
 | |
| is executed in turn, and if its exit status is zero,
 | |
| the corresponding @var{more-consequents} is executed and the   
 | |
| command completes.
 | |
| If @samp{else @var{alternate-consequents}} is present, and
 | |
| the final command in the final @code{if} or @code{elif} clause
 | |
| has a non-zero exit status, then @var{alternate-consequents} is executed.
 | |
| The return status is the exit status of the last command executed, or
 | |
| zero if no condition tested true.
 | |
| 
 | |
| @item case
 | |
| @rwindex case
 | |
| @rwindex in
 | |
| @rwindex esac
 | |
| The syntax of the @code{case} command is:
 | |
| 
 | |
| @example
 | |
| @code{case @var{word} in [ [(] @var{pattern} [| @var{pattern}]@dots{}) @var{command-list} ;;]@dots{} esac}
 | |
| @end example
 | |
| 
 | |
| @code{case} will selectively execute the @var{command-list} corresponding to
 | |
| the first @var{pattern} that matches @var{word}.
 | |
| If the shell option @code{nocasematch}
 | |
| (see the description of @code{shopt} in @ref{The Shopt Builtin})
 | |
| is enabled, the match is performed without regard to the case
 | |
| of alphabetic characters.
 | |
| The @samp{|} is used to separate multiple patterns, and the @samp{)}
 | |
| operator terminates a pattern list.
 | |
| A list of patterns and an associated command-list is known
 | |
| as a @var{clause}.
 | |
| 
 | |
| Each clause must be terminated with @samp{;;}, @samp{;&}, or @samp{;;&}.
 | |
| The @var{word} undergoes tilde expansion, parameter expansion, command
 | |
| substitution, arithmetic expansion, and quote removal before matching is
 | |
| attempted.  Each @var{pattern} undergoes tilde expansion, parameter
 | |
| expansion, command substitution, and arithmetic expansion.
 | |
| 
 | |
| There may be an arbitrary number of @code{case} clauses, each terminated
 | |
| by a @samp{;;}, @samp{;&}, or @samp{;;&}.
 | |
| The first pattern that matches determines the
 | |
| command-list that is executed.
 | |
| 
 | |
| Here is an example using @code{case} in a script that could be used to
 | |
| describe one interesting feature of an animal:
 | |
| 
 | |
| @example
 | |
| echo -n "Enter the name of an animal: "
 | |
| read ANIMAL
 | |
| echo -n "The $ANIMAL has "
 | |
| case $ANIMAL in
 | |
|   horse | dog | cat) echo -n "four";;
 | |
|   man | kangaroo ) echo -n "two";;
 | |
|   *) echo -n "an unknown number of";;
 | |
| esac
 | |
| echo " legs."
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| 
 | |
| If the @samp{;;} operator is used, no subsequent matches are attempted after
 | |
| the first pattern match.
 | |
| Using @samp{;&}  in place of @samp{;;} causes execution to continue with
 | |
| the @var{command-list} associated with the next clause, if any.
 | |
| Using @samp{;;&} in place of @samp{;;} causes the shell to test the patterns
 | |
| in the next clause, if any, and execute any associated @var{command-list}
 | |
| on a successful match.
 | |
| 
 | |
| The return status is zero if no @var{pattern} is matched.  Otherwise, the
 | |
| return status is the exit status of the @var{command-list} executed.
 | |
| 
 | |
| @item select
 | |
| @rwindex select
 | |
| 
 | |
| The @code{select} construct allows the easy generation of menus.
 | |
| It has almost the same syntax as the @code{for} command:
 | |
| 
 | |
| @example
 | |
| select @var{name} [in @var{words} @dots{}]; do @var{commands}; done
 | |
| @end example
 | |
| 
 | |
| The list of words following @code{in} is expanded, generating a list
 | |
| of items.  The set of expanded words is printed on the standard
 | |
| error output stream, each preceded by a number.  If the
 | |
| @samp{in @var{words}} is omitted, the positional parameters are printed,
 | |
| as if @samp{in "$@@"} had been specified.
 | |
| The @env{PS3} prompt is then displayed and a line is read from the
 | |
| standard input.
 | |
| If the line consists of a number corresponding to one of the displayed
 | |
| words, then the value of @var{name} is set to that word.
 | |
| If the line is empty, the words and prompt are displayed again.
 | |
| If @code{EOF} is read, the @code{select} command completes.
 | |
| Any other value read causes @var{name} to be set to null.
 | |
| The line read is saved in the variable @env{REPLY}.
 | |
| 
 | |
| The @var{commands} are executed after each selection until a
 | |
| @code{break} command is executed, at which
 | |
| point the @code{select} command completes.
 | |
| 
 | |
| Here is an example that allows the user to pick a filename from the
 | |
| current directory, and displays the name and index of the file
 | |
| selected.
 | |
| 
 | |
| @example
 | |
| select fname in *;
 | |
| do
 | |
| 	echo you picked $fname \($REPLY\)
 | |
| 	break;
 | |
| done
 | |
| @end example
 | |
| 
 | |
| @item ((@dots{}))
 | |
| @example
 | |
| (( @var{expression} ))
 | |
| @end example
 | |
| 
 | |
| The arithmetic @var{expression} is evaluated according to the rules
 | |
| described below (@pxref{Shell Arithmetic}).
 | |
| If the value of the expression is non-zero, the return status is 0;
 | |
| otherwise the return status is 1.  This is exactly equivalent to
 | |
| @example
 | |
| let "@var{expression}"
 | |
| @end example
 | |
| @noindent
 | |
| @xref{Bash Builtins}, for a full description of the @code{let} builtin.
 | |
| 
 | |
| @item [[@dots{}]]
 | |
| @rwindex [[
 | |
| @rwindex ]]
 | |
| @example
 | |
| [[ @var{expression} ]]
 | |
| @end example
 | |
| 
 | |
| Return a status of 0 or 1 depending on the evaluation of
 | |
| the conditional expression @var{expression}.
 | |
| Expressions are composed of the primaries described below in
 | |
| @ref{Bash Conditional Expressions}.
 | |
| Word splitting and filename expansion are not performed on the words
 | |
| between the @samp{[[} and @samp{]]}; tilde expansion, parameter and
 | |
| variable expansion, arithmetic expansion, command substitution, process
 | |
| substitution, and quote removal are performed.
 | |
| Conditional operators such as @samp{-f} must be unquoted to be recognized
 | |
| as primaries.
 | |
| 
 | |
| When used with @samp{[[}, the @samp{<} and @samp{>} operators sort
 | |
| lexicographically using the current locale.
 | |
| 
 | |
| When the @samp{==} and @samp{!=} operators are used, the string to the
 | |
| right of the operator is considered a pattern and matched according
 | |
| to the rules described below in @ref{Pattern Matching}.
 | |
| If the shell option @code{nocasematch}
 | |
| (see the description of @code{shopt} in @ref{The Shopt Builtin})
 | |
| is enabled, the match is performed without regard to the case
 | |
| of alphabetic characters.
 | |
| The return value is 0 if the string matches (@samp{==}) or does not
 | |
| match (@samp{!=})the pattern, and 1 otherwise.
 | |
| Any part of the pattern may be quoted to force it to be matched as a
 | |
| string.
 | |
| 
 | |
| An additional binary operator, @samp{=~}, is available, with the same
 | |
| precedence as @samp{==} and @samp{!=}.
 | |
| When it is used, the string to the right of the operator is considered
 | |
| an extended regular expression and matched accordingly (as in @i{regex}3)).  
 | |
| The return value is 0 if the string matches
 | |
| the pattern, and 1 otherwise.
 | |
| If the regular expression is syntactically incorrect, the conditional
 | |
| expression's return value is 2.
 | |
| If the shell option @code{nocasematch}
 | |
| (see the description of @code{shopt} in @ref{The Shopt Builtin})
 | |
| is enabled, the match is performed without regard to the case
 | |
| of alphabetic characters.
 | |
| Any part of the pattern may be quoted to force it to be matched as a
 | |
| string.
 | |
| Substrings matched by parenthesized subexpressions within the regular
 | |
| expression are saved in the array variable @code{BASH_REMATCH}.
 | |
| The element of @code{BASH_REMATCH} with index 0 is the portion of the string
 | |
| matching the entire regular expression.
 | |
| The element of @code{BASH_REMATCH} with index @var{n} is the portion of the
 | |
| string matching the @var{n}th parenthesized subexpression.
 | |
| 
 | |
| Expressions may be combined using the following operators, listed
 | |
| in decreasing order of precedence:
 | |
| 
 | |
| @table @code
 | |
| @item ( @var{expression} )
 | |
| Returns the value of @var{expression}.
 | |
| This may be used to override the normal precedence of operators.
 | |
| 
 | |
| @item ! @var{expression}
 | |
| True if @var{expression} is false.
 | |
| 
 | |
| @item @var{expression1} && @var{expression2}
 | |
| True if both @var{expression1} and @var{expression2} are true.
 | |
| 
 | |
| @item @var{expression1} || @var{expression2}
 | |
| True if either @var{expression1} or @var{expression2} is true.
 | |
| @end table
 | |
| @noindent
 | |
| The @code{&&} and @code{||} operators do not evaluate @var{expression2} if the
 | |
| value of @var{expression1} is sufficient to determine the return
 | |
| value of the entire conditional expression.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Command Grouping
 | |
| @subsubsection Grouping Commands
 | |
| @cindex commands, grouping
 | |
| 
 | |
| Bash provides two ways to group a list of commands to be executed
 | |
| as a unit.  When commands are grouped, redirections may be applied
 | |
| to the entire command list.  For example, the output of all the
 | |
| commands in the list may be redirected to a single stream.
 | |
| 
 | |
| @table @code
 | |
| @item ()
 | |
| @example
 | |
| ( @var{list} )
 | |
| @end example
 | |
| 
 | |
| Placing a list of commands between parentheses causes a subshell
 | |
| environment to be created (@pxref{Command Execution Environment}), and each
 | |
| of the commands in @var{list} to be executed in that subshell.  Since the
 | |
| @var{list} is executed in a subshell, variable assignments do not remain in
 | |
| effect after the subshell completes. 
 | |
| 
 | |
| @item @{@}
 | |
| @rwindex @{
 | |
| @rwindex @}
 | |
| @example
 | |
| @{ @var{list}; @}
 | |
| @end example
 | |
| 
 | |
| Placing a list of commands between curly braces causes the list to
 | |
| be executed in the current shell context.  No subshell is created.
 | |
| The semicolon (or newline) following @var{list} is required.
 | |
| @end table
 | |
| 
 | |
| In addition to the creation of a subshell, there is a subtle difference
 | |
| between these two constructs due to historical reasons.  The braces
 | |
| are @code{reserved words}, so they must be separated from the @var{list}
 | |
| by @code{blank}s or other shell metacharacters.
 | |
| The parentheses are @code{operators}, and are
 | |
| recognized as separate tokens by the shell even if they are not separated
 | |
| from the @var{list} by whitespace.
 | |
| 
 | |
| The exit status of both of these constructs is the exit status of
 | |
| @var{list}.
 | |
| 
 | |
| @node Coprocesses
 | |
| @subsection Coprocesses
 | |
| @cindex coprocess
 | |
| 
 | |
| A @code{coprocess} is a shell command preceded by the @code{coproc}
 | |
| reserved word.
 | |
| A coprocess is executed asynchronously in a subshell, as if the command
 | |
| had been terminated with the @samp{&} control operator, with a two-way pipe
 | |
| established between the executing shell and the coprocess.
 | |
| 
 | |
| The format for a coprocess is:
 | |
| @example
 | |
| @code{coproc} [@var{NAME}] @var{command} [@var{redirections}]
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| This creates a coprocess named @var{NAME}.
 | |
| If @var{NAME} is not supplied, the default name is @var{COPROC}.
 | |
| @var{NAME} must not be supplied if @var{command} is a simple
 | |
| command (@pxref{Simple Commands}); otherwise, it is interpreted as
 | |
| the first word of the simple command.
 | |
| 
 | |
| When the coproc is executed, the shell creates an array variable
 | |
| (@pxref{Arrays})
 | |
| named @var{NAME} in the context of the executing shell.
 | |
| The standard output of @var{command}
 | |
| is connected via a pipe to a file descriptor in the executing shell,
 | |
| and that file descriptor is assigned to @var{NAME}[0].
 | |
| The standard input of @var{command}
 | |
| is connected via a pipe to a file descriptor in the executing shell,
 | |
| and that file descriptor is assigned to @var{NAME}[1].
 | |
| This pipe is established before any redirections specified by the
 | |
| command (@pxref{Redirections}).
 | |
| The file descriptors can be utilized as arguments to shell commands
 | |
| and redirections using standard word expansions.
 | |
| 
 | |
| The process ID of the shell spawned to execute the coprocess is
 | |
| available as the value of the variable @var{NAME}_PID.
 | |
| The @code{wait}
 | |
| builtin command may be used to wait for the coprocess to terminate.
 | |
| 
 | |
| The return status of a coprocess is the exit status of @var{command}.
 | |
| 
 | |
| @node GNU Parallel
 | |
| @subsection GNU Parallel
 | |
| 
 | |
| GNU Parallel, as its name suggests, can be used to build and run commands
 | |
| in parallel.  You may run the same command with different arguments, whether
 | |
| they are filenames, usernames, hostnames, or lines read from files.
 | |
| 
 | |
| For a complete description, refer to the GNU Parallel documentation.  A few
 | |
| examples should provide a brief introduction to its use.
 | |
| 
 | |
| For example, it is easy to prefix each line in a text file with a specified
 | |
| string:
 | |
| @example
 | |
| cat file | parallel -k echo prefix_string
 | |
| @end example
 | |
| @noindent
 | |
| The @option{-k} option is required to preserve the lines' order.
 | |
| 
 | |
| Similarly, you can append a specified string to each line in a text file:
 | |
| @example
 | |
| cat file | parallel -k echo @{@} append_string
 | |
| @end example
 | |
| 
 | |
| You can use Parallel to move files from the current directory when the
 | |
| number of files is too large to process with one @code{mv} invocation:
 | |
| @example
 | |
| ls | parallel mv @{@} destdir
 | |
| @end example
 | |
| 
 | |
| As you can see, the @{@} is replaced with each line read from standard input.
 | |
| This will run as many @code{mv} commands as there are files in the current
 | |
| directory.  You can emulate a parallel @code{xargs} by adding the @option{-X}
 | |
| option:
 | |
| @example
 | |
| ls | parallel -X mv @{@} destdir
 | |
| @end example
 | |
| 
 | |
| GNU Parallel can replace certain common idioms that operate on lines read
 | |
| from a file (in this case, filenames):
 | |
| @example
 | |
| 	for x in $(cat list); do
 | |
| 		do-something1 $x config-$x
 | |
| 		do-something2 < $x
 | |
| 	done | process-output
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| with a more compact syntax reminiscent of lambdas:
 | |
| @example
 | |
| cat list | parallel "do-something1 @{@} config-@{@} ; do-something2 < @{@}" | process-output
 | |
| @end example
 | |
| 
 | |
| Parallel provides a built-in mechanism to remove filename extensions, which
 | |
| lends itself to batch file transformations or renaming:
 | |
| @example
 | |
| ls *.gz | parallel -j+0 "zcat @{@} | bzip2 >@{.@}.bz2 && rm @{@}"
 | |
| @end example
 | |
| @noindent
 | |
| This will recompress all files in the current directory with names ending
 | |
| in .gz using bzip2, running one job per CPU (-j+0)  in parallel.
 | |
| 
 | |
| If a command generates output, you may want to preserve the input order in
 | |
| the output.  For instance, the following command
 | |
| @example
 | |
| @{ echo foss.org.my ; echo debian.org; echo freenetproject.org; @} | parallel traceroute
 | |
| @end example
 | |
| @noindent
 | |
| will display as output the traceroute invocation that finishes first.  Using
 | |
| the @option{-k} option, as we saw above
 | |
| @example
 | |
| @{ echo foss.org.my ; echo debian.org; echo freenetproject.org; @} | parallel -k traceroute
 | |
| @end example
 | |
| @noindent
 | |
| will ensure that the output of @code{traceroute foss.org.my} is displayed first.
 | |
| 
 | |
| @node Shell Functions
 | |
| @section Shell Functions
 | |
| @cindex shell function
 | |
| @cindex functions, shell
 | |
| 
 | |
| Shell functions are a way to group commands for later execution
 | |
| using a single name for the group.  They are executed just like
 | |
| a "regular" command.
 | |
| When the name of a shell function is used as a simple command name,
 | |
| the list of commands associated with that function name is executed.
 | |
| Shell functions are executed in the current
 | |
| shell context; no new process is created to interpret them.
 | |
| 
 | |
| Functions are declared using this syntax:
 | |
| @rwindex function
 | |
| @example
 | |
| @var{name} () @var{compound-command} [ @var{redirections} ]@*or@*
 | |
| @code{function} @var{name} [()] @var{compound-command} [ @var{redirections} ]
 | |
| @end example
 | |
| 
 | |
| This defines a shell function named @var{name}.  The reserved
 | |
| word @code{function} is optional.
 | |
| If the @code{function} reserved
 | |
| word is supplied, the parentheses are optional.
 | |
| The @var{body} of the function is the compound command
 | |
| @var{compound-command} (@pxref{Compound Commands}).
 | |
| That command is usually a @var{list} enclosed between @{ and @}, but
 | |
| may be any compound command listed above.
 | |
| @var{compound-command} is executed whenever @var{name} is specified as the
 | |
| name of a command.
 | |
| Any redirections (@pxref{Redirections}) associated with the shell function
 | |
| are performed when the function is executed.
 | |
| 
 | |
| A function definition may be deleted using the @option{-f} option to the
 | |
| @code{unset} builtin (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| The exit status of a function definition is zero unless a syntax error
 | |
| occurs or a readonly function with the same name already exists.
 | |
| When executed, the exit status of a function is the exit status of the
 | |
| last command executed in the body.
 | |
| 
 | |
| Note that for historical reasons, in the most common usage the curly braces
 | |
| that surround the body of the function must be separated from the body by
 | |
| @code{blank}s or newlines.
 | |
| This is because the braces are reserved words and are only recognized
 | |
| as such when they are separated from the command list
 | |
| by whitespace or another shell metacharacter.
 | |
| Also, when using the braces, the @var{list} must be terminated by a semicolon,
 | |
| a @samp{&}, or a newline.
 | |
| 
 | |
| When a function is executed, the arguments to the
 | |
| function become the positional parameters
 | |
| during its execution (@pxref{Positional Parameters}).
 | |
| The special parameter @samp{#} that expands to the number of
 | |
| positional parameters is updated to reflect the change.
 | |
| Special parameter @code{0} is unchanged.
 | |
| The first element of the @env{FUNCNAME} variable is set to the
 | |
| name of the function while the function is executing.
 | |
| 
 | |
| All other aspects of the shell execution
 | |
| environment are identical between a function and its caller
 | |
| with these exceptions:
 | |
| the @env{DEBUG} and @env{RETURN} traps
 | |
| are not inherited unless the function has been given the
 | |
| @code{trace} attribute using the @code{declare} builtin or
 | |
| the @code{-o functrace} option has been enabled with
 | |
| the @code{set} builtin,
 | |
| (in which case all functions inherit the @env{DEBUG} and @env{RETURN} traps),
 | |
| and the @env{ERR} trap is not inherited unless the @code{-o errtrace}
 | |
| shell option has been enabled.
 | |
| @xref{Bourne Shell Builtins}, for the description of the
 | |
| @code{trap} builtin.
 | |
| 
 | |
| The @env{FUNCNEST} variable, if set to a numeric value greater
 | |
| than 0, defines a maximum function nesting level.  Function
 | |
| invocations that exceed the limit cause the entire command to
 | |
| abort.
 | |
| 
 | |
| If the builtin command @code{return}
 | |
| is executed in a function, the function completes and
 | |
| execution resumes with the next command after the function
 | |
| call.
 | |
| Any command associated with the @code{RETURN} trap is executed
 | |
| before execution resumes.
 | |
| When a function completes, the values of the
 | |
| positional parameters and the special parameter @samp{#}
 | |
| are restored to the values they had prior to the function's
 | |
| execution.  If a numeric argument is given to @code{return},
 | |
| that is the function's return status; otherwise the function's
 | |
| return status is the exit status of the last command executed
 | |
| before the @code{return}.
 | |
| 
 | |
| Variables local to the function may be declared with the
 | |
| @code{local} builtin.  These variables are visible only to
 | |
| the function and the commands it invokes.
 | |
| 
 | |
| Function names and definitions may be listed with the
 | |
| @option{-f} option to the @code{declare} or @code{typeset}
 | |
| builtin commands (@pxref{Bash Builtins}).
 | |
| The @option{-F} option to @code{declare} or @code{typeset}
 | |
| will list the function names only
 | |
| (and optionally the source file and line number, if the @code{extdebug}
 | |
| shell option is enabled).
 | |
| Functions may be exported so that subshells
 | |
| automatically have them defined with the
 | |
| @option{-f} option to the @code{export} builtin
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| Note that shell functions and variables with the same name may result
 | |
| in multiple identically-named entries in the environment passed to the
 | |
| shell's children.
 | |
| Care should be taken in cases where this may cause a problem.
 | |
| 
 | |
| Functions may be recursive.
 | |
| The @code{FUNCNEST} variable may be used to limit the depth of the
 | |
| function call stack and restrict the number of function invocations.
 | |
| By default, no limit is placed on the number of recursive  calls.
 | |
| 
 | |
| @node Shell Parameters
 | |
| @section Shell Parameters
 | |
| @cindex parameters
 | |
| @cindex variable, shell
 | |
| @cindex shell variable
 | |
| 
 | |
| @menu
 | |
| * Positional Parameters::	The shell's command-line arguments.
 | |
| * Special Parameters::		Parameters denoted by special characters.
 | |
| @end menu
 | |
| 
 | |
| A @var{parameter} is an entity that stores values.
 | |
| It can be a @code{name}, a number, or one of the special characters
 | |
| listed below.
 | |
| A @var{variable} is a parameter denoted by a @code{name}.
 | |
| A variable has a @var{value} and zero or more @var{attributes}.
 | |
| Attributes are assigned using the @code{declare} builtin command
 | |
| (see the description of the @code{declare} builtin in @ref{Bash Builtins}).
 | |
| 
 | |
| A parameter is set if it has been assigned a value.  The null string is
 | |
| a valid value.  Once a variable is set, it may be unset only by using
 | |
| the @code{unset} builtin command.
 | |
| 
 | |
| A variable may be assigned to by a statement of the form
 | |
| @example
 | |
| @var{name}=[@var{value}]
 | |
| @end example
 | |
| @noindent
 | |
| If @var{value}
 | |
| is not given, the variable is assigned the null string.  All
 | |
| @var{value}s undergo tilde expansion, parameter and variable expansion,
 | |
| command substitution, arithmetic expansion, and quote
 | |
| removal (detailed below).  If the variable has its @code{integer}
 | |
| attribute set, then @var{value} 
 | |
| is evaluated as an arithmetic expression even if the @code{$((@dots{}))}
 | |
| expansion is not used (@pxref{Arithmetic Expansion}).
 | |
| Word splitting is not performed, with the exception
 | |
| of @code{"$@@"} as explained below.
 | |
| Filename expansion is not performed.
 | |
| Assignment statements may also appear as arguments to the
 | |
| @code{alias}, 
 | |
| @code{declare}, @code{typeset}, @code{export}, @code{readonly},
 | |
| and @code{local} builtin commands.
 | |
| 
 | |
| In the context where an assignment statement is assigning a value  
 | |
| to a shell variable or array index (@pxref{Arrays}), the @samp{+=}
 | |
| operator can be used to   
 | |
| append to or add to the variable's previous value.
 | |
| When @samp{+=} is applied to a variable for which the @var{integer} attribute
 | |
| has been set, @var{value} is evaluated as an arithmetic expression and
 | |
| added to the variable's current value, which is also evaluated.
 | |
| When @samp{+=} is applied to an array variable using compound assignment
 | |
| (@pxref{Arrays}), the
 | |
| variable's value is not unset (as it is when using @samp{=}), and new
 | |
| values are appended to the array beginning at one greater than the array's
 | |
| maximum index (for indexed arrays),  or added as additional key-value pairs
 | |
| in an associative array.
 | |
| When applied to a string-valued variable, @var{value} is expanded and
 | |
| appended to the variable's value.
 | |
| 
 | |
| @node Positional Parameters
 | |
| @subsection Positional Parameters
 | |
| @cindex parameters, positional
 | |
| 
 | |
| A @var{positional parameter} is a parameter denoted by one or more
 | |
| digits, other than the single digit @code{0}.  Positional parameters are
 | |
| assigned from the shell's arguments when it is invoked,
 | |
| and may be reassigned using the @code{set} builtin command.
 | |
| Positional parameter @code{N} may be referenced as @code{$@{N@}}, or
 | |
| as @code{$N} when @code{N} consists of a single digit.
 | |
| Positional parameters may not be assigned to with assignment statements.
 | |
| The @code{set} and @code{shift} builtins are used to set and
 | |
| unset them (@pxref{Shell Builtin Commands}).
 | |
| The positional parameters are
 | |
| temporarily replaced when a shell function is executed
 | |
| (@pxref{Shell Functions}).
 | |
| 
 | |
| When a positional parameter consisting of more than a single
 | |
| digit is expanded, it must be enclosed in braces.
 | |
| 
 | |
| @node Special Parameters
 | |
| @subsection Special Parameters
 | |
| @cindex parameters, special
 | |
| 
 | |
| The shell treats several parameters specially.  These parameters may
 | |
| only be referenced; assignment to them is not allowed.
 | |
| 
 | |
| @vtable @code
 | |
| 
 | |
| @item *
 | |
| Expands to the positional parameters, starting from one.  When the
 | |
| expansion occurs within double quotes, it expands to a single word
 | |
| with the value of each parameter separated by the first character
 | |
| of the @env{IFS}
 | |
| special variable.  That is, @code{"$*"} is equivalent
 | |
| to @code{"$1@var{c}$2@var{c}@dots{}"}, where @var{c}
 | |
| is the first character of the value of the @code{IFS}
 | |
| variable.
 | |
| If @env{IFS} is unset, the parameters are separated by spaces.
 | |
| If @env{IFS} is null, the parameters are joined without intervening
 | |
| separators.
 | |
| 
 | |
| 
 | |
| @item @@
 | |
| Expands to the positional parameters, starting from one.  When the
 | |
| expansion occurs within double quotes, each parameter expands to a
 | |
| separate word.  That is, @code{"$@@"} is equivalent to
 | |
| @code{"$1" "$2" @dots{}}.
 | |
| If the double-quoted expansion occurs within a word, the expansion of
 | |
| the first parameter is joined with the beginning part of the original
 | |
| word, and the expansion of the last parameter is joined with the last
 | |
| part of the original word.
 | |
| When there are no positional parameters, @code{"$@@"} and
 | |
| @code{$@@}
 | |
| expand to nothing (i.e., they are removed).
 | |
| 
 | |
| @item #
 | |
| Expands to the number of positional parameters in decimal.
 | |
| 
 | |
| @item ?
 | |
| Expands to the exit status of the most recently executed foreground
 | |
| pipeline.
 | |
| 
 | |
| @item -
 | |
| (A hyphen.)  Expands to the current option flags as specified upon
 | |
| invocation, by the @code{set}
 | |
| builtin command, or those set by the shell itself
 | |
| (such as the @option{-i} option).
 | |
| 
 | |
| @item $
 | |
| Expands to the process @sc{id} of the shell.  In a @code{()} subshell, it
 | |
| expands to the process @sc{id} of the invoking shell, not the subshell.
 | |
| 
 | |
| @item !
 | |
| Expands to the process @sc{id} of the most recently executed background
 | |
| (asynchronous) command.
 | |
| 
 | |
| @item 0
 | |
| Expands to the name of the shell or shell script.  This is set at
 | |
| shell initialization.  If Bash is invoked with a file of commands
 | |
| (@pxref{Shell Scripts}), @code{$0} is set to the name of that file.
 | |
| If Bash is started with the @option{-c} option (@pxref{Invoking Bash}),
 | |
| then @code{$0} is set to the first argument after the string to be
 | |
| executed, if one is present.  Otherwise, it is set
 | |
| to the filename used to invoke Bash, as given by argument zero.
 | |
| 
 | |
| @item _
 | |
| (An underscore.)
 | |
| At shell startup, set to the absolute pathname used to invoke the
 | |
| shell or shell script being executed as passed in the environment
 | |
| or argument list.
 | |
| Subsequently, expands to the last argument to the previous command,
 | |
| after expansion.   
 | |
| Also set to the full pathname used to invoke each command executed
 | |
| and placed in the environment exported to that command.
 | |
| When checking mail, this parameter holds the name of the mail file.
 | |
| @end vtable
 | |
| 
 | |
| @node Shell Expansions
 | |
| @section Shell Expansions
 | |
| @cindex expansion
 | |
| 
 | |
| Expansion is performed on the command line after it has been split into
 | |
| @code{token}s.  There are seven kinds of expansion performed:
 | |
| @itemize @bullet
 | |
| @item brace expansion
 | |
| @item tilde expansion
 | |
| @item parameter and variable expansion
 | |
| @item command substitution
 | |
| @item arithmetic expansion
 | |
| @item word splitting
 | |
| @item filename expansion
 | |
| @end itemize
 | |
| 
 | |
| @menu
 | |
| * Brace Expansion::		Expansion of expressions within braces.
 | |
| * Tilde Expansion::		Expansion of the ~ character.
 | |
| * Shell Parameter Expansion::	How Bash expands variables to their values.
 | |
| * Command Substitution::	Using the output of a command as an argument.
 | |
| * Arithmetic Expansion::	How to use arithmetic in shell expansions.
 | |
| * Process Substitution::	A way to write and read to and from a
 | |
| 				command.
 | |
| * Word Splitting::	How the results of expansion are split into separate
 | |
| 			arguments.
 | |
| * Filename Expansion::	A shorthand for specifying filenames matching patterns.
 | |
| * Quote Removal::	How and when quote characters are removed from
 | |
| 			words.
 | |
| @end menu
 | |
| 
 | |
| The order of expansions is: brace expansion, tilde expansion,
 | |
| parameter, variable, and arithmetic expansion and
 | |
| command substitution
 | |
| (done in a left-to-right fashion), word splitting, and filename
 | |
| expansion.
 | |
| 
 | |
| On systems that can support it, there is an additional expansion
 | |
| available: @var{process substitution}.  This is performed at the
 | |
| same time as parameter, variable, and arithmetic expansion and
 | |
| command substitution.
 | |
| 
 | |
| Only brace expansion, word splitting, and filename expansion
 | |
| can change the number of words of the expansion; other expansions
 | |
| expand a single word to a single word.
 | |
| The only exceptions to this are the expansions of
 | |
| @code{"$@@"} (@pxref{Special Parameters}) and @code{"$@{@var{name}[@@]@}"}
 | |
| (@pxref{Arrays}).
 | |
| 
 | |
| After all expansions, @code{quote removal} (@pxref{Quote Removal})
 | |
| is performed.
 | |
| 
 | |
| @node Brace Expansion
 | |
| @subsection Brace Expansion
 | |
| @cindex brace expansion
 | |
| @cindex expansion, brace
 | |
| 
 | |
| Brace expansion is a mechanism by which arbitrary strings may be generated.
 | |
| This mechanism is similar to
 | |
| @var{filename expansion} (@pxref{Filename Expansion}),
 | |
| but the file names generated need not exist.
 | |
| Patterns to be brace expanded take the form of an optional @var{preamble},
 | |
| followed by either a series of comma-separated strings or a seqeunce expression
 | |
| between a pair of braces,
 | |
| followed by an optional @var{postscript}.
 | |
| The preamble is prefixed to each string contained within the braces, and
 | |
| the postscript is then appended to each resulting string, expanding left
 | |
| to right.
 | |
| 
 | |
| Brace expansions may be nested.
 | |
| The results of each expanded string are not sorted; left to right order
 | |
| is preserved.
 | |
| For example,
 | |
| @example
 | |
| bash$ echo a@{d,c,b@}e
 | |
| ade ace abe
 | |
| @end example
 | |
| 
 | |
| A sequence expression takes the form @code{@{@var{x}..@var{y}[..@var{incr}]@}},
 | |
| where @var{x} and @var{y} are either integers or single characters,
 | |
| and @var{incr}, an optional increment, is an integer.
 | |
| When integers are supplied, the expression expands to each number between
 | |
| @var{x} and @var{y}, inclusive.
 | |
| Supplied integers may be prefixed with @samp{0} to force each term to have the
 | |
| same width.  When either @var{x} or @var{y} begins with a zero, the shell
 | |
| attempts to force all generated terms to contain the same number of digits,
 | |
| zero-padding where necessary.
 | |
| When characters are supplied, the expression expands to each character
 | |
| lexicographically between @var{x} and @var{y}, inclusive.  Note that
 | |
| both @var{x} and @var{y} must be of the same type.
 | |
| When the increment is supplied, it is used as the difference between
 | |
| each term.  The default increment is 1 or -1 as appropriate.
 | |
| 
 | |
| Brace expansion is performed before any other expansions,
 | |
| and any characters special to other expansions are preserved
 | |
| in the result.  It is strictly textual.  Bash
 | |
| does not apply any syntactic interpretation to the context of the
 | |
| expansion or the text between the braces.
 | |
| To avoid conflicts with parameter expansion, the string @samp{$@{}
 | |
| is not considered eligible for brace expansion.
 | |
| 
 | |
| A correctly-formed brace expansion must contain unquoted opening
 | |
| and closing braces, and at least one unquoted comma or a valid
 | |
| sequence expression.
 | |
| Any incorrectly formed brace expansion is left unchanged.
 | |
| 
 | |
| A @{ or @samp{,} may be quoted with a backslash to prevent its
 | |
| being considered part of a brace expression.
 | |
| To avoid conflicts with parameter expansion, the string @samp{$@{}
 | |
| is not considered eligible for brace expansion.
 | |
| 
 | |
| This construct is typically used as shorthand when the common
 | |
| prefix of the strings to be generated is longer than in the
 | |
| above example:
 | |
| @example
 | |
| mkdir /usr/local/src/bash/@{old,new,dist,bugs@}
 | |
| @end example
 | |
| or
 | |
| @example
 | |
| chown root /usr/@{ucb/@{ex,edit@},lib/@{ex?.?*,how_ex@}@}
 | |
| @end example
 | |
| 
 | |
| @node Tilde Expansion
 | |
| @subsection Tilde Expansion
 | |
| @cindex tilde expansion
 | |
| @cindex expansion, tilde
 | |
| 
 | |
| If a word begins with an unquoted tilde character (@samp{~}), all of the
 | |
| characters up to the first unquoted slash (or all characters,
 | |
| if there is no unquoted slash) are considered a @var{tilde-prefix}.
 | |
| If none of the characters in the tilde-prefix are quoted, the
 | |
| characters in the tilde-prefix following the tilde are treated as a
 | |
| possible @var{login name}.
 | |
| If this login name is the null string, the tilde is replaced with the
 | |
| value of the @env{HOME} shell variable.
 | |
| If @env{HOME} is unset, the home directory of the user executing the
 | |
| shell is substituted instead.
 | |
| Otherwise, the tilde-prefix is replaced with the home directory
 | |
| associated with the specified login name.
 | |
| 
 | |
| If the tilde-prefix is @samp{~+}, the value of
 | |
| the shell variable @env{PWD} replaces the tilde-prefix.
 | |
| If the tilde-prefix is @samp{~-}, the value of the shell variable
 | |
| @env{OLDPWD}, if it is set, is substituted.
 | |
| 
 | |
| If the characters following the tilde in the tilde-prefix consist of a
 | |
| number @var{N}, optionally prefixed by a @samp{+} or a @samp{-},
 | |
| the tilde-prefix is replaced with the
 | |
| corresponding element from the directory stack, as it would be displayed
 | |
| by the @code{dirs} builtin invoked with the characters following tilde
 | |
| in the tilde-prefix as an argument (@pxref{The Directory Stack}).
 | |
| If the tilde-prefix, sans the tilde, consists of a number without a
 | |
| leading @samp{+} or @samp{-}, @samp{+} is assumed.
 | |
| 
 | |
| If the login name is invalid, or the tilde expansion fails, the word is
 | |
| left unchanged.
 | |
| 
 | |
| Each variable assignment is checked for unquoted tilde-prefixes immediately
 | |
| following a @samp{:} or the first @samp{=}.
 | |
| In these cases, tilde expansion is also performed.
 | |
| Consequently, one may use file names with tildes in assignments to
 | |
| @env{PATH}, @env{MAILPATH}, and @env{CDPATH},
 | |
| and the shell assigns the expanded value.
 | |
| 
 | |
| The following table shows how Bash treats unquoted tilde-prefixes:
 | |
| 
 | |
| @table @code
 | |
| @item ~
 | |
| The value of @code{$HOME}
 | |
| @item ~/foo
 | |
| @file{$HOME/foo}
 | |
| 
 | |
| @item ~fred/foo
 | |
| The subdirectory @code{foo} of the home directory of the user
 | |
| @code{fred}
 | |
| 
 | |
| @item ~+/foo
 | |
| @file{$PWD/foo}
 | |
| 
 | |
| @item ~-/foo
 | |
| @file{$@{OLDPWD-'~-'@}/foo}
 | |
| 
 | |
| @item ~@var{N}
 | |
| The string that would be displayed by @samp{dirs +@var{N}}
 | |
| 
 | |
| @item ~+@var{N}
 | |
| The string that would be displayed by @samp{dirs +@var{N}}
 | |
| 
 | |
| @item ~-@var{N}
 | |
| The string that would be displayed by @samp{dirs -@var{N}}
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Shell Parameter Expansion
 | |
| @subsection Shell Parameter Expansion
 | |
| @cindex parameter expansion
 | |
| @cindex expansion, parameter
 | |
| 
 | |
| The @samp{$} character introduces parameter expansion,
 | |
| command substitution, or arithmetic expansion.  The parameter name
 | |
| or symbol to be expanded may be enclosed in braces, which
 | |
| are optional but serve to protect the variable to be expanded from
 | |
| characters immediately following it which could be
 | |
| interpreted as part of the name.
 | |
| 
 | |
| When braces are used, the matching ending brace is the first @samp{@}}
 | |
| not escaped by a backslash or within a quoted string, and not within an
 | |
| embedded arithmetic expansion, command substitution, or parameter
 | |
| expansion.
 | |
| 
 | |
| The basic form of parameter expansion is $@{@var{parameter}@}.
 | |
| The value of @var{parameter} is substituted.  The braces are required
 | |
| when @var{parameter}
 | |
| is a positional parameter with more than one digit,
 | |
| or when @var{parameter}
 | |
| is followed by a character that is not to be
 | |
| interpreted as part of its name.
 | |
| 
 | |
| If the first character of @var{parameter} is an exclamation point (!),
 | |
| a level of variable indirection is introduced.
 | |
| Bash uses the value of the variable formed from the rest of
 | |
| @var{parameter} as the name of the variable; this variable is then
 | |
| expanded and that value is used in the rest of the substitution, rather
 | |
| than the value of @var{parameter} itself.
 | |
| This is known as @code{indirect expansion}.
 | |
| The exceptions to this are the expansions of $@{!@var{prefix}@*@}
 | |
| and $@{!@var{name}[@@]@}
 | |
| described below.
 | |
| The exclamation point must immediately follow the left brace in order to
 | |
| introduce indirection.
 | |
| 
 | |
| In each of the cases below, @var{word} is subject to tilde expansion,
 | |
| parameter expansion, command substitution, and arithmetic expansion.
 | |
| 
 | |
| When not performing substring expansion, using the form described
 | |
| below, Bash tests for a parameter that is unset or null.
 | |
| Omitting the colon results in a test only for a parameter that is unset.
 | |
| Put another way, if the colon is included,
 | |
| the operator tests for both @var{parameter}'s existence and that its value
 | |
| is not null; if the colon is omitted, the operator tests only for existence.
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item $@{@var{parameter}:@minus{}@var{word}@}
 | |
| If @var{parameter} is unset or null, the expansion of
 | |
| @var{word} is substituted.  Otherwise, the value of
 | |
| @var{parameter} is substituted.
 | |
| 
 | |
| @item $@{@var{parameter}:=@var{word}@}
 | |
| If @var{parameter}
 | |
| is unset or null, the expansion of @var{word}
 | |
| is assigned to @var{parameter}.
 | |
| The value of @var{parameter} is then substituted. 
 | |
| Positional parameters and special parameters may not be assigned to
 | |
| in this way.
 | |
| 
 | |
| @item $@{@var{parameter}:?@var{word}@}
 | |
| If @var{parameter}
 | |
| is null or unset, the expansion of @var{word} (or a message
 | |
| to that effect if @var{word}
 | |
| is not present) is written to the standard error and the shell, if it
 | |
| is not interactive, exits.  Otherwise, the value of @var{parameter} is
 | |
| substituted.
 | |
| 
 | |
| @item $@{@var{parameter}:+@var{word}@}
 | |
| If @var{parameter}
 | |
| is null or unset, nothing is substituted, otherwise the expansion of
 | |
| @var{word} is substituted.
 | |
| 
 | |
| @item $@{@var{parameter}:@var{offset}@}
 | |
| @itemx $@{@var{parameter}:@var{offset}:@var{length}@}
 | |
| Expands to up to @var{length} characters of @var{parameter}
 | |
| starting at the character specified by @var{offset}.
 | |
| If @var{length} is omitted, expands to the substring of
 | |
| @var{parameter} starting at the character specified by @var{offset}.
 | |
| @var{length} and @var{offset} are arithmetic expressions
 | |
| (@pxref{Shell Arithmetic}).
 | |
| This is referred to as Substring Expansion.
 | |
| 
 | |
| If @var{offset} evaluates to a number less than zero, the value
 | |
| is used as an offset from the end of the value of @var{parameter}.
 | |
| If @var{length} evaluates to a number less than zero, and @var{parameter}
 | |
| is not @samp{@@} and not an indexed or associative array, it is interpreted
 | |
| as an offset from the end of the value of @var{parameter} rather than
 | |
| a number of characters, and the expansion is the characters between the
 | |
| two offsets.
 | |
| If @var{parameter} is @samp{@@}, the result is @var{length} positional
 | |
| parameters beginning at @var{offset}.
 | |
| If @var{parameter} is an indexed array name subscripted
 | |
| by @samp{@@} or @samp{*}, the result is the @var{length}
 | |
| members of the array beginning with @code{$@{@var{parameter}[@var{offset}]@}}.
 | |
| A negative @var{offset} is taken relative to one greater than the maximum
 | |
| index of the specified array.
 | |
| Substring expansion applied to an associative array produces undefined
 | |
| results.
 | |
| 
 | |
| Note that a negative offset must be separated from the colon by at least
 | |
| one space to avoid being confused with the @samp{:-} expansion.
 | |
| Substring indexing is zero-based unless the positional parameters
 | |
| are used, in which case the indexing starts at 1 by default.
 | |
| If @var{offset} is 0, and the positional parameters are used, @code{$@@} is
 | |
| prefixed to the list.
 | |
| 
 | |
| @item $@{!@var{prefix}*@}
 | |
| @itemx $@{!@var{prefix}@@@}
 | |
| Expands to the names of variables whose names begin with @var{prefix},
 | |
| separated by the first character of the @env{IFS} special variable.
 | |
| When @samp{@@} is used and the expansion appears within double quotes, each
 | |
| variable name expands to a separate word.
 | |
| 
 | |
| @item $@{!@var{name}[@@]@}
 | |
| @itemx $@{!@var{name}[*]@}
 | |
| If @var{name} is an array variable, expands to the list of array indices
 | |
| (keys) assigned in @var{name}.
 | |
| If @var{name} is not an array, expands to 0 if @var{name} is set and null
 | |
| otherwise.
 | |
| When @samp{@@} is used and the expansion appears within double quotes, each
 | |
| key expands to a separate word.
 | |
| 
 | |
| @item $@{#@var{parameter}@}
 | |
| The length in characters of the expanded value of @var{parameter} is
 | |
| substituted.
 | |
| If @var{parameter} is @samp{*} or @samp{@@}, the value substituted
 | |
| is the number of positional parameters.
 | |
| If @var{parameter} is an array name subscripted by @samp{*} or @samp{@@}, 
 | |
| the value substituted is the number of elements in the array.
 | |
| 
 | |
| @item $@{@var{parameter}#@var{word}@}
 | |
| @itemx $@{@var{parameter}##@var{word}@}
 | |
| The @var{word}
 | |
| is expanded to produce a pattern just as in filename
 | |
| expansion (@pxref{Filename Expansion}).  If the pattern matches
 | |
| the beginning of the expanded value of @var{parameter},
 | |
| then the result of the expansion is the expanded value of @var{parameter}
 | |
| with the shortest matching pattern (the @samp{#} case) or the
 | |
| longest matching pattern (the @samp{##} case) deleted.
 | |
| If @var{parameter} is @samp{@@} or @samp{*},
 | |
| the pattern removal operation is applied to each positional
 | |
| parameter in turn, and the expansion is the resultant list.
 | |
| If @var{parameter} is an array variable subscripted with
 | |
| @samp{@@} or @samp{*},
 | |
| the pattern removal operation is applied to each member of the
 | |
| array in turn, and the expansion is the resultant list.
 | |
| 
 | |
| @item $@{@var{parameter}%@var{word}@}
 | |
| @itemx $@{@var{parameter}%%@var{word}@}
 | |
| The @var{word} is expanded to produce a pattern just as in
 | |
| filename expansion.
 | |
| If the pattern matches a trailing portion of the expanded value of
 | |
| @var{parameter}, then the result of the expansion is the value of
 | |
| @var{parameter} with the shortest matching pattern (the @samp{%} case)
 | |
| or the longest matching pattern (the @samp{%%} case) deleted.
 | |
| If @var{parameter} is @samp{@@} or @samp{*},
 | |
| the pattern removal operation is applied to each positional
 | |
| parameter in turn, and the expansion is the resultant list.
 | |
| If @var{parameter}
 | |
| is an array variable subscripted with @samp{@@} or @samp{*},
 | |
| the pattern removal operation is applied to each member of the
 | |
| array in turn, and the expansion is the resultant list.
 | |
| 
 | |
| @item $@{@var{parameter}/@var{pattern}/@var{string}@} 
 | |
| 
 | |
| The @var{pattern} is expanded to produce a pattern just as in
 | |
| filename expansion.
 | |
| @var{Parameter} is expanded and the longest match of @var{pattern}
 | |
| against its value is replaced with @var{string}.
 | |
| If @var{pattern} begins with @samp{/}, all matches of @var{pattern} are
 | |
| replaced with @var{string}.  Normally only the first match is replaced.
 | |
| If @var{pattern} begins with @samp{#}, it must match at the beginning
 | |
| of the expanded value of @var{parameter}.
 | |
| If @var{pattern} begins with @samp{%}, it must match at the end
 | |
| of the expanded value of @var{parameter}.
 | |
| If @var{string} is null, matches of @var{pattern} are deleted
 | |
| and the @code{/} following @var{pattern} may be omitted.
 | |
| If @var{parameter} is @samp{@@} or @samp{*},
 | |
| the substitution operation is applied to each positional
 | |
| parameter in turn, and the expansion is the resultant list.
 | |
| If @var{parameter}
 | |
| is an array variable subscripted with @samp{@@} or @samp{*},
 | |
| the substitution operation is applied to each member of the
 | |
| array in turn, and the expansion is the resultant list.
 | |
| 
 | |
| @item $@{@var{parameter}^@var{pattern}@}
 | |
| @itemx $@{@var{parameter}^^@var{pattern}@}
 | |
| @itemx $@{@var{parameter},@var{pattern}@}
 | |
| @itemx $@{@var{parameter},,@var{pattern}@}
 | |
| This expansion modifies the case of alphabetic characters in @var{parameter}.
 | |
| The @var{pattern} is expanded to produce a pattern just as in
 | |
| filename expansion.
 | |
| The @samp{^} operator converts lowercase letters matching @var{pattern}
 | |
| to uppercase; the @samp{,} operator converts matching uppercase letters
 | |
| to lowercase.
 | |
| The @samp{^^} and @samp{,,} expansions convert each matched character in the
 | |
| expanded value; the @samp{^} and @samp{,} expansions match and convert only
 | |
| the first character in the expanded value.
 | |
| If @var{pattern} is omitted, it is treated like a @samp{?}, which matches
 | |
| every character.
 | |
| If @var{parameter} is @samp{@@} or @samp{*},
 | |
| the case modification operation is applied to each positional
 | |
| parameter in turn, and the expansion is the resultant list.
 | |
| If @var{parameter}
 | |
| is an array variable subscripted with @samp{@@} or @samp{*},
 | |
| the case modification operation is applied to each member of the
 | |
| array in turn, and the expansion is the resultant list.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Command Substitution
 | |
| @subsection Command Substitution
 | |
| @cindex command substitution
 | |
| 
 | |
| Command substitution allows the output of a command to replace
 | |
| the command itself.
 | |
| Command substitution occurs when a command is enclosed as follows:
 | |
| @example
 | |
| $(@var{command})
 | |
| @end example
 | |
| @noindent
 | |
| or
 | |
| @example
 | |
| `@var{command}`
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| Bash performs the expansion by executing @var{command} and
 | |
| replacing the command substitution with the standard output of the
 | |
| command, with any trailing newlines deleted.
 | |
| Embedded newlines are not deleted, but they may be removed during
 | |
| word splitting.
 | |
| The command substitution @code{$(cat @var{file})} can be
 | |
| replaced by the equivalent but faster @code{$(< @var{file})}.
 | |
| 
 | |
| When the old-style backquote form of substitution is used,
 | |
| backslash retains its literal meaning except when followed by
 | |
| @samp{$}, @samp{`}, or @samp{\}. 
 | |
| The first backquote not preceded by a backslash terminates the
 | |
| command substitution.
 | |
| When using the @code{$(@var{command})} form, all characters between
 | |
| the parentheses make up the command; none are treated specially.
 | |
| 
 | |
| Command substitutions may be nested.  To nest when using the backquoted
 | |
| form, escape the inner backquotes with backslashes.
 | |
| 
 | |
| If the substitution appears within double quotes, word splitting and
 | |
| filename expansion are not performed on the results.
 | |
| 
 | |
| @node Arithmetic Expansion
 | |
| @subsection Arithmetic Expansion
 | |
| @cindex expansion, arithmetic
 | |
| @cindex arithmetic expansion
 | |
| 
 | |
| Arithmetic expansion allows the evaluation of an arithmetic expression
 | |
| and the substitution of the result.  The format for arithmetic expansion is:
 | |
| 
 | |
| @example
 | |
| $(( @var{expression} ))
 | |
| @end example
 | |
| 
 | |
| The expression is treated as if it were within double quotes, but
 | |
| a double quote inside the parentheses is not treated specially.
 | |
| All tokens in the expression undergo parameter expansion, command
 | |
| substitution, and quote removal.
 | |
| Arithmetic expansions may be nested. 
 | |
| 
 | |
| The evaluation is performed according to the rules listed below
 | |
| (@pxref{Shell Arithmetic}).
 | |
| If the expression is invalid, Bash prints a message indicating
 | |
| failure to the standard error and no substitution occurs.
 | |
| 
 | |
| @node Process Substitution
 | |
| @subsection Process Substitution
 | |
| @cindex process substitution
 | |
| 
 | |
| Process substitution is supported on systems that support named
 | |
| pipes (@sc{fifo}s) or the @file{/dev/fd} method of naming open files.
 | |
| It takes the form of 
 | |
| @example
 | |
| <(@var{list})
 | |
| @end example
 | |
| @noindent
 | |
| or
 | |
| @example
 | |
| >(@var{list})
 | |
| @end example
 | |
| @noindent
 | |
| The process @var{list} is run with its input or output connected to a
 | |
| @sc{fifo} or some file in @file{/dev/fd}.  The name of this file is
 | |
| passed as an argument to the current command as the result of the
 | |
| expansion.  If the @code{>(@var{list})} form is used, writing to
 | |
| the file will provide input for @var{list}.  If the
 | |
| @code{<(@var{list})} form is used, the file passed as an
 | |
| argument should be read to obtain the output of @var{list}.
 | |
| Note that no space may appear between the @code{<} or @code{>}
 | |
| and the left parenthesis, otherwise the construct would be interpreted
 | |
| as a redirection.
 | |
| 
 | |
| When available, process substitution is performed simultaneously with
 | |
| parameter and variable expansion, command substitution, and arithmetic
 | |
| expansion.
 | |
| 
 | |
| @node Word Splitting
 | |
| @subsection Word Splitting
 | |
| @cindex word splitting
 | |
| 
 | |
| The shell scans the results of parameter expansion, command substitution,
 | |
| and arithmetic expansion that did not occur within double quotes for
 | |
| word splitting.
 | |
| 
 | |
| The shell treats each character of @env{$IFS} as a delimiter, and splits
 | |
| the results of the other expansions into words on these characters.
 | |
| If @env{IFS} is unset, or its value is exactly @code{<space><tab><newline>},
 | |
| the default, then sequences of
 | |
| @code{ <space>}, @code{<tab>}, and @code{<newline>}
 | |
| at the beginning and end of the results of the previous
 | |
| expansions are ignored, and any sequence of @env{IFS}
 | |
| characters not at the beginning or end serves to delimit words.
 | |
| If @env{IFS} has a value other than the default, then sequences of
 | |
| the whitespace characters @code{space} and @code{tab}
 | |
| are ignored at the beginning and end of the
 | |
| word, as long as the whitespace character is in the
 | |
| value of @env{IFS} (an @env{IFS} whitespace character).
 | |
| Any character in @env{IFS} that is not @env{IFS}
 | |
| whitespace, along with any adjacent @env{IFS}
 | |
| whitespace characters, delimits a field.  A sequence of @env{IFS}
 | |
| whitespace characters is also treated as a delimiter.
 | |
| If the value of @env{IFS} is null, no word splitting occurs.
 | |
| 
 | |
| Explicit null arguments (@code{""} or @code{''}) are retained.
 | |
| Unquoted implicit null arguments, resulting from the expansion of
 | |
| parameters that have no values, are removed.
 | |
| If a parameter with no value is expanded within double quotes, a
 | |
| null argument results and is retained.
 | |
| 
 | |
| Note that if no expansion occurs, no splitting
 | |
| is performed.
 | |
| 
 | |
| @node Filename Expansion
 | |
| @subsection Filename Expansion
 | |
| @menu
 | |
| * Pattern Matching::	How the shell matches patterns.
 | |
| @end menu
 | |
| @cindex expansion, filename
 | |
| @cindex expansion, pathname
 | |
| @cindex filename expansion
 | |
| @cindex pathname expansion
 | |
| 
 | |
| After word splitting, unless the @option{-f} option has been set
 | |
| (@pxref{The Set Builtin}), Bash scans each word for the characters
 | |
| @samp{*}, @samp{?}, and @samp{[}.
 | |
| If one of these characters appears, then the word is
 | |
| regarded as a @var{pattern},
 | |
| and replaced with an alphabetically sorted list of
 | |
| file names matching the pattern. If no matching file names are found,
 | |
| and the shell option @code{nullglob} is disabled, the word is left
 | |
| unchanged.
 | |
| If the @code{nullglob} option is set, and no matches are found, the word
 | |
| is removed.
 | |
| If the @code{failglob} shell option is set, and no matches are found,
 | |
| an error message is printed and the command is not executed.
 | |
| If the shell option @code{nocaseglob} is enabled, the match is performed
 | |
| without regard to the case of alphabetic characters.
 | |
| 
 | |
| When a pattern is used for filename expansion, the character @samp{.}
 | |
| at the start of a filename or immediately following a slash
 | |
| must be matched explicitly, unless the shell option @code{dotglob} is set.
 | |
| When matching a file name, the slash character must always be
 | |
| matched explicitly.
 | |
| In other cases, the @samp{.} character is not treated specially.
 | |
| 
 | |
| See the description of @code{shopt} in @ref{The Shopt Builtin},
 | |
| for a description of the @code{nocaseglob}, @code{nullglob},
 | |
| @code{failglob}, and @code{dotglob} options.
 | |
| 
 | |
| The @env{GLOBIGNORE}
 | |
| shell variable may be used to restrict the set of filenames matching a
 | |
| pattern.  If @env{GLOBIGNORE}
 | |
| is set, each matching filename that also matches one of the patterns in
 | |
| @env{GLOBIGNORE} is removed from the list of matches.  The filenames
 | |
| @file{.} and @file{..}
 | |
| are always ignored when @env{GLOBIGNORE}
 | |
| is set and not null.
 | |
| However, setting @env{GLOBIGNORE} to a non-null value has the effect of
 | |
| enabling the @code{dotglob}
 | |
| shell option, so all other filenames beginning with a
 | |
| @samp{.} will match.
 | |
| To get the old behavior of ignoring filenames beginning with a
 | |
| @samp{.}, make @samp{.*} one of the patterns in @env{GLOBIGNORE}.
 | |
| The @code{dotglob} option is disabled when @env{GLOBIGNORE}
 | |
| is unset.
 | |
| 
 | |
| @node Pattern Matching
 | |
| @subsubsection Pattern Matching
 | |
| @cindex pattern matching
 | |
| @cindex matching, pattern
 | |
| 
 | |
| Any character that appears in a pattern, other than the special pattern
 | |
| characters described below, matches itself.
 | |
| The @sc{nul} character may not occur in a pattern.
 | |
| A backslash escapes the following character; the
 | |
| escaping backslash is discarded when matching.
 | |
| The special pattern characters must be quoted if they are to be matched
 | |
| literally.
 | |
| 
 | |
| The special pattern characters have the following meanings:
 | |
| @table @code
 | |
| @item *
 | |
| Matches any string, including the null string.
 | |
| When the @code{globstar} shell option is enabled, and @samp{*} is used in
 | |
| a filename expansion context, two adjacent @samp{*}s used as a single
 | |
| pattern will match all files and zero or more directories and
 | |
| subdirectories.
 | |
| If followed by a @samp{/}, two adjacent @samp{*}s will match only
 | |
| directories and subdirectories.
 | |
| @item ?
 | |
| Matches any single character.
 | |
| @item [@dots{}]
 | |
| Matches any one of the enclosed characters.  A pair of characters
 | |
| separated by a hyphen denotes a @var{range expression};
 | |
| any character that sorts between those two characters, inclusive,
 | |
| using the current locale's collating sequence and character set,
 | |
| is matched.  If the first character following the
 | |
| @samp{[} is a @samp{!}  or a @samp{^}
 | |
| then any character not enclosed is matched.  A @samp{@minus{}}
 | |
| may be matched by including it as the first or last character
 | |
| in the set.  A @samp{]} may be matched by including it as the first
 | |
| character in the set.
 | |
| The sorting order of characters in range expressions is determined by
 | |
| the current locale and the value of the @env{LC_COLLATE} shell variable,
 | |
| if set.
 | |
| 
 | |
| For example, in the default C locale, @samp{[a-dx-z]} is equivalent to
 | |
| @samp{[abcdxyz]}.  Many locales sort characters in dictionary order, and in
 | |
| these locales @samp{[a-dx-z]} is typically not equivalent to @samp{[abcdxyz]};
 | |
| it might be equivalent to @samp{[aBbCcDdxXyYz]}, for example.  To obtain
 | |
| the traditional interpretation of ranges in bracket expressions, you can
 | |
| force the use of the C locale by setting the @env{LC_COLLATE} or
 | |
| @env{LC_ALL} environment variable to the value @samp{C}.
 | |
| 
 | |
| Within @samp{[} and @samp{]}, @var{character classes} can be specified
 | |
| using the syntax
 | |
| @code{[:}@var{class}@code{:]}, where @var{class} is one of the
 | |
| following classes defined in the @sc{posix} standard:
 | |
| @example
 | |
| alnum   alpha   ascii   blank   cntrl   digit   graph   lower
 | |
| print   punct   space   upper   word    xdigit
 | |
| @end example
 | |
| @noindent
 | |
| A character class matches any character belonging to that class.
 | |
| The @code{word} character class matches letters, digits, and the character
 | |
| @samp{_}.
 | |
| 
 | |
| Within @samp{[} and @samp{]}, an @var{equivalence class} can be
 | |
| specified using the syntax @code{[=}@var{c}@code{=]}, which
 | |
| matches all characters with the same collation weight (as defined
 | |
| by the current locale) as the character @var{c}.
 | |
| 
 | |
| Within @samp{[} and @samp{]}, the syntax @code{[.}@var{symbol}@code{.]}
 | |
| matches the collating symbol @var{symbol}.
 | |
| @end table
 | |
| 
 | |
| If the @code{extglob} shell option is enabled using the @code{shopt}
 | |
| builtin, several extended pattern matching operators are recognized.
 | |
| In the following description, a @var{pattern-list} is a list of one
 | |
| or more patterns separated by a @samp{|}.
 | |
| Composite patterns may be formed using one or more of the following
 | |
| sub-patterns:
 | |
| 
 | |
| @table @code
 | |
| @item ?(@var{pattern-list})
 | |
| Matches zero or one occurrence of the given patterns.
 | |
| 
 | |
| @item *(@var{pattern-list})
 | |
| Matches zero or more occurrences of the given patterns.
 | |
| 
 | |
| @item +(@var{pattern-list})
 | |
| Matches one or more occurrences of the given patterns.
 | |
| 
 | |
| @item @@(@var{pattern-list})
 | |
| Matches one of the given patterns.
 | |
| 
 | |
| @item !(@var{pattern-list})
 | |
| Matches anything except one of the given patterns.
 | |
| @end table
 | |
| 
 | |
| @node Quote Removal
 | |
| @subsection Quote Removal
 | |
| 
 | |
| After the preceding expansions, all unquoted occurrences of the
 | |
| characters @samp{\}, @samp{'}, and @samp{"} that did not
 | |
| result from one of the above expansions are removed.
 | |
| 
 | |
| @node Redirections
 | |
| @section Redirections
 | |
| @cindex redirection
 | |
| 
 | |
| Before a command is executed, its input and output
 | |
| may be @var{redirected}
 | |
| using a special notation interpreted by the shell.
 | |
| Redirection may also be used to open and close files for the
 | |
| current shell execution environment.  The following redirection
 | |
| operators may precede or appear anywhere within a
 | |
| simple command or may follow a command.
 | |
| Redirections are processed in the order they appear, from
 | |
| left to right.
 | |
| 
 | |
| Each redirection that may be preceded by a file descriptor number
 | |
| may instead be preceded by a word of the form @{@var{varname}@}.
 | |
| In this case, for each redirection operator except
 | |
| >&- and <&-, the shell will allocate a file descriptor greater
 | |
| than 10 and assign it to @{@var{varname}@}.  If >&- or <&- is preceded
 | |
| by @{@var{varname}@}, the value of @var{varname} defines the file
 | |
| descriptor to close.
 | |
| 
 | |
| In the following descriptions, if the file descriptor number is
 | |
| omitted, and the first character of the redirection operator is
 | |
| @samp{<}, the redirection refers to the standard input (file
 | |
| descriptor 0).  If the first character of the redirection operator
 | |
| is @samp{>}, the redirection refers to the standard output (file
 | |
| descriptor 1).
 | |
| 
 | |
| The word following the redirection operator in the following
 | |
| descriptions, unless otherwise noted, is subjected to brace expansion,
 | |
| tilde expansion, parameter expansion, command substitution, arithmetic
 | |
| expansion, quote removal, filename expansion, and word splitting.
 | |
| If it expands to more than one word, Bash reports an error.
 | |
| 
 | |
| Note that the order of redirections is significant.  For example,
 | |
| the command
 | |
| @example
 | |
| ls > @var{dirlist} 2>&1
 | |
| @end example
 | |
| @noindent
 | |
| directs both standard output (file descriptor 1) and standard error
 | |
| (file descriptor 2) to the file @var{dirlist}, while the command
 | |
| @example
 | |
| ls 2>&1 > @var{dirlist}
 | |
| @end example
 | |
| @noindent
 | |
| directs only the standard output to file @var{dirlist},
 | |
| because the standard error was made a copy of the standard output
 | |
| before the standard output was redirected to @var{dirlist}.
 | |
| 
 | |
| Bash handles several filenames specially when they are used in
 | |
| redirections, as described in the following table:
 | |
| 
 | |
| @table @code
 | |
| @item /dev/fd/@var{fd}
 | |
| If @var{fd} is a valid integer, file descriptor @var{fd} is duplicated.
 | |
| 
 | |
| @item /dev/stdin
 | |
| File descriptor 0 is duplicated.
 | |
| 
 | |
| @item /dev/stdout
 | |
| File descriptor 1 is duplicated.
 | |
| 
 | |
| @item /dev/stderr
 | |
| File descriptor 2 is duplicated.
 | |
| 
 | |
| @item /dev/tcp/@var{host}/@var{port}
 | |
| If @var{host} is a valid hostname or Internet address, and @var{port}
 | |
| is an integer port number or service name, Bash attempts to open a TCP
 | |
| connection to the corresponding socket.
 | |
| 
 | |
| @item /dev/udp/@var{host}/@var{port}
 | |
| If @var{host} is a valid hostname or Internet address, and @var{port}
 | |
| is an integer port number or service name, Bash attempts to open a UDP
 | |
| connection to the corresponding socket.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| A failure to open or create a file causes the redirection to fail.
 | |
| 
 | |
| Redirections using file descriptors greater than 9 should be used with
 | |
| care, as they may conflict with file descriptors the shell uses
 | |
| internally.
 | |
| 
 | |
| @subsection Redirecting Input
 | |
| Redirection of input causes the file whose name results from
 | |
| the expansion of @var{word}
 | |
| to be opened for reading on file descriptor @code{n},
 | |
| or the standard input (file descriptor 0) if @code{n}
 | |
| is not specified.
 | |
| 
 | |
| The general format for redirecting input is:
 | |
| @example
 | |
| [@var{n}]<@var{word}
 | |
| @end example
 | |
| 
 | |
| @subsection Redirecting Output
 | |
| Redirection of output causes the file whose name results from
 | |
| the expansion of @var{word}
 | |
| to be opened for writing on file descriptor @var{n},
 | |
| or the standard output (file descriptor 1) if @var{n}
 | |
| is not specified.  If the file does not exist it is created;
 | |
| if it does exist it is truncated to zero size.
 | |
| 
 | |
| The general format for redirecting output is:
 | |
| @example
 | |
| [@var{n}]>[|]@var{word}
 | |
| @end example
 | |
| 
 | |
| If the redirection operator is @samp{>}, and the @code{noclobber}
 | |
| option to the @code{set} builtin has been enabled, the redirection
 | |
| will fail if the file whose name results from the expansion of
 | |
| @var{word} exists and is a regular file.
 | |
| If the redirection operator is @samp{>|}, or the redirection operator is
 | |
| @samp{>} and the @code{noclobber} option is not enabled, the redirection
 | |
| is attempted even if the file named by @var{word} exists.
 | |
| 
 | |
| @subsection Appending Redirected Output
 | |
| Redirection of output in this fashion
 | |
| causes the file whose name results from
 | |
| the expansion of @var{word}
 | |
| to be opened for appending on file descriptor @var{n},
 | |
| or the standard output (file descriptor 1) if @var{n}
 | |
| is not specified.  If the file does not exist it is created.
 | |
| 
 | |
| The general format for appending output is:
 | |
| @example
 | |
| [@var{n}]>>@var{word}
 | |
| @end example
 | |
| 
 | |
| @subsection Redirecting Standard Output and Standard Error
 | |
| This construct allows both the
 | |
| standard output (file descriptor 1) and
 | |
| the standard error output (file descriptor 2)
 | |
| to be redirected to the file whose name is the
 | |
| expansion of @var{word}.
 | |
| 
 | |
| There are two formats for redirecting standard output and
 | |
| standard error:
 | |
| @example
 | |
| &>@var{word}
 | |
| @end example
 | |
| @noindent
 | |
| and
 | |
| @example
 | |
| >&@var{word}
 | |
| @end example
 | |
| @noindent
 | |
| Of the two forms, the first is preferred.
 | |
| This is semantically equivalent to
 | |
| @example
 | |
| >@var{word} 2>&1
 | |
| @end example
 | |
| 
 | |
| @subsection Appending Standard Output and Standard Error
 | |
| This construct allows both the
 | |
| standard output (file descriptor 1) and
 | |
| the standard error output (file descriptor 2)
 | |
| to be appended to the file whose name is the
 | |
| expansion of @var{word}.
 | |
| 
 | |
| The format for appending standard output and standard error is:
 | |
| @example
 | |
| &>>@var{word}
 | |
| @end example
 | |
| @noindent
 | |
| This is semantically equivalent to
 | |
| @example
 | |
| >>@var{word} 2>&1
 | |
| @end example
 | |
| 
 | |
| @subsection Here Documents
 | |
| This type of redirection instructs the shell to read input from the
 | |
| current source until a line containing only @var{word}
 | |
| (with no trailing blanks) is seen.  All of
 | |
| the lines read up to that point are then used as the standard
 | |
| input for a command.
 | |
| 
 | |
| The format of here-documents is:
 | |
| @example
 | |
| <<[@minus{}]@var{word}
 | |
|         @var{here-document}
 | |
| @var{delimiter}
 | |
| @end example
 | |
| 
 | |
| No parameter expansion, command substitution, arithmetic expansion,
 | |
| or filename expansion is performed on
 | |
| @var{word}.  If any characters in @var{word} are quoted, the
 | |
| @var{delimiter} is the result of quote removal on @var{word},
 | |
| and the lines in the here-document are not expanded.
 | |
| If @var{word} is unquoted,
 | |
| all lines of the here-document are subjected to parameter expansion,
 | |
| command substitution, and arithmetic expansion.  In the latter
 | |
| case, the character sequence @code{\newline} is ignored, and @samp{\}
 | |
| must be used to quote the characters
 | |
| @samp{\}, @samp{$}, and @samp{`}.
 | |
| 
 | |
| If the redirection operator is @samp{<<-},
 | |
| then all leading tab characters are stripped from input lines and the
 | |
| line containing @var{delimiter}.
 | |
| This allows here-documents within shell scripts to be indented in a
 | |
| natural fashion.
 | |
| 
 | |
| @subsection Here Strings
 | |
| A variant of here documents, the format is:
 | |
| @example
 | |
| <<< @var{word}
 | |
| @end example
 | |
| 
 | |
| The @var{word} is expanded and supplied to the command on its standard
 | |
| input.
 | |
| 
 | |
| @subsection Duplicating File Descriptors
 | |
| The redirection operator
 | |
| @example
 | |
| [@var{n}]<&@var{word}
 | |
| @end example
 | |
| @noindent
 | |
| is used to duplicate input file descriptors.
 | |
| If @var{word}
 | |
| expands to one or more digits, the file descriptor denoted by @var{n}
 | |
| is made to be a copy of that file descriptor.
 | |
| If the digits in @var{word} do not specify a file descriptor open for
 | |
| input, a redirection error occurs.
 | |
| If @var{word}
 | |
| evaluates to @samp{-}, file descriptor @var{n} is closed.  If
 | |
| @var{n} is not specified, the standard input (file descriptor 0) is used.
 | |
| 
 | |
| The operator
 | |
| @example
 | |
| [@var{n}]>&@var{word}
 | |
| @end example
 | |
| @noindent
 | |
| is used similarly to duplicate output file descriptors.  If
 | |
| @var{n} is not specified, the standard output (file descriptor 1) is used.
 | |
| If the digits in @var{word} do not specify a file descriptor open for
 | |
| output, a redirection error occurs.
 | |
| As a special case, if @var{n} is omitted, and @var{word} does not
 | |
| expand to one or more digits, the standard output and standard
 | |
| error are redirected as described previously.
 | |
| 
 | |
| @subsection Moving File Descriptors
 | |
| The redirection operator
 | |
| @example
 | |
| [@var{n}]<&@var{digit}-
 | |
| @end example
 | |
| @noindent
 | |
| moves the file descriptor @var{digit} to file descriptor @var{n},
 | |
| or the standard input (file descriptor 0) if @var{n} is not specified.
 | |
| @var{digit} is closed after being duplicated to @var{n}.
 | |
| 
 | |
| Similarly, the redirection operator
 | |
| @example
 | |
| [@var{n}]>&@var{digit}-
 | |
| @end example
 | |
| @noindent
 | |
| moves the file descriptor @var{digit} to file descriptor @var{n},
 | |
| or the standard output (file descriptor 1) if @var{n} is not specified.
 | |
| 
 | |
| @subsection Opening File Descriptors for Reading and Writing
 | |
| The redirection operator
 | |
| @example
 | |
| [@var{n}]<>@var{word}
 | |
| @end example
 | |
| @noindent
 | |
| causes the file whose name is the expansion of @var{word}
 | |
| to be opened for both reading and writing on file descriptor
 | |
| @var{n}, or on file descriptor 0 if @var{n}
 | |
| is not specified.  If the file does not exist, it is created.
 | |
| 
 | |
| @node Executing Commands
 | |
| @section Executing Commands
 | |
| 
 | |
| @menu
 | |
| * Simple Command Expansion::	How Bash expands simple commands before
 | |
| 				executing them.
 | |
| * Command Search and Execution::	How Bash finds commands and runs them.
 | |
| * Command Execution Environment::	The environment in which Bash
 | |
| 					executes commands that are not
 | |
| 					shell builtins.
 | |
| * Environment::		The environment given to a command.
 | |
| * Exit Status::		The status returned by commands and how Bash
 | |
| 			interprets it.
 | |
| * Signals::		What happens when Bash or a command it runs
 | |
| 			receives a signal.
 | |
| @end menu
 | |
| 
 | |
| @node Simple Command Expansion
 | |
| @subsection Simple Command Expansion
 | |
| @cindex command expansion
 | |
| 
 | |
| When a simple command is executed, the shell performs the following
 | |
| expansions, assignments, and redirections, from left to right.
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| The words that the parser has marked as variable assignments (those
 | |
| preceding the command name) and redirections are saved for later
 | |
| processing.
 | |
| 
 | |
| @item
 | |
| The words that are not variable assignments or redirections are
 | |
| expanded (@pxref{Shell Expansions}).
 | |
| If any words remain after expansion, the first word
 | |
| is taken to be the name of the command and the remaining words are
 | |
| the arguments.
 | |
| 
 | |
| @item
 | |
| Redirections are performed as described above (@pxref{Redirections}).
 | |
| 
 | |
| @item
 | |
| The text after the @samp{=} in each variable assignment undergoes tilde
 | |
| expansion, parameter expansion, command substitution, arithmetic expansion,
 | |
| and quote removal before being assigned to the variable.
 | |
| @end enumerate
 | |
| 
 | |
| If no command name results, the variable assignments affect the current
 | |
| shell environment.  Otherwise, the variables are added to the environment
 | |
| of the executed command and do not affect the current shell environment.
 | |
| If any of the assignments attempts to assign a value to a readonly variable,
 | |
| an error occurs, and the command exits with a non-zero status.
 | |
| 
 | |
| If no command name results, redirections are performed, but do not
 | |
| affect the current shell environment.  A redirection error causes the
 | |
| command to exit with a non-zero status.
 | |
| 
 | |
| If there is a command name left after expansion, execution proceeds as
 | |
| described below.  Otherwise, the command exits.  If one of the expansions
 | |
| contained a command substitution, the exit status of the command is
 | |
| the exit status of the last command substitution performed.  If there
 | |
| were no command substitutions, the command exits with a status of zero.
 | |
| 
 | |
| @node Command Search and Execution
 | |
| @subsection Command Search and Execution
 | |
| @cindex command execution
 | |
| @cindex command search
 | |
| 
 | |
| After a command has been split into words, if it results in a
 | |
| simple command and an optional list of arguments, the following
 | |
| actions are taken.
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| If the command name contains no slashes, the shell attempts to
 | |
| locate it.  If there exists a shell function by that name, that
 | |
| function is invoked as described in @ref{Shell Functions}.
 | |
| 
 | |
| @item
 | |
| If the name does not match a function, the shell searches for
 | |
| it in the list of shell builtins.  If a match is found, that
 | |
| builtin is invoked.
 | |
| 
 | |
| @item
 | |
| If the name is neither a shell function nor a builtin,
 | |
| and contains no slashes, Bash searches each element of
 | |
| @env{$PATH} for a directory containing an executable file
 | |
| by that name.  Bash uses a hash table to remember the full
 | |
| pathnames of executable files to avoid multiple @env{PATH} searches
 | |
| (see the description of @code{hash} in @ref{Bourne Shell Builtins}).
 | |
| A full search of the directories in @env{$PATH}
 | |
| is performed only if the command is not found in the hash table.
 | |
| If the search is unsuccessful, the shell searches for a defined shell
 | |
| function named @code{command_not_found_handle}.
 | |
| If that function exists, it is invoked with the original command and
 | |
| the original command's arguments as its arguments, and the function's
 | |
| exit status becomes the exit status of the shell.
 | |
| If that function is not defined, the shell prints an error
 | |
| message and returns an exit status of 127.
 | |
| 
 | |
| @item
 | |
| If the search is successful, or if the command name contains
 | |
| one or more slashes, the shell executes the named program in
 | |
| a separate execution environment.
 | |
| Argument 0 is set to the name given, and the remaining arguments
 | |
| to the command are set to the arguments supplied, if any.
 | |
| 
 | |
| @item
 | |
| If this execution fails because the file is not in executable
 | |
| format, and the file is not a directory, it is assumed to be a
 | |
| @var{shell script} and the shell executes it as described in
 | |
| @ref{Shell Scripts}.
 | |
| 
 | |
| @item
 | |
| If the command was not begun asynchronously, the shell waits for
 | |
| the command to complete and collects its exit status.
 | |
| 
 | |
| @end enumerate
 | |
| 
 | |
| @node Command Execution Environment
 | |
| @subsection Command Execution Environment
 | |
| @cindex execution environment
 | |
| 
 | |
| The shell has an @var{execution environment}, which consists of the
 | |
| following:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| open files inherited by the shell at invocation, as modified by
 | |
| redirections supplied to the @code{exec} builtin
 | |
| 
 | |
| @item
 | |
| the current working directory as set by @code{cd}, @code{pushd}, or
 | |
| @code{popd}, or inherited by the shell at invocation
 | |
| 
 | |
| @item
 | |
| the file creation mode mask as set by @code{umask} or inherited from
 | |
| the shell's parent
 | |
| 
 | |
| @item
 | |
| current traps set by @code{trap}
 | |
| 
 | |
| @item
 | |
| shell parameters that are set by variable assignment or with @code{set}
 | |
| or inherited from the shell's parent in the environment
 | |
| 
 | |
| @item
 | |
| shell functions defined during execution or inherited from the shell's
 | |
| parent in the environment
 | |
| 
 | |
| @item
 | |
| options enabled at invocation (either by default or with command-line
 | |
| arguments) or by @code{set}
 | |
| 
 | |
| @item
 | |
| options enabled by @code{shopt} (@pxref{The Shopt Builtin})
 | |
| 
 | |
| @item
 | |
| shell aliases defined with @code{alias} (@pxref{Aliases})
 | |
| 
 | |
| @item
 | |
| various process @sc{id}s, including those of background jobs
 | |
| (@pxref{Lists}), the value of @code{$$}, and the value of
 | |
| @env{$PPID}
 | |
| 
 | |
| @end itemize
 | |
| 
 | |
| When a simple command other than a builtin or shell function
 | |
| is to be executed, it
 | |
| is invoked in a separate execution environment that consists of
 | |
| the following.  Unless otherwise noted, the values are inherited
 | |
| from the shell.
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| the shell's open files, plus any modifications and additions specified
 | |
| by redirections to the command
 | |
| 
 | |
| @item
 | |
| the current working directory
 | |
| 
 | |
| @item
 | |
| the file creation mode mask
 | |
| 
 | |
| @item
 | |
| shell variables and functions marked for export, along with variables
 | |
| exported for the command, passed in the environment (@pxref{Environment})
 | |
| 
 | |
| @item
 | |
| traps caught by the shell are reset to the values inherited from the
 | |
| shell's parent, and traps ignored by the shell are ignored
 | |
| 
 | |
| @end itemize
 | |
| 
 | |
| A command invoked in this separate environment cannot affect the
 | |
| shell's execution environment. 
 | |
| 
 | |
| Command substitution, commands grouped with parentheses,
 | |
| and asynchronous commands are invoked in a
 | |
| subshell environment that is a duplicate of the shell environment,
 | |
| except that traps caught by the shell are reset to the values
 | |
| that the shell inherited from its parent at invocation.  Builtin
 | |
| commands that are invoked as part of a pipeline are also executed
 | |
| in a subshell environment.  Changes made to the subshell environment
 | |
| cannot affect the shell's execution environment.
 | |
| 
 | |
| Subshells spawned to execute command substitutions inherit the value of
 | |
| the @option{-e} option from the parent shell.  When not in @sc{posix} mode,
 | |
| Bash clears the @option{-e} option in such subshells.
 | |
| 
 | |
| If a command is followed by a @samp{&} and job control is not active, the
 | |
| default standard input for the command is the empty file @file{/dev/null}.
 | |
| Otherwise, the invoked command inherits the file descriptors of the calling
 | |
| shell as modified by redirections.
 | |
| 
 | |
| @node Environment
 | |
| @subsection Environment
 | |
| @cindex environment
 | |
| 
 | |
| When a program is invoked it is given an array of strings
 | |
| called the @var{environment}.
 | |
| This is a list of name-value pairs, of the form @code{name=value}.
 | |
| 
 | |
| Bash provides several ways to manipulate the environment.
 | |
| On invocation, the shell scans its own environment and
 | |
| creates a parameter for each name found, automatically marking
 | |
| it for @var{export}
 | |
| to child processes.  Executed commands inherit the environment.
 | |
| The @code{export} and @samp{declare -x}
 | |
| commands allow parameters and functions to be added to and
 | |
| deleted from the environment.  If the value of a parameter
 | |
| in the environment is modified, the new value becomes part
 | |
| of the environment, replacing the old.  The environment
 | |
| inherited by any executed command consists of the shell's
 | |
| initial environment, whose values may be modified in the shell,
 | |
| less any pairs removed by the @code{unset} and @samp{export -n}
 | |
| commands, plus any additions via the @code{export} and
 | |
| @samp{declare -x} commands.
 | |
| 
 | |
| The environment for any simple command
 | |
| or function may be augmented temporarily by prefixing it with
 | |
| parameter assignments, as described in @ref{Shell Parameters}.
 | |
| These assignment statements affect only the environment seen
 | |
| by that command.
 | |
| 
 | |
| If the @option{-k} option is set (@pxref{The Set Builtin}), then all
 | |
| parameter assignments are placed in the environment for a command,
 | |
| not just those that precede the command name.
 | |
| 
 | |
| When Bash invokes an external command, the variable @samp{$_}
 | |
| is set to the full path name of the command and passed to that
 | |
| command in its environment.
 | |
| 
 | |
| @node Exit Status
 | |
| @subsection Exit Status
 | |
| @cindex exit status
 | |
| 
 | |
| The exit status of an executed command is the value returned by the
 | |
| @var{waitpid} system call or equivalent function.  Exit statuses    
 | |
| fall between 0 and 255, though, as explained below, the shell may
 | |
| use values above 125 specially.  Exit statuses from shell builtins and
 | |
| compound commands are also limited to this range. Under certain
 | |
| circumstances, the shell will use special values to indicate specific
 | |
| failure modes.
 | |
| 
 | |
| For the shell's purposes, a command which exits with a
 | |
| zero exit status has succeeded.
 | |
| A non-zero exit status indicates failure.
 | |
| This seemingly counter-intuitive scheme is used so there
 | |
| is one well-defined way to indicate success and a variety of
 | |
| ways to indicate various failure modes.
 | |
| When a command terminates on a fatal signal whose number is @var{N},
 | |
| Bash uses the value 128+@var{N} as the exit status.
 | |
| 
 | |
| If a command is not found, the child process created to
 | |
| execute it returns a status of 127.  If a command is found  
 | |
| but is not executable, the return status is 126.
 | |
| 
 | |
| If a command fails because of an error during expansion or redirection,
 | |
| the exit status is greater than zero.
 | |
| 
 | |
| The exit status is used by the Bash conditional commands
 | |
| (@pxref{Conditional Constructs}) and some of the list
 | |
| constructs (@pxref{Lists}).
 | |
| 
 | |
| All of the Bash builtins return an exit status of zero if they succeed
 | |
| and a non-zero status on failure, so they may be used by the
 | |
| conditional and list constructs.
 | |
| All builtins return an exit status of 2 to indicate incorrect usage.
 | |
| 
 | |
| @node Signals
 | |
| @subsection Signals
 | |
| @cindex signal handling
 | |
| 
 | |
| When Bash is interactive, in the absence of any traps, it ignores
 | |
| @code{SIGTERM} (so that @samp{kill 0} does not kill an interactive shell),
 | |
| and @code{SIGINT}
 | |
| is caught and handled (so that the @code{wait} builtin is interruptible).
 | |
| When Bash receives a @code{SIGINT}, it breaks out of any executing loops.
 | |
| In all cases, Bash ignores @code{SIGQUIT}.
 | |
| If job control is in effect (@pxref{Job Control}), Bash
 | |
| ignores @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
 | |
| 
 | |
| Non-builtin commands started by Bash have signal handlers set to the
 | |
| values inherited by the shell from its parent.
 | |
| When job control is not in effect, asynchronous commands
 | |
| ignore @code{SIGINT} and @code{SIGQUIT} in addition to these inherited
 | |
| handlers.
 | |
| Commands run as a result of
 | |
| command substitution ignore the keyboard-generated job control signals
 | |
| @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
 | |
| 
 | |
| The shell exits by default upon receipt of a @code{SIGHUP}.
 | |
| Before exiting, an interactive shell resends the @code{SIGHUP} to
 | |
| all jobs, running or stopped.
 | |
| Stopped jobs are sent @code{SIGCONT} to ensure that they receive
 | |
| the @code{SIGHUP}.
 | |
| To prevent the shell from sending the @code{SIGHUP} signal to a
 | |
| particular job, it should be removed
 | |
| from the jobs table with the @code{disown}
 | |
| builtin (@pxref{Job Control Builtins}) or marked
 | |
| to not receive @code{SIGHUP} using @code{disown -h}.
 | |
| 
 | |
| If the  @code{huponexit} shell option has been set with @code{shopt}
 | |
| (@pxref{The Shopt Builtin}), Bash sends a @code{SIGHUP} to all jobs when
 | |
| an interactive login shell exits.
 | |
| 
 | |
| If Bash is waiting for a command to complete and receives a signal
 | |
| for which a trap has been set, the trap will not be executed until
 | |
| the command completes. 
 | |
| When Bash is waiting for an asynchronous
 | |
| command via the @code{wait} builtin, the reception of a signal for
 | |
| which a trap has been set will cause the @code{wait} builtin to return
 | |
| immediately with an exit status greater than 128, immediately after
 | |
| which the trap is executed.
 | |
| 
 | |
| @node Shell Scripts
 | |
| @section Shell Scripts
 | |
| @cindex shell script
 | |
| 
 | |
| A shell script is a text file containing shell commands.  When such
 | |
| a file is used as the first non-option argument when invoking Bash,
 | |
| and neither the @option{-c} nor @option{-s} option is supplied
 | |
| (@pxref{Invoking Bash}), 
 | |
| Bash reads and executes commands from the file, then exits.  This
 | |
| mode of operation creates a non-interactive shell.  The shell first
 | |
| searches for the file in the current directory, and looks in the
 | |
| directories in @env{$PATH} if not found there.
 | |
| 
 | |
| When Bash runs
 | |
| a shell script, it sets the special parameter @code{0} to the name
 | |
| of the file, rather than the name of the shell, and the positional
 | |
| parameters are set to the remaining arguments, if any are given.
 | |
| If no additional arguments are supplied, the positional parameters
 | |
| are unset.
 | |
| 
 | |
| A shell script may be made executable by using the @code{chmod} command
 | |
| to turn on the execute bit.  When Bash finds such a file while
 | |
| searching the @env{$PATH} for a command, it spawns a subshell to
 | |
| execute it.  In other words, executing
 | |
| @example
 | |
| filename @var{arguments}
 | |
| @end example
 | |
| @noindent
 | |
| is equivalent to executing
 | |
| @example
 | |
| bash filename @var{arguments}
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| if @code{filename} is an executable shell script.
 | |
| This subshell reinitializes itself, so that the effect is as if a
 | |
| new shell had been invoked to interpret the script, with the
 | |
| exception that the locations of commands remembered by the parent
 | |
| (see the description of @code{hash} in @ref{Bourne Shell Builtins})
 | |
| are retained by the child.
 | |
| 
 | |
| Most versions of Unix make this a part of the operating system's command
 | |
| execution mechanism.  If the first line of a script begins with
 | |
| the two characters @samp{#!}, the remainder of the line specifies
 | |
| an interpreter for the program.
 | |
| Thus, you can specify Bash, @code{awk}, Perl, or some other
 | |
| interpreter and write the rest of the script file in that language.
 | |
| 
 | |
| The arguments to the interpreter
 | |
| consist of a single optional argument following the interpreter
 | |
| name on the first line of the script file, followed by the name of
 | |
| the script file, followed by the rest of the arguments.  Bash
 | |
| will perform this action on operating systems that do not handle it
 | |
| themselves.  Note that some older versions of Unix limit the interpreter
 | |
| name and argument to a maximum of 32 characters.
 | |
| 
 | |
| Bash scripts often begin with @code{#! /bin/bash} (assuming that
 | |
| Bash has been installed in @file{/bin}), since this ensures that
 | |
| Bash will be used to interpret the script, even if it is executed
 | |
| under another shell.
 | |
| 
 | |
| @node Shell Builtin Commands
 | |
| @chapter Shell Builtin Commands
 | |
| 
 | |
| @menu
 | |
| * Bourne Shell Builtins::	Builtin commands inherited from the Bourne
 | |
| 				Shell.
 | |
| * Bash Builtins::		Table of builtins specific to Bash.
 | |
| * Modifying Shell Behavior::	Builtins to modify shell attributes and
 | |
| 				optional behavior.
 | |
| * Special Builtins::		Builtin commands classified specially by
 | |
| 				POSIX.
 | |
| @end menu
 | |
| 
 | |
| Builtin commands are contained within the shell itself.
 | |
| When the name of a builtin command is used as the first word of
 | |
| a simple command (@pxref{Simple Commands}), the shell executes
 | |
| the command directly, without invoking another program.
 | |
| Builtin commands are necessary to implement functionality impossible
 | |
| or inconvenient to obtain with separate utilities.
 | |
| 
 | |
| This section briefly describes the builtins which Bash inherits from
 | |
| the Bourne Shell, as well as the builtin commands which are unique
 | |
| to or have been extended in Bash.
 | |
| 
 | |
| Several builtin commands are described in other chapters:  builtin
 | |
| commands which provide the Bash interface to the job control
 | |
| facilities (@pxref{Job Control Builtins}), the directory stack
 | |
| (@pxref{Directory Stack Builtins}), the command history
 | |
| (@pxref{Bash History Builtins}), and the programmable completion
 | |
| facilities (@pxref{Programmable Completion Builtins}).
 | |
| 
 | |
| Many of the builtins have been extended by @sc{posix} or Bash.
 | |
| 
 | |
| Unless otherwise noted, each builtin command documented as accepting
 | |
| options preceded by @samp{-} accepts @samp{--}
 | |
| to signify the end of the options.
 | |
| The @code{:}, @code{true}, @code{false}, and @code{test}
 | |
| builtins do not accept options and do not treat @samp{--} specially.
 | |
| The @code{exit}, @code{logout}, @code{break}, @code{continue}, @code{let},
 | |
| and @code{shift} builtins accept and process arguments beginning
 | |
| with @samp{-} without requiring @samp{--}.
 | |
| Other builtins that accept arguments but are not specified as accepting
 | |
| options interpret arguments beginning with @samp{-} as invalid options and
 | |
| require @samp{--} to prevent this interpretation.
 | |
| 
 | |
| @node Bourne Shell Builtins
 | |
| @section Bourne Shell Builtins
 | |
| 
 | |
| The following shell builtin commands are inherited from the Bourne Shell.
 | |
| These commands are implemented as specified by the @sc{posix} standard.
 | |
| 
 | |
| @table @code
 | |
| @item :    @r{(a colon)}
 | |
| @btindex :
 | |
| @example
 | |
| : [@var{arguments}]
 | |
| @end example
 | |
| Do nothing beyond expanding @var{arguments} and performing redirections.
 | |
| The return status is zero.
 | |
| 
 | |
| @item .    @r{(a period)}
 | |
| @btindex .
 | |
| @example
 | |
| . @var{filename} [@var{arguments}]
 | |
| @end example
 | |
| Read and execute commands from the @var{filename} argument in the
 | |
| current shell context.  If @var{filename} does not contain a slash,
 | |
| the @env{PATH} variable is used to find @var{filename}.
 | |
| When Bash is not in @sc{posix} mode, the current directory is searched
 | |
| if @var{filename} is not found in @env{$PATH}.
 | |
| If any @var{arguments} are supplied, they become the positional
 | |
| parameters when @var{filename} is executed.  Otherwise the positional
 | |
| parameters are unchanged.
 | |
| The return status is the exit status of the last command executed, or
 | |
| zero if no commands are executed.  If @var{filename} is not found, or
 | |
| cannot be read, the return status is non-zero.
 | |
| This builtin is equivalent to @code{source}.
 | |
| 
 | |
| @item break
 | |
| @btindex break
 | |
| @example
 | |
| break [@var{n}]
 | |
| @end example
 | |
| Exit from a @code{for}, @code{while}, @code{until}, or @code{select} loop.
 | |
| If @var{n} is supplied, the @var{n}th enclosing loop is exited.
 | |
| @var{n} must be greater than or equal to 1.
 | |
| The return status is zero unless @var{n} is not greater than or equal to 1.
 | |
| 
 | |
| @item cd
 | |
| @btindex cd
 | |
| @example
 | |
| cd [-L|[-P [-e]]] [@var{directory}]
 | |
| @end example
 | |
| Change the current working directory to @var{directory}.
 | |
| If @var{directory} is not given, the value of the @env{HOME} shell
 | |
| variable is used.
 | |
| If the shell variable @env{CDPATH} exists, it is used as a search path.
 | |
| If @var{directory} begins with a slash, @env{CDPATH} is not used.
 | |
| 
 | |
| The @option{-P} option means to not follow symbolic links; symbolic
 | |
| links are followed by default or with the @option{-L} option.
 | |
| If the @option{-e} option is supplied with @option{-P}
 | |
| and the current working directory cannot be successfully determined
 | |
| after a successful directory change, @code{cd} will return an unsuccessful
 | |
| status.
 | |
| If @var{directory} is @samp{-}, it is equivalent to @env{$OLDPWD}.
 | |
| 
 | |
| If a non-empty directory name from @env{CDPATH} is used, or if
 | |
| @samp{-} is the first argument, and the directory change is
 | |
| successful, the absolute pathname of the new working directory is
 | |
| written to the standard output.
 | |
| 
 | |
| The return status is zero if the directory is successfully changed,
 | |
| non-zero otherwise.
 | |
| 
 | |
| @item continue
 | |
| @btindex continue
 | |
| @example
 | |
| continue [@var{n}]
 | |
| @end example
 | |
| Resume the next iteration of an enclosing @code{for}, @code{while},
 | |
| @code{until}, or @code{select} loop.
 | |
| If @var{n} is supplied, the execution of the @var{n}th enclosing loop
 | |
| is resumed.
 | |
| @var{n} must be greater than or equal to 1.
 | |
| The return status is zero unless @var{n} is not greater than or equal to 1.
 | |
| 
 | |
| @item eval
 | |
| @btindex eval
 | |
| @example
 | |
| eval [@var{arguments}]
 | |
| @end example
 | |
| The arguments are concatenated together into a single command, which is
 | |
| then read and executed, and its exit status returned as the exit status
 | |
| of @code{eval}.
 | |
| If there are no arguments or only empty arguments, the return status is
 | |
| zero.
 | |
| 
 | |
| @item exec
 | |
| @btindex exec
 | |
| @example
 | |
| exec [-cl] [-a @var{name}] [@var{command} [@var{arguments}]]
 | |
| @end example
 | |
| If @var{command}
 | |
| is supplied, it replaces the shell without creating a new process.
 | |
| If the @option{-l} option is supplied, the shell places a dash at the
 | |
| beginning of the zeroth argument passed to @var{command}.
 | |
| This is what the @code{login} program does.
 | |
| The @option{-c} option causes @var{command} to be executed with an empty
 | |
| environment.
 | |
| If @option{-a} is supplied, the shell passes @var{name} as the zeroth
 | |
| argument to @var{command}.
 | |
| If no @var{command} is specified, redirections may be used to affect
 | |
| the current shell environment.  If there are no redirection errors, the
 | |
| return status is zero; otherwise the return status is non-zero.
 | |
| 
 | |
| @item exit
 | |
| @btindex exit
 | |
| @example
 | |
| exit [@var{n}]
 | |
| @end example
 | |
| Exit the shell, returning a status of @var{n} to the shell's parent.
 | |
| If @var{n} is omitted, the exit status is that of the last command executed.
 | |
| Any trap on @code{EXIT} is executed before the shell terminates.
 | |
| 
 | |
| @item export
 | |
| @btindex export
 | |
| @example
 | |
| export [-fn] [-p] [@var{name}[=@var{value}]]
 | |
| @end example
 | |
| Mark each @var{name} to be passed to child processes
 | |
| in the environment.  If the @option{-f} option is supplied, the @var{name}s
 | |
| refer to shell functions; otherwise the names refer to shell variables.
 | |
| The @option{-n} option means to no longer mark each @var{name} for export.
 | |
| If no @var{names} are supplied, or if the @option{-p} option is given, a
 | |
| list of exported names is displayed.
 | |
| The @option{-p} option displays output in a form that may be reused as input.
 | |
| If a variable name is followed by =@var{value}, the value of
 | |
| the variable is set to @var{value}.
 | |
| 
 | |
| The return status is zero unless an invalid option is supplied, one of
 | |
| the names is not a valid shell variable name, or @option{-f} is supplied
 | |
| with a name that is not a shell function.
 | |
| 
 | |
| @item getopts
 | |
| @btindex getopts
 | |
| @example
 | |
| getopts @var{optstring} @var{name} [@var{args}]
 | |
| @end example
 | |
| @code{getopts} is used by shell scripts to parse positional parameters.
 | |
| @var{optstring} contains the option characters to be recognized; if a
 | |
| character is followed by a colon, the option is expected to have an
 | |
| argument, which should be separated from it by white space.
 | |
| The colon (@samp{:}) and question mark (@samp{?}) may not be
 | |
| used as option characters.
 | |
| Each time it is invoked, @code{getopts}
 | |
| places the next option in the shell variable @var{name}, initializing
 | |
| @var{name} if it does not exist,
 | |
| and the index of the next argument to be processed into the
 | |
| variable @env{OPTIND}.
 | |
| @env{OPTIND} is initialized to 1 each time the shell or a shell script
 | |
| is invoked.
 | |
| When an option requires an argument,
 | |
| @code{getopts} places that argument into the variable @env{OPTARG}.
 | |
| The shell does not reset @env{OPTIND} automatically; it must be manually
 | |
| reset between multiple calls to @code{getopts} within the same shell
 | |
| invocation if a new set of parameters is to be used.
 | |
| 
 | |
| When the end of options is encountered, @code{getopts} exits with a
 | |
| return value greater than zero.
 | |
| @env{OPTIND} is set to the index of the first non-option argument,
 | |
| and @var{name} is set to @samp{?}.
 | |
| 
 | |
| @code{getopts}
 | |
| normally parses the positional parameters, but if more arguments are
 | |
| given in @var{args}, @code{getopts} parses those instead.
 | |
| 
 | |
| @code{getopts} can report errors in two ways.  If the first character of
 | |
| @var{optstring} is a colon, @var{silent}
 | |
| error reporting is used.  In normal operation diagnostic messages
 | |
| are printed when invalid options or missing option arguments are
 | |
| encountered.
 | |
| If the variable @env{OPTERR}
 | |
| is set to 0, no error messages will be displayed, even if the first
 | |
| character of @code{optstring} is not a colon.
 | |
| 
 | |
| If an invalid option is seen,
 | |
| @code{getopts} places @samp{?} into @var{name} and, if not silent,
 | |
| prints an error message and unsets @env{OPTARG}.
 | |
| If @code{getopts} is silent, the option character found is placed in
 | |
| @env{OPTARG} and no diagnostic message is printed.
 | |
| 
 | |
| If a required argument is not found, and @code{getopts}
 | |
| is not silent, a question mark (@samp{?}) is placed in @var{name},
 | |
| @code{OPTARG} is unset, and a diagnostic message is printed.
 | |
| If @code{getopts} is silent, then a colon (@samp{:}) is placed in
 | |
| @var{name} and @env{OPTARG} is set to the option character found.
 | |
| 
 | |
| @item hash
 | |
| @btindex hash
 | |
| @example
 | |
| hash [-r] [-p @var{filename}] [-dt] [@var{name}]
 | |
| @end example
 | |
| Each time @code{hash} is invoked, it remembers the full pathnames of the
 | |
| commands specified as @var{name} arguments,
 | |
| so they need not be searched for on subsequent invocations.
 | |
| The commands are found by searching through the directories listed in
 | |
| @env{$PATH}.
 | |
| Any previously-remembered pathname is discarded.
 | |
| The @option{-p} option inhibits the path search, and @var{filename} is
 | |
| used as the location of @var{name}.
 | |
| The @option{-r} option causes the shell to forget all remembered locations.
 | |
| The @option{-d} option causes the shell to forget the remembered location
 | |
| of each @var{name}.
 | |
| If the @option{-t} option is supplied, the full pathname to which each
 | |
| @var{name} corresponds is printed.  If multiple @var{name} arguments are
 | |
| supplied with @option{-t} the @var{name} is printed before the hashed
 | |
| full pathname.
 | |
| The @option{-l} option causes output to be displayed in a format
 | |
| that may be reused as input.
 | |
| If no arguments are given, or if only @option{-l} is supplied,
 | |
| information about remembered commands is printed.
 | |
| The return status is zero unless a @var{name} is not found or an invalid
 | |
| option is supplied.
 | |
| 
 | |
| @item pwd
 | |
| @btindex pwd
 | |
| @example
 | |
| pwd [-LP]
 | |
| @end example
 | |
| Print the absolute pathname of the current working directory.
 | |
| If the @option{-P} option is supplied, the pathname printed will not
 | |
| contain symbolic links.
 | |
| If the @option{-L} option is supplied, the pathname printed may contain
 | |
| symbolic links.
 | |
| The return status is zero unless an error is encountered while
 | |
| determining the name of the current directory or an invalid option
 | |
| is supplied.
 | |
| 
 | |
| @item readonly
 | |
| @btindex readonly
 | |
| @example
 | |
| readonly [-aAf] [-p] [@var{name}[=@var{value}]] @dots{}
 | |
| @end example
 | |
| Mark each @var{name} as readonly.
 | |
| The values of these names may not be changed by subsequent assignment.
 | |
| If the @option{-f} option is supplied, each @var{name} refers to a shell
 | |
| function.
 | |
| The @option{-a} option means each @var{name} refers to an indexed
 | |
| array variable; the @option{-A} option means each @var{name} refers
 | |
| to an associative array variable.
 | |
| If both options are supplied, @option{-A} takes precedence.
 | |
| If no @var{name} arguments are given, or if the @option{-p}
 | |
| option is supplied, a list of all readonly names is printed.
 | |
| The other options may be used to restrict the output to a subset of
 | |
| the set of readonly names.
 | |
| The @option{-p} option causes output to be displayed in a format that
 | |
| may be reused as input.
 | |
| If a variable name is followed by =@var{value}, the value of
 | |
| the variable is set to @var{value}.
 | |
| The return status is zero unless an invalid option is supplied, one of
 | |
| the @var{name} arguments is not a valid shell variable or function name,
 | |
| or the @option{-f} option is supplied with a name that is not a shell function.
 | |
| 
 | |
| @item return
 | |
| @btindex return
 | |
| @example
 | |
| return [@var{n}]
 | |
| @end example
 | |
| Cause a shell function to exit with the return value @var{n}.
 | |
| If @var{n} is not supplied, the return value is the exit status of the
 | |
| last command executed in the function.
 | |
| This may also be used to terminate execution of a script being executed
 | |
| with the @code{.} (or @code{source}) builtin, returning either @var{n} or
 | |
| the exit status of the last command executed within the script as the exit
 | |
| status of the script.
 | |
| Any command associated with the @code{RETURN} trap is executed
 | |
| before execution resumes after the function or script.
 | |
| The return status is non-zero if @code{return} is used outside a function
 | |
| and not during the execution of a script by @code{.} or @code{source}.
 | |
| 
 | |
| @item shift
 | |
| @btindex shift
 | |
| @example
 | |
| shift [@var{n}]
 | |
| @end example
 | |
| Shift the positional parameters to the left by @var{n}.
 | |
| The positional parameters from @var{n}+1 @dots{} @code{$#} are
 | |
| renamed to @code{$1} @dots{} @code{$#}-@var{n}.
 | |
| Parameters represented by the numbers @code{$#} to @code{$#}-@var{n}+1
 | |
| are unset.
 | |
| @var{n} must be a non-negative number less than or equal to @code{$#}.
 | |
| If @var{n} is zero or greater than @code{$#}, the positional parameters
 | |
| are not changed.
 | |
| If @var{n} is not supplied, it is assumed to be 1.
 | |
| The return status is zero unless @var{n} is greater than @code{$#} or
 | |
| less than zero, non-zero otherwise.
 | |
| 
 | |
| @item test
 | |
| @itemx [
 | |
| @btindex test
 | |
| @btindex [
 | |
| Evaluate a conditional expression @var{expr}.
 | |
| Each operator and operand must be a separate argument.
 | |
| Expressions are composed of the primaries described below in
 | |
| @ref{Bash Conditional Expressions}.
 | |
| @code{test} does not accept any options, nor does it accept and ignore
 | |
| an argument of @option{--} as signifying the end of options.
 | |
| 
 | |
| When the @code{[} form is used, the last argument to the command must
 | |
| be a @code{]}.
 | |
| 
 | |
| Expressions may be combined using the following operators, listed in
 | |
| decreasing order of precedence.
 | |
| The evaluation depends on the number of arguments; see below.
 | |
| Operator precedence is used when there are five or more arguments.
 | |
| 
 | |
| @table @code
 | |
| @item ! @var{expr}
 | |
| True if @var{expr} is false.
 | |
| 
 | |
| @item ( @var{expr} )
 | |
| Returns the value of @var{expr}.
 | |
| This may be used to override the normal precedence of operators.
 | |
| 
 | |
| @item @var{expr1} -a @var{expr2}
 | |
| True if both @var{expr1} and @var{expr2} are true.
 | |
| 
 | |
| @item @var{expr1} -o @var{expr2}
 | |
| True if either @var{expr1} or @var{expr2} is true.
 | |
| @end table
 | |
| 
 | |
| The @code{test} and @code{[} builtins evaluate conditional
 | |
| expressions using a set of rules based on the number of arguments.
 | |
| 
 | |
| @table @asis
 | |
| @item 0 arguments
 | |
| The expression is false.
 | |
| 
 | |
| @item 1 argument
 | |
| The expression is true if and only if the argument is not null.
 | |
| 
 | |
| @item 2 arguments
 | |
| If the first argument is @samp{!}, the expression is true if and
 | |
| only if the second argument is null.
 | |
| If the first argument is one of the unary conditional operators
 | |
| (@pxref{Bash Conditional Expressions}), the expression
 | |
| is true if the unary test is true.
 | |
| If the first argument is not a valid unary operator, the expression is
 | |
| false.
 | |
| 
 | |
| @item 3 arguments
 | |
| The following conditions are applied in the order listed.
 | |
| If the second argument is one of the binary conditional
 | |
| operators (@pxref{Bash Conditional Expressions}), the
 | |
| result of the expression is the result of the binary test using the
 | |
| first and third arguments as operands.
 | |
| The @samp{-a} and @samp{-o} operators are considered binary operators
 | |
| when there are three arguments.
 | |
| If the first argument is @samp{!}, the value is the negation of
 | |
| the two-argument test using the second and third arguments.
 | |
| If the first argument is exactly @samp{(} and the third argument is
 | |
| exactly @samp{)}, the result is the one-argument test of the second
 | |
| argument.
 | |
| Otherwise, the expression is false.
 | |
| 
 | |
| @item 4 arguments
 | |
| If the first argument is @samp{!}, the result is the negation of
 | |
| the three-argument expression composed of the remaining arguments.
 | |
| Otherwise, the expression is parsed and evaluated according to 
 | |
| precedence using the rules listed above.
 | |
| 
 | |
| @item 5 or more arguments
 | |
| The expression is parsed and evaluated according to precedence
 | |
| using the rules listed above.
 | |
| @end table
 | |
| 
 | |
| When used with @code{test} or @samp{[}, the @samp{<} and @samp{>}
 | |
| operators sort lexicographically using ASCII ordering.
 | |
| 
 | |
| @item times
 | |
| @btindex times
 | |
| @example
 | |
| times
 | |
| @end example
 | |
| Print out the user and system times used by the shell and its children.
 | |
| The return status is zero.
 | |
| 
 | |
| @item trap
 | |
| @btindex trap
 | |
| @example
 | |
| trap [-lp] [@var{arg}] [@var{sigspec} @dots{}]
 | |
| @end example
 | |
| The commands in @var{arg} are to be read and executed when the
 | |
| shell receives signal @var{sigspec}.  If @var{arg} is absent (and
 | |
| there is a single @var{sigspec}) or
 | |
| equal to @samp{-}, each specified signal's disposition is reset
 | |
| to the value it had when the shell was started.
 | |
| If @var{arg} is the null string, then the signal specified by
 | |
| each @var{sigspec} is ignored by the shell and commands it invokes.
 | |
| If @var{arg} is not present and @option{-p} has been supplied,
 | |
| the shell displays the trap commands associated with each @var{sigspec}.
 | |
| If no arguments are supplied, or
 | |
| only @option{-p} is given, @code{trap} prints the list of commands
 | |
| associated with each signal number in a form that may be reused as
 | |
| shell input.
 | |
| The @option{-l} option causes the shell to print a list of signal names
 | |
| and their corresponding numbers.
 | |
| Each @var{sigspec} is either a signal name or a signal number.
 | |
| Signal names are case insensitive and the @code{SIG} prefix is optional.
 | |
| 
 | |
| If a @var{sigspec}
 | |
| is @code{0} or @code{EXIT}, @var{arg} is executed when the shell exits.
 | |
| If a @var{sigspec} is @code{DEBUG}, the command @var{arg} is executed
 | |
| before every simple command, @code{for} command, @code{case} command,
 | |
| @code{select} command, every arithmetic @code{for} command, and before
 | |
| the first command executes in a shell function.
 | |
| Refer to the description of the @code{extdebug} option to the
 | |
| @code{shopt} builtin (@pxref{The Shopt Builtin}) for details of its
 | |
| effect on the @code{DEBUG} trap.
 | |
| If a @var{sigspec} is @code{RETURN}, the command @var{arg} is executed
 | |
| each time a shell function or a script executed with the @code{.} or
 | |
| @code{source} builtins finishes executing.
 | |
| 
 | |
| If a @var{sigspec} is @code{ERR}, the command @var{arg} 
 | |
| is executed whenever a simple command has a non-zero exit status,
 | |
| subject to the following conditions.
 | |
| The @code{ERR} trap is not executed if the failed command is part of the
 | |
| command list immediately following an @code{until} or @code{while} keyword,
 | |
| part of the test following the @code{if} or @code{elif} reserved words,
 | |
| part of a command executed in a @code{&&} or @code{||} list,
 | |
| or if the command's return
 | |
| status is being inverted using @code{!}.
 | |
| These are the same conditions obeyed by the @code{errexit} option.
 | |
| 
 | |
| Signals ignored upon entry to the shell cannot be trapped or reset.
 | |
| Trapped signals that are not being ignored are reset to their original
 | |
| values in a subshell or subshell environment when one is created.
 | |
| 
 | |
| The return status is zero unless a @var{sigspec} does not specify a
 | |
| valid signal.
 | |
| 
 | |
| @item umask
 | |
| @btindex umask
 | |
| @example
 | |
| umask [-p] [-S] [@var{mode}]
 | |
| @end example
 | |
| Set the shell process's file creation mask to @var{mode}.  If
 | |
| @var{mode} begins with a digit, it is interpreted as an octal number;
 | |
| if not, it is interpreted as a symbolic mode mask similar
 | |
| to that accepted by the @code{chmod} command.  If @var{mode} is
 | |
| omitted, the current value of the mask is printed.  If the @option{-S}
 | |
| option is supplied without a @var{mode} argument, the mask is printed
 | |
| in a symbolic format.
 | |
| If the  @option{-p} option is supplied, and @var{mode}
 | |
| is omitted, the output is in a form that may be reused as input.
 | |
| The return status is zero if the mode is successfully changed or if
 | |
| no @var{mode} argument is supplied, and non-zero otherwise.
 | |
| 
 | |
| Note that when the mode is interpreted as an octal number, each number
 | |
| of the umask is subtracted from @code{7}.  Thus, a umask of @code{022}
 | |
| results in permissions of @code{755}.
 | |
| 
 | |
| @item unset
 | |
| @btindex unset
 | |
| @example
 | |
| unset [-fv] [@var{name}]
 | |
| @end example
 | |
| Each variable or function @var{name} is removed.
 | |
| If no options are supplied, or the @option{-v} option is given, each
 | |
| @var{name} refers to a shell variable. 
 | |
| If the @option{-f} option is given, the @var{name}s refer to shell
 | |
| functions, and the function definition is removed.
 | |
| Readonly variables and functions may not be unset.
 | |
| The return status is zero unless a @var{name} is readonly.
 | |
| @end table
 | |
| 
 | |
| @node Bash Builtins
 | |
| @section Bash Builtin Commands
 | |
| 
 | |
| This section describes builtin commands which are unique to
 | |
| or have been extended in Bash.
 | |
| Some of these commands are specified in the @sc{posix} standard.
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item alias
 | |
| @btindex alias
 | |
| @example
 | |
| alias [@code{-p}] [@var{name}[=@var{value}] @dots{}]
 | |
| @end example
 | |
| 
 | |
| Without arguments or with the @option{-p} option, @code{alias} prints
 | |
| the list of aliases on the standard output in a form that allows
 | |
| them to be reused as input.
 | |
| If arguments are supplied, an alias is defined for each @var{name}
 | |
| whose @var{value} is given.  If no @var{value} is given, the name
 | |
| and value of the alias is printed.
 | |
| Aliases are described in @ref{Aliases}.
 | |
| 
 | |
| @item bind
 | |
| @btindex bind
 | |
| @example
 | |
| bind [-m @var{keymap}] [-lpsvPSV]
 | |
| bind [-m @var{keymap}] [-q @var{function}] [-u @var{function}] [-r @var{keyseq}]
 | |
| bind [-m @var{keymap}] -f @var{filename}
 | |
| bind [-m @var{keymap}] -x @var{keyseq:shell-command}
 | |
| bind [-m @var{keymap}] @var{keyseq:function-name}
 | |
| bind @var{readline-command}
 | |
| @end example
 | |
| 
 | |
| Display current Readline (@pxref{Command Line Editing})
 | |
| key and function bindings,
 | |
| bind a key sequence to a Readline function or macro,
 | |
| or set a Readline variable.
 | |
| Each non-option argument is a command as it would appear in a
 | |
| Readline initialization file (@pxref{Readline Init File}),
 | |
| but each binding or command must be passed as a separate argument;  e.g.,
 | |
| @samp{"\C-x\C-r":re-read-init-file}.
 | |
| 
 | |
| Options, if supplied, have the following meanings:
 | |
| 
 | |
| @table @code
 | |
| @item -m @var{keymap}
 | |
| Use @var{keymap} as the keymap to be affected by
 | |
| the subsequent bindings.  Acceptable @var{keymap}
 | |
| names are
 | |
| @code{emacs},
 | |
| @code{emacs-standard},
 | |
| @code{emacs-meta},
 | |
| @code{emacs-ctlx},
 | |
| @code{vi},
 | |
| @code{vi-move},
 | |
| @code{vi-command}, and
 | |
| @code{vi-insert}.
 | |
| @code{vi} is equivalent to @code{vi-command};
 | |
| @code{emacs} is equivalent to @code{emacs-standard}.
 | |
| 
 | |
| @item -l
 | |
| List the names of all Readline functions.
 | |
| 
 | |
| @item -p
 | |
| Display Readline function names and bindings in such a way that they
 | |
| can be used as input or in a Readline initialization file.
 | |
| 
 | |
| @item -P
 | |
| List current Readline function names and bindings.
 | |
| 
 | |
| @item -v
 | |
| Display Readline variable names and values in such a way that they
 | |
| can be used as input or in a Readline initialization file.
 | |
| 
 | |
| @item -V
 | |
| List current Readline variable names and values.
 | |
| 
 | |
| @item -s
 | |
| Display Readline key sequences bound to macros and the strings they output
 | |
| in such a way that they can be used as input or in a Readline
 | |
| initialization file.
 | |
| 
 | |
| @item -S
 | |
| Display Readline key sequences bound to macros and the strings they output.
 | |
| 
 | |
| @item -f @var{filename}
 | |
| Read key bindings from @var{filename}.
 | |
| 
 | |
| @item -q @var{function}
 | |
| Query about which keys invoke the named @var{function}.
 | |
| 
 | |
| @item -u @var{function}
 | |
| Unbind all keys bound to the named @var{function}.
 | |
| 
 | |
| @item -r @var{keyseq}
 | |
| Remove any current binding for @var{keyseq}.
 | |
| 
 | |
| @item -x @var{keyseq:shell-command}
 | |
| Cause @var{shell-command} to be executed whenever @var{keyseq} is
 | |
| entered.
 | |
| When @var{shell-command} is executed, the shell sets the
 | |
| @code{READLINE_LINE} variable to the contents of the Readline line
 | |
| buffer and the @code{READLINE_POINT} variable to the current location
 | |
| of the insertion point.
 | |
| If the executed command changes the value of @code{READLINE_LINE} or
 | |
| @code{READLINE_POINT}, those new values will be reflected in the
 | |
| editing state.
 | |
| @end table
 | |
| 
 | |
| @noindent
 | |
| The return status is zero unless an invalid option is supplied or an
 | |
| error occurs.
 | |
| 
 | |
| @item builtin
 | |
| @btindex builtin
 | |
| @example
 | |
| builtin [@var{shell-builtin} [@var{args}]]
 | |
| @end example
 | |
| Run a shell builtin, passing it @var{args}, and return its exit status.
 | |
| This is useful when defining a shell function with the same
 | |
| name as a shell builtin, retaining the functionality of the builtin within
 | |
| the function.
 | |
| The return status is non-zero if @var{shell-builtin} is not a shell
 | |
| builtin command.
 | |
| 
 | |
| @item caller
 | |
| @btindex caller
 | |
| @example
 | |
| caller [@var{expr}]
 | |
| @end example
 | |
| Returns the context of any active subroutine call (a shell function or
 | |
| a script executed with the @code{.} or @code{source} builtins).
 | |
| 
 | |
| Without @var{expr}, @code{caller} displays the line number and source
 | |
| filename of the current subroutine call.
 | |
| If a non-negative integer is supplied as @var{expr}, @code{caller} 
 | |
| displays the line number, subroutine name, and source file corresponding
 | |
| to that position in the current execution call stack.  This extra
 | |
| information may be used, for example, to print a stack trace.  The
 | |
| current frame is frame 0.
 | |
| 
 | |
| The return value is 0 unless the shell is not executing a subroutine
 | |
| call or @var{expr} does not correspond to a valid position in the
 | |
| call stack.
 | |
| 
 | |
| @item command
 | |
| @btindex command
 | |
| @example
 | |
| command [-pVv] @var{command} [@var{arguments} @dots{}]
 | |
| @end example
 | |
| Runs @var{command} with @var{arguments} ignoring any shell function
 | |
| named @var{command}.
 | |
| Only shell builtin commands or commands found by searching the
 | |
| @env{PATH} are executed.
 | |
| If there is a shell function named @code{ls}, running @samp{command ls}
 | |
| within the function will execute the external command @code{ls}
 | |
| instead of calling the function recursively.
 | |
| The @option{-p} option means to use a default value for @env{PATH}
 | |
| that is guaranteed to find all of the standard utilities.
 | |
| The return status in this case is 127 if @var{command} cannot be
 | |
| found or an error occurred, and the exit status of @var{command}
 | |
| otherwise.
 | |
| 
 | |
| If either the @option{-V} or @option{-v} option is supplied, a
 | |
| description of @var{command} is printed.  The @option{-v} option
 | |
| causes a single word indicating the command or file name used to
 | |
| invoke @var{command} to be displayed; the @option{-V} option produces
 | |
| a more verbose description.  In this case, the return status is
 | |
| zero if @var{command} is found, and non-zero if not.
 | |
| 
 | |
| @item declare
 | |
| @btindex declare
 | |
| @example
 | |
| declare [-aAfFilrtux] [-p] [@var{name}[=@var{value}] @dots{}]
 | |
| @end example
 | |
| 
 | |
| Declare variables and give them attributes.  If no @var{name}s
 | |
| are given, then display the values of variables instead. 
 | |
| 
 | |
| The @option{-p} option will display the attributes and values of each
 | |
| @var{name}.
 | |
| When @option{-p} is used with @var{name} arguments, additional options
 | |
| are ignored.
 | |
| 
 | |
| When @option{-p} is supplied without @var{name} arguments, @code{declare}
 | |
| will display the attributes and values of all variables having the
 | |
| attributes specified by the additional options.
 | |
| If no other options are supplied with @option{-p}, @code{declare} will
 | |
| display the attributes and values of all shell variables.  The @option{-f}
 | |
| option will restrict the display to shell functions.
 | |
| 
 | |
| The @option{-F} option inhibits the display of function definitions;
 | |
| only the function name and attributes are printed.
 | |
| If the @code{extdebug} shell option is enabled using @code{shopt}
 | |
| (@pxref{The Shopt Builtin}), the source file name and line number where
 | |
| the function is defined are displayed as well.
 | |
| @option{-F} implies @option{-f}.
 | |
| 
 | |
| The @option{-g} option forces variables to be created or modified at
 | |
| the global scope, even when @code{declare} is executed in a shell function.
 | |
| It is ignored in all other cases.
 | |
| 
 | |
| The following options can be used to restrict output to variables with
 | |
| the specified attributes or to give variables attributes:
 | |
| 
 | |
| @table @code
 | |
| @item -a
 | |
| Each @var{name} is an indexed array variable (@pxref{Arrays}).
 | |
| 
 | |
| @item -A
 | |
| Each @var{name} is an associative array variable (@pxref{Arrays}).
 | |
| 
 | |
| @item -f
 | |
| Use function names only.
 | |
| 
 | |
| @item -i
 | |
| The variable is to be treated as
 | |
| an integer; arithmetic evaluation (@pxref{Shell Arithmetic}) is
 | |
| performed when the variable is assigned a value.
 | |
| 
 | |
| @item -l
 | |
| When the variable is assigned a value, all upper-case characters are
 | |
| converted to lower-case.
 | |
| The upper-case attribute is disabled.
 | |
| 
 | |
| @item -r
 | |
| Make @var{name}s readonly.  These names cannot then be assigned values
 | |
| by subsequent assignment statements or unset.
 | |
| 
 | |
| @item -t
 | |
| Give each @var{name} the @code{trace} attribute.
 | |
| Traced functions inherit the @code{DEBUG} and @code{RETURN} traps from
 | |
| the calling shell.
 | |
| The trace attribute has no special meaning for variables.
 | |
| 
 | |
| @item -u
 | |
| When the variable is assigned a value, all lower-case characters are
 | |
| converted to upper-case.
 | |
| The lower-case attribute is disabled.
 | |
| 
 | |
| @item -x
 | |
| Mark each @var{name} for export to subsequent commands via
 | |
| the environment.
 | |
| @end table
 | |
| 
 | |
| Using @samp{+} instead of @samp{-} turns off the attribute instead,
 | |
| with the exceptions that @samp{+a}
 | |
| may not be used to destroy an array variable and @samp{+r} will not
 | |
| remove the readonly attribute.
 | |
| When used in a function, @code{declare} makes each @var{name} local,
 | |
| as with the @code{local} command, unless the @samp{-g} option is used.
 | |
| If a variable name is followed by =@var{value}, the value of the variable
 | |
| is set to @var{value}.
 | |
| 
 | |
| The return status is zero unless an invalid option is encountered,
 | |
| an attempt is made to define a function using @samp{-f foo=bar},
 | |
| an attempt is made to assign a value to a readonly variable,
 | |
| an attempt is made to assign a value to an array variable without
 | |
| using the compound assignment syntax (@pxref{Arrays}),
 | |
| one of the @var{names} is not a valid shell variable name,
 | |
| an attempt is made to turn off readonly status for a readonly variable,
 | |
| an attempt is made to turn off array status for an array variable,
 | |
| or an attempt is made to display a non-existent function with @option{-f}.
 | |
| 
 | |
| @item echo
 | |
| @btindex echo
 | |
| @example
 | |
| echo [-neE] [@var{arg} @dots{}]
 | |
| @end example
 | |
| Output the @var{arg}s, separated by spaces, terminated with a
 | |
| newline.
 | |
| The return status is always 0.
 | |
| If @option{-n} is specified, the trailing newline is suppressed.
 | |
| If the @option{-e} option is given, interpretation of the following
 | |
| backslash-escaped characters is enabled.
 | |
| The @option{-E} option disables the interpretation of these escape characters,
 | |
| even on systems where they are interpreted by default.
 | |
| The @code{xpg_echo} shell option may be used to
 | |
| dynamically determine whether or not @code{echo} expands these
 | |
| escape characters by default.
 | |
| @code{echo} does not interpret @option{--} to mean the end of options.
 | |
| 
 | |
| @code{echo} interprets the following escape sequences:
 | |
| @table @code
 | |
| @item \a
 | |
| alert (bell)
 | |
| @item \b
 | |
| backspace
 | |
| @item \c
 | |
| suppress further output
 | |
| @item \e
 | |
| @itemx \E
 | |
| escape
 | |
| @item \f
 | |
| form feed
 | |
| @item \n
 | |
| new line
 | |
| @item \r
 | |
| carriage return
 | |
| @item \t 
 | |
| horizontal tab
 | |
| @item \v
 | |
| vertical tab
 | |
| @item \\
 | |
| backslash
 | |
| @item \0@var{nnn}
 | |
| the eight-bit character whose value is the octal value @var{nnn}
 | |
| (zero to three octal digits)
 | |
| @item \x@var{HH}
 | |
| the eight-bit character whose value is the hexadecimal value @var{HH}
 | |
| (one or two hex digits)
 | |
| @item \u@var{HHHH}
 | |
| the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value
 | |
| @var{HHHH} (one to four hex digits)
 | |
| @item \U@var{HHHHHHHH}
 | |
| the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value
 | |
| @var{HHHHHHHH} (one to eight hex digits)
 | |
| @end table
 | |
| 
 | |
| @item enable
 | |
| @btindex enable
 | |
| @example
 | |
| enable [-a] [-dnps] [-f @var{filename}] [@var{name} @dots{}]
 | |
| @end example
 | |
| Enable and disable builtin shell commands.
 | |
| Disabling a builtin allows a disk command which has the same name
 | |
| as a shell builtin to be executed without specifying a full pathname,
 | |
| even though the shell normally searches for builtins before disk commands.
 | |
| If @option{-n} is used, the @var{name}s become disabled.  Otherwise
 | |
| @var{name}s are enabled.  For example, to use the @code{test} binary
 | |
| found via @env{$PATH} instead of the shell builtin version, type
 | |
| @samp{enable -n test}.
 | |
| 
 | |
| If the @option{-p} option is supplied, or no @var{name} arguments appear,
 | |
| a list of shell builtins is printed.  With no other arguments, the list
 | |
| consists of all enabled shell builtins.
 | |
| The @option{-a} option means to list
 | |
| each builtin with an indication of whether or not it is enabled. 
 | |
| 
 | |
| The @option{-f} option means to load the new builtin command @var{name}
 | |
| from shared object @var{filename}, on systems that support dynamic loading.
 | |
| The @option{-d} option will delete a builtin loaded with @option{-f}.
 | |
| 
 | |
| If there are no options, a list of the shell builtins is displayed.
 | |
| The @option{-s} option restricts @code{enable} to the @sc{posix} special
 | |
| builtins.  If @option{-s} is used with @option{-f}, the new builtin becomes
 | |
| a special builtin (@pxref{Special Builtins}).
 | |
| 
 | |
| The return status is zero unless a @var{name} is not a shell builtin
 | |
| or there is an error loading a new builtin from a shared object.
 | |
| 
 | |
| @item help
 | |
| @btindex help
 | |
| @example
 | |
| help [-dms] [@var{pattern}]
 | |
| @end example
 | |
| Display helpful information about builtin commands.
 | |
| If @var{pattern} is specified, @code{help} gives detailed help
 | |
| on all commands matching @var{pattern}, otherwise a list of
 | |
| the builtins is printed.
 | |
| 
 | |
| Options, if supplied, have the following meanings:
 | |
| 
 | |
| @table @code
 | |
| @item -d
 | |
| Display a short description of each @var{pattern}
 | |
| @item -m
 | |
| Display the description of each @var{pattern} in a manpage-like format
 | |
| @item -s
 | |
| Display only a short usage synopsis for each @var{pattern}
 | |
| @end table
 | |
| 
 | |
| The return status is zero unless no command matches @var{pattern}.
 | |
| 
 | |
| @item let
 | |
| @btindex let
 | |
| @example
 | |
| let @var{expression} [@var{expression}]
 | |
| @end example
 | |
| The @code{let} builtin allows arithmetic to be performed on shell
 | |
| variables.  Each @var{expression} is evaluated according to the
 | |
| rules given below in @ref{Shell Arithmetic}.  If the
 | |
| last @var{expression} evaluates to 0, @code{let} returns 1;
 | |
| otherwise 0 is returned.
 | |
| 
 | |
| @item local
 | |
| @btindex local
 | |
| @example
 | |
| local [@var{option}] @var{name}[=@var{value}] @dots{}
 | |
| @end example
 | |
| For each argument, a local variable named @var{name} is created,
 | |
| and assigned @var{value}.
 | |
| The @var{option} can be any of the options accepted by @code{declare}.
 | |
| @code{local} can only be used within a function; it makes the variable
 | |
| @var{name} have a visible scope restricted to that function and its
 | |
| children.  The return status is zero unless @code{local} is used outside
 | |
| a function, an invalid @var{name} is supplied, or @var{name} is a
 | |
| readonly variable.
 | |
| 
 | |
| @item logout
 | |
| @btindex logout
 | |
| @example
 | |
| logout [@var{n}]
 | |
| @end example
 | |
| Exit a login shell, returning a status of @var{n} to the shell's
 | |
| parent.
 | |
| 
 | |
| @item mapfile
 | |
| @btindex mapfile
 | |
| @example
 | |
| mapfile [-n @var{count}] [-O @var{origin}] [-s @var{count}] [-t] [-u @var{fd}] [
 | |
| -C @var{callback}] [-c @var{quantum}] [@var{array}]
 | |
| @end example
 | |
| Read lines from the standard input into the indexed array variable @var{array},
 | |
| or from file descriptor @var{fd}
 | |
| if the @option{-u} option is supplied.
 | |
| The variable @code{MAPFILE} is the default @var{array}.
 | |
| Options, if supplied, have the following meanings:
 | |
| @table @code
 | |
| 
 | |
| @item -n
 | |
| Copy at most @var{count} lines.  If @var{count} is 0, all lines are copied.
 | |
| @item -O
 | |
| Begin assigning to @var{array} at index @var{origin}.
 | |
| The default index is 0.
 | |
| @item -s
 | |
| Discard the first @var{count} lines read.
 | |
| @item -t
 | |
| Remove a trailing newline from each line read.
 | |
| @item -u
 | |
| Read lines from file descriptor @var{fd} instead of the standard input.
 | |
| @item -C
 | |
| Evaluate @var{callback} each time @var{quantum}P lines are read.
 | |
| The @option{-c} option specifies @var{quantum}.
 | |
| @item -c
 | |
| Specify the number of lines read between each call to @var{callback}.
 | |
| @end table
 | |
| 
 | |
| If @option{-C} is specified without @option{-c}, 
 | |
| the default quantum is 5000.
 | |
| When @var{callback}  is evaluated, it is supplied the index of the next
 | |
| array element to be assigned and the line to be assigned to that element
 | |
| as additional arguments.
 | |
| @var{callback} is evaluated after the line is read but before the 
 | |
| array element is assigned.
 | |
| 
 | |
| If not supplied with an explicit origin, @code{mapfile} will clear @var{array}
 | |
| before assigning to it.
 | |
| 
 | |
| @code{mapfile} returns successfully unless an invalid option or option
 | |
| argument is supplied, @var{array} is invalid or unassignable, or @var{array}
 | |
| is not an indexed array.
 | |
| 
 | |
| @item printf
 | |
| @btindex printf
 | |
| @example
 | |
| printf [-v @var{var}] @var{format} [@var{arguments}]
 | |
| @end example
 | |
| Write the formatted @var{arguments} to the standard output under the
 | |
| control of the @var{format}.
 | |
| The @option{-v} option causes the output to be assigned to the variable
 | |
| @var{var} rather than being printed to the standard output.
 | |
| 
 | |
| The @var{format} is a character string which contains three types of objects:
 | |
| plain characters, which are simply copied to standard output, character
 | |
| escape sequences, which are converted and copied to the standard output, and
 | |
| format specifications, each of which causes printing of the next successive
 | |
| @var{argument}.
 | |
| In addition to the standard @code{printf(1)} formats, @code{printf}
 | |
| interprets the following extensions:
 | |
| 
 | |
| @table @code
 | |
| @item %b
 | |
| causes @code{printf} to expand backslash escape sequences in the
 | |
| corresponding @var{argument},
 | |
| (except that @samp{\c} terminates output, backslashes in
 | |
| @samp{\'}, @samp{\"}, and @samp{\?} are not removed, and octal escapes
 | |
| beginning with @samp{\0} may contain up to four digits).
 | |
| @item %q
 | |
| causes @code{printf} to output the
 | |
| corresponding @var{argument} in a format that can be reused as shell input.
 | |
| @item %(@var{datefmt})T
 | |
| causes @code{printf} to output the date-time string resulting from using
 | |
| @var{datefmt} as a format string for @code{strftime}(3).  The corresponding
 | |
| @var{argument} is an integer representing the number of seconds since the
 | |
| epoch.  Two special argument values may be used: -1 represents the current
 | |
| time, and -2 represents the time the shell was invoked.
 | |
| @end table
 | |
| 
 | |
| @noindent
 | |
| Arguments to non-string format specifiers are treated as C language constants,
 | |
| except that a leading plus or minus sign is allowed, and if the leading
 | |
| character is a single or double quote, the value is the ASCII value of
 | |
| the following character.
 | |
| 
 | |
| The @var{format} is reused as necessary to consume all of the @var{arguments}.
 | |
| If the @var{format} requires more @var{arguments} than are supplied, the
 | |
| extra format specifications behave as if a zero value or null string, as
 | |
| appropriate, had been supplied.  The return value is zero on success,
 | |
| non-zero on failure.
 | |
| 
 | |
| @item read
 | |
| @btindex read
 | |
| @example
 | |
| read [-ers] [-a @var{aname}] [-d @var{delim}] [-i @var{text}] [-n @var{nchars}] [-N @var{nchars}] [-p @var{prompt}] [-t @var{timeout}] [-u @var{fd}] [@var{name} @dots{}]
 | |
| @end example
 | |
| One line is read from the standard input, or from the file descriptor
 | |
| @var{fd} supplied as an argument to the @option{-u} option, and the first word
 | |
| is assigned to the first @var{name}, the second word to the second @var{name},
 | |
| and so on, with leftover words and their intervening separators assigned
 | |
| to the last @var{name}.
 | |
| If there are fewer words read from the input stream than names,
 | |
| the remaining names are assigned empty values.
 | |
| The characters in the value of the @env{IFS} variable
 | |
| are used to split the line into words.
 | |
| The backslash character @samp{\} may be used to remove any special
 | |
| meaning for the next character read and for line continuation.
 | |
| If no names are supplied, the line read is assigned to the
 | |
| variable @env{REPLY}.
 | |
| The return code is zero, unless end-of-file is encountered, @code{read}
 | |
| times out (in which case the return code is greater than 128), or an
 | |
| invalid file descriptor is supplied as the argument to @option{-u}.
 | |
| 
 | |
| Options, if supplied, have the following meanings:
 | |
| 
 | |
| @table @code
 | |
| @item -a @var{aname}
 | |
| The words are assigned to sequential indices of the array variable
 | |
| @var{aname}, starting at 0.
 | |
| All elements are removed from @var{aname} before the assignment.
 | |
| Other @var{name} arguments are ignored.
 | |
| 
 | |
| @item -d @var{delim}
 | |
| The first character of @var{delim} is used to terminate the input line,
 | |
| rather than newline.
 | |
| 
 | |
| @item -e
 | |
| Readline (@pxref{Command Line Editing}) is used to obtain the line.
 | |
| Readline uses the current (or default, if line editing was not previously
 | |
| active) editing settings.
 | |
| 
 | |
| @item -i @var{text}
 | |
| If Readline is being used to read the line, @var{text} is placed into
 | |
| the editing buffer before editing begins.
 | |
| 
 | |
| @item -n @var{nchars}
 | |
| @code{read} returns after reading @var{nchars} characters rather than
 | |
| waiting for a complete line of input, but honor a delimiter if fewer
 | |
| than @var{nchars} characters are read before the delimiter.
 | |
| 
 | |
| @item -N @var{nchars}
 | |
| @code{read} returns after reading exactly @var{nchars} characters rather
 | |
| than waiting for a complete line of input, unless EOF is encountered or
 | |
| @code{read} times out.
 | |
| Delimiter characters encountered in the input are
 | |
| not treated specially and do not cause @code{read} to return until
 | |
| @var{nchars} characters are read.
 | |
| 
 | |
| @item -p @var{prompt}
 | |
| Display @var{prompt}, without a trailing newline, before attempting
 | |
| to read any input.
 | |
| The prompt is displayed only if input is coming from a terminal.
 | |
| 
 | |
| @item -r
 | |
| If this option is given, backslash does not act as an escape character.
 | |
| The backslash is considered to be part of the line.
 | |
| In particular, a backslash-newline pair may not be used as a line
 | |
| continuation.
 | |
| 
 | |
| @item -s
 | |
| Silent mode.  If input is coming from a terminal, characters are
 | |
| not echoed.
 | |
| 
 | |
| @item -t @var{timeout}
 | |
| Cause @code{read} to time out and return failure if a complete line of
 | |
| input is not read within @var{timeout} seconds.
 | |
| @var{timeout}  may be a decimal number with a fractional portion following
 | |
| the decimal point.
 | |
| This option is only effective if @code{read} is reading input from a
 | |
| terminal, pipe, or other special file; it has no effect when reading
 | |
| from regular files.
 | |
| If @var{timeout} is 0, @code{read} returns success if input is available on
 | |
| the specified file descriptor, failure otherwise.
 | |
| The exit status is greater than 128 if the timeout is exceeded.
 | |
| 
 | |
| @item -u @var{fd}
 | |
| Read input from file descriptor @var{fd}.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @item readarray
 | |
| @btindex readarray
 | |
| @example
 | |
| readarray [-n @var{count}] [-O @var{origin}] [-s @var{count}] [-t] [-u @var{fd}] [
 | |
| -C @var{callback}] [-c @var{quantum}] [@var{array}]
 | |
| @end example
 | |
| Read lines from the standard input into the indexed array variable @var{array},
 | |
| or from file descriptor @var{fd}
 | |
| if the @option{-u} option is supplied.
 | |
| 
 | |
| A synonym for @code{mapfile}.
 | |
| 
 | |
| @item source
 | |
| @btindex source
 | |
| @example
 | |
| source @var{filename}
 | |
| @end example
 | |
| A synonym for @code{.} (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| @item type
 | |
| @btindex type
 | |
| @example
 | |
| type [-afptP] [@var{name} @dots{}]
 | |
| @end example
 | |
| For each @var{name}, indicate how it would be interpreted if used as a
 | |
| command name.
 | |
| 
 | |
| If the @option{-t} option is used, @code{type} prints a single word
 | |
| which is one of @samp{alias}, @samp{function}, @samp{builtin},
 | |
| @samp{file} or @samp{keyword},
 | |
| if @var{name} is an alias, shell function, shell builtin,
 | |
| disk file, or shell reserved word, respectively.
 | |
| If the @var{name} is not found, then nothing is printed, and
 | |
| @code{type} returns a failure status.
 | |
| 
 | |
| If the @option{-p} option is used, @code{type} either returns the name
 | |
| of the disk file that would be executed, or nothing if @option{-t}
 | |
| would not return @samp{file}.
 | |
| 
 | |
| The @option{-P} option forces a path search for each @var{name}, even if
 | |
| @option{-t} would not return @samp{file}.
 | |
| 
 | |
| If a command is hashed, @option{-p} and @option{-P} print the hashed value,
 | |
| not necessarily the file that appears first in @code{$PATH}.
 | |
| 
 | |
| If the @option{-a} option is used, @code{type} returns all of the places
 | |
| that contain an executable named @var{file}.
 | |
| This includes aliases and functions, if and only if the @option{-p} option
 | |
| is not also used.
 | |
| 
 | |
| If the @option{-f} option is used, @code{type} does not attempt to find
 | |
| shell functions, as with the @code{command} builtin.
 | |
| 
 | |
| The return status is zero if all of the @var{names} are found, non-zero
 | |
| if any are not found.
 | |
| 
 | |
| @item typeset
 | |
| @btindex typeset
 | |
| @example
 | |
| typeset [-afFrxi] [-p] [@var{name}[=@var{value}] @dots{}]
 | |
| @end example
 | |
| The @code{typeset} command is supplied for compatibility with the Korn
 | |
| shell; however, it has been deprecated in favor of the @code{declare}
 | |
| builtin command.
 | |
| 
 | |
| @item ulimit
 | |
| @btindex ulimit
 | |
| @example
 | |
| ulimit [-abcdefilmnpqrstuvxHST] [@var{limit}]
 | |
| @end example
 | |
| @code{ulimit} provides control over the resources available to processes
 | |
| started by the shell, on systems that allow such control.  If an
 | |
| option is given, it is interpreted as follows:
 | |
| @table @code
 | |
| @item -S
 | |
| Change and report the soft limit associated with a resource.
 | |
| 
 | |
| @item -H
 | |
| Change and report the hard limit associated with a resource.
 | |
| 
 | |
| @item -a
 | |
| All current limits are reported.
 | |
| 
 | |
| @item -b
 | |
| The maximum socket buffer size.
 | |
| 
 | |
| @item -c
 | |
| The maximum size of core files created.
 | |
| 
 | |
| @item -d
 | |
| The maximum size of a process's data segment.
 | |
| 
 | |
| @item -e
 | |
| The maximum scheduling priority ("nice").
 | |
| 
 | |
| @item -f
 | |
| The maximum size of files written by the shell and its children.
 | |
| 
 | |
| @item -i
 | |
| The maximum number of pending signals.
 | |
| 
 | |
| @item -l
 | |
| The maximum size that may be locked into memory.
 | |
| 
 | |
| @item -m
 | |
| The maximum resident set size (many systems do not honor this limit).
 | |
| 
 | |
| @item -n
 | |
| The maximum number of open file descriptors (most systems do not
 | |
| allow this value to be set).
 | |
| 
 | |
| @item -p
 | |
| The pipe buffer size.
 | |
| 
 | |
| @item -q
 | |
| The maximum number of bytes in POSIX message queues.
 | |
| 
 | |
| @item -r
 | |
| The maximum real-time scheduling priority.
 | |
| 
 | |
| @item -s
 | |
| The maximum stack size.
 | |
| 
 | |
| @item -t
 | |
| The maximum amount of cpu time in seconds.
 | |
| 
 | |
| @item -u
 | |
| The maximum number of processes available to a single user.
 | |
| 
 | |
| @item -v
 | |
| The maximum amount of virtual memory available to the shell, and, on
 | |
| some systems, to its children.
 | |
| 
 | |
| @item -x
 | |
| The maximum number of file locks.
 | |
| 
 | |
| @item -T
 | |
| The maximum number of threads.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| If @var{limit} is given, it is the new value of the specified resource;
 | |
| the special @var{limit} values @code{hard}, @code{soft}, and
 | |
| @code{unlimited} stand for the current hard limit, the current soft limit,
 | |
| and no limit, respectively.
 | |
| A hard limit cannot be increased by a non-root user once it is set;
 | |
| a soft limit may be increased up to the value of the hard limit.
 | |
| Otherwise, the current value of the soft limit for the specified resource
 | |
| is printed, unless the @option{-H} option is supplied.
 | |
| When setting new limits, if neither @option{-H} nor @option{-S} is supplied,
 | |
| both the hard and soft limits are set.
 | |
| If no option is given, then @option{-f} is assumed.  Values are in 1024-byte
 | |
| increments, except for @option{-t}, which is in seconds, @option{-p},
 | |
| which is in units of 512-byte blocks, and @option{-n} and @option{-u}, which
 | |
| are unscaled values.
 | |
| 
 | |
| The return status is zero unless an invalid option or argument is supplied,
 | |
| or an error occurs while setting a new limit.
 | |
| 
 | |
| @item unalias
 | |
| @btindex unalias
 | |
| @example
 | |
| unalias [-a] [@var{name} @dots{} ]
 | |
| @end example
 | |
| 
 | |
| Remove each @var{name} from the list of aliases.  If @option{-a} is
 | |
| supplied, all aliases are removed.
 | |
| Aliases are described in @ref{Aliases}.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Modifying Shell Behavior
 | |
| @section Modifying Shell Behavior
 | |
|  
 | |
| @menu
 | |
| * The Set Builtin::		Change the values of shell attributes and
 | |
| 				positional parameters.
 | |
| * The Shopt Builtin::		Modify shell optional behavior.
 | |
| @end menu
 | |
| 
 | |
| @node The Set Builtin
 | |
| @subsection The Set Builtin
 | |
| 
 | |
| This builtin is so complicated that it deserves its own section.  @code{set}
 | |
| allows you to change the values of shell options and set the positional
 | |
| parameters, or to display the names and values of shell variables.
 | |
| 
 | |
| @table @code
 | |
| @item set
 | |
| @btindex set
 | |
| @example
 | |
| set [--abefhkmnptuvxBCEHPT] [-o @var{option-name}] [@var{argument} @dots{}]
 | |
| set [+abefhkmnptuvxBCEHPT] [+o @var{option-name}] [@var{argument} @dots{}]
 | |
| @end example
 | |
| 
 | |
| If no options or arguments are supplied, @code{set} displays the names
 | |
| and values of all shell variables and functions, sorted according to the
 | |
| current locale, in a format that may be reused as input
 | |
| for setting or resetting the currently-set variables.
 | |
| Read-only variables cannot be reset.
 | |
| In @sc{posix} mode, only shell variables are listed.
 | |
| 
 | |
| When options are supplied, they set or unset shell attributes.
 | |
| Options, if specified, have the following meanings:
 | |
| 
 | |
| @table @code
 | |
| @item -a
 | |
| Mark variables and function which are modified or created for export
 | |
| to the environment of subsequent commands.
 | |
| 
 | |
| @item -b
 | |
| Cause the status of terminated background jobs to be reported
 | |
| immediately, rather than before printing the next primary prompt.
 | |
| 
 | |
| @item -e
 | |
| Exit immediately if a pipeline (@pxref{Pipelines}), which may consist
 | |
| of a single simple command (@pxref{Simple Commands}),
 | |
| a subshell command enclosed in parentheses (@pxref{Command Grouping}),
 | |
| or one of the commands executed as part of a command list enclosed
 | |
| by braces (@pxref{Command Grouping})
 | |
| returns a non-zero status.
 | |
| The shell does not exit if the command that fails is part of the
 | |
| command list immediately following a @code{while} or @code{until} keyword,
 | |
| part of the test in an @code{if} statement,
 | |
| part of any command executed in a @code{&&} or @code{||} list except
 | |
| the command following the final @code{&&} or @code{||},
 | |
| any command in a pipeline but the last,
 | |
| or if the command's return status is being inverted with @code{!}.
 | |
| A trap on @code{ERR}, if set, is executed before the shell exits.
 | |
| 
 | |
| This option applies to the shell environment and each subshell environment
 | |
| separately (@pxref{Command Execution Environment}), and may cause
 | |
| subshells to exit before executing all the commands in the subshell.
 | |
| 
 | |
| @item -f
 | |
| Disable filename expansion (globbing).
 | |
| 
 | |
| @item -h
 | |
| Locate and remember (hash) commands as they are looked up for execution.
 | |
| This option is enabled by default.
 | |
| 
 | |
| @item -k
 | |
| All arguments in the form of assignment statements are placed
 | |
| in the environment for a command, not just those that precede
 | |
| the command name.
 | |
| 
 | |
| @item -m
 | |
| Job control is enabled (@pxref{Job Control}).
 | |
| 
 | |
| @item -n
 | |
| Read commands but do not execute them; this may be used to check a
 | |
| script for syntax errors.
 | |
| This option is ignored by interactive shells.
 | |
| 
 | |
| @item -o @var{option-name}
 | |
| 
 | |
| Set the option corresponding to @var{option-name}:
 | |
| 
 | |
| @table @code
 | |
| @item allexport
 | |
| Same as @code{-a}.
 | |
| 
 | |
| @item braceexpand
 | |
| Same as @code{-B}.
 | |
| 
 | |
| @item emacs
 | |
| Use an @code{emacs}-style line editing interface (@pxref{Command Line Editing}).
 | |
| This also affects the editing interface used for @code{read -e}.
 | |
| 
 | |
| @item errexit
 | |
| Same as @code{-e}.
 | |
| 
 | |
| @item errtrace
 | |
| Same as @code{-E}.
 | |
| 
 | |
| @item functrace
 | |
| Same as @code{-T}.
 | |
| 
 | |
| @item hashall
 | |
| Same as @code{-h}.
 | |
| 
 | |
| @item histexpand
 | |
| Same as @code{-H}.
 | |
| 
 | |
| @item history
 | |
| Enable command history, as described in @ref{Bash History Facilities}.
 | |
| This option is on by default in interactive shells.
 | |
| 
 | |
| @item ignoreeof
 | |
| An interactive shell will not exit upon reading EOF.
 | |
| 
 | |
| @item keyword
 | |
| Same as @code{-k}.
 | |
| 
 | |
| @item monitor
 | |
| Same as @code{-m}.
 | |
| 
 | |
| @item noclobber
 | |
| Same as @code{-C}.
 | |
| 
 | |
| @item noexec
 | |
| Same as @code{-n}.
 | |
| 
 | |
| @item noglob
 | |
| Same as @code{-f}.
 | |
| 
 | |
| @item nolog
 | |
| Currently ignored.
 | |
| 
 | |
| @item notify
 | |
| Same as @code{-b}.
 | |
| 
 | |
| @item nounset
 | |
| Same as @code{-u}.
 | |
| 
 | |
| @item onecmd
 | |
| Same as @code{-t}.
 | |
| 
 | |
| @item physical
 | |
| Same as @code{-P}.
 | |
| 
 | |
| @item pipefail
 | |
| If set, the return value of a pipeline is the value of the last
 | |
| (rightmost) command to exit with a non-zero status, or zero if all
 | |
| commands in the pipeline exit successfully.
 | |
| This option is disabled by default.
 | |
| 
 | |
| @item posix
 | |
| Change the behavior of Bash where the default operation differs
 | |
| from the @sc{posix} standard to match the standard
 | |
| (@pxref{Bash POSIX Mode}).
 | |
| This is intended to make Bash behave as a strict superset of that
 | |
| standard.
 | |
| 
 | |
| @item privileged
 | |
| Same as @code{-p}.
 | |
| 
 | |
| @item verbose
 | |
| Same as @code{-v}.
 | |
| 
 | |
| @item vi
 | |
| Use a @code{vi}-style line editing interface.
 | |
| This also affects the editing interface used for @code{read -e}.
 | |
| 
 | |
| @item xtrace
 | |
| Same as @code{-x}.
 | |
| @end table
 | |
| 
 | |
| @item -p
 | |
| Turn on privileged mode.
 | |
| In this mode, the @env{$BASH_ENV} and @env{$ENV} files are not
 | |
| processed, shell functions are not inherited from the environment,
 | |
| and the @env{SHELLOPTS}, @env{BASHOPTS}, @env{CDPATH} and @env{GLOBIGNORE}
 | |
| variables, if they appear in the environment, are ignored.
 | |
| If the shell is started with the effective user (group) id not equal to the
 | |
| real user (group) id, and the @code{-p} option is not supplied, these actions
 | |
| are taken and the effective user id is set to the real user id.
 | |
| If the @code{-p} option is supplied at startup, the effective user id is
 | |
| not reset.
 | |
| Turning this option off causes the effective user
 | |
| and group ids to be set to the real user and group ids.
 | |
| 
 | |
| @item -t
 | |
| Exit after reading and executing one command.
 | |
| 
 | |
| @item -u
 | |
| Treat unset variables and parameters other than the special parameters
 | |
| @samp{@@} or @samp{*} as an error when performing parameter expansion.
 | |
| An error message will be written to the standard error, and a non-interactive
 | |
| shell will exit.
 | |
| 
 | |
| @item -v
 | |
| Print shell input lines as they are read.
 | |
| 
 | |
| @item -x
 | |
| Print a trace of simple commands, @code{for} commands, @code{case}
 | |
| commands, @code{select} commands, and arithmetic @code{for} commands
 | |
| and their arguments or associated word lists after they are
 | |
| expanded and before they are executed.  The value of the @env{PS4}
 | |
| variable is expanded and the resultant value is printed before
 | |
| the command and its expanded arguments.
 | |
| 
 | |
| @item -B
 | |
| The shell will perform brace expansion (@pxref{Brace Expansion}).
 | |
| This option is on by default.
 | |
| 
 | |
| @item -C
 | |
| Prevent output redirection using @samp{>}, @samp{>&}, and @samp{<>}
 | |
| from overwriting existing files.
 | |
| 
 | |
| @item -E
 | |
| If set, any trap on @code{ERR} is inherited by shell functions, command
 | |
| substitutions, and commands executed in a subshell environment.
 | |
| The @code{ERR} trap is normally not inherited in such cases.
 | |
| 
 | |
| @item -H
 | |
| Enable @samp{!} style history substitution (@pxref{History Interaction}).
 | |
| This option is on by default for interactive shells.
 | |
| 
 | |
| @item -P
 | |
| If set, do not follow symbolic links when performing commands such as
 | |
| @code{cd} which change the current directory.  The physical directory
 | |
| is used instead.  By default, Bash follows
 | |
| the logical chain of directories when performing commands
 | |
| which change the current directory.
 | |
| 
 | |
| For example, if @file{/usr/sys} is a symbolic link to @file{/usr/local/sys}
 | |
| then:
 | |
| @example
 | |
| $ cd /usr/sys; echo $PWD
 | |
| /usr/sys
 | |
| $ cd ..; pwd
 | |
| /usr
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| If @code{set -P} is on, then:
 | |
| @example
 | |
| $ cd /usr/sys; echo $PWD
 | |
| /usr/local/sys
 | |
| $ cd ..; pwd
 | |
| /usr/local
 | |
| @end example
 | |
| 
 | |
| @item -T
 | |
| If set, any trap on @code{DEBUG} and @code{RETURN} are inherited by
 | |
| shell functions, command substitutions, and commands executed
 | |
| in a subshell environment.
 | |
| The @code{DEBUG} and @code{RETURN} traps are normally not inherited
 | |
| in such cases.
 | |
| 
 | |
| @item --
 | |
| If no arguments follow this option, then the positional parameters are
 | |
| unset.  Otherwise, the positional parameters are set to the
 | |
| @var{arguments}, even if some of them begin with a @samp{-}.
 | |
| 
 | |
| @item -
 | |
| Signal the end of options, cause all remaining @var{arguments}
 | |
| to be assigned to the positional parameters.  The @option{-x}
 | |
| and @option{-v}  options are turned off.
 | |
| If there are no arguments, the positional parameters remain unchanged.
 | |
| @end table
 | |
| 
 | |
| Using @samp{+} rather than @samp{-} causes these options to be
 | |
| turned off.  The options can also be used upon invocation of the
 | |
| shell.  The current set of options may be found in @code{$-}.
 | |
| 
 | |
| The remaining N @var{arguments} are positional parameters and are
 | |
| assigned, in order, to @code{$1}, @code{$2}, @dots{}  @code{$N}.
 | |
| The special parameter @code{#} is set to N.
 | |
| 
 | |
| The return status is always zero unless an invalid option is supplied.
 | |
| @end table
 | |
| 
 | |
| @node The Shopt Builtin
 | |
| @subsection The Shopt Builtin
 | |
| 
 | |
| This builtin allows you to change additional shell optional behavior.
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item shopt
 | |
| @btindex shopt
 | |
| @example
 | |
| shopt [-pqsu] [-o] [@var{optname} @dots{}]
 | |
| @end example
 | |
| Toggle the values of variables controlling optional shell behavior.
 | |
| With no options, or with the @option{-p} option, a list of all settable
 | |
| options is displayed, with an indication of whether or not each is set.
 | |
| The @option{-p} option causes output to be displayed in a form that
 | |
| may be reused as input.
 | |
| Other options have the following meanings:
 | |
| 
 | |
| @table @code
 | |
| @item -s
 | |
| Enable (set) each @var{optname}.
 | |
| 
 | |
| @item -u
 | |
| Disable (unset) each @var{optname}.
 | |
| 
 | |
| @item -q
 | |
| Suppresses normal output; the return status
 | |
| indicates whether the @var{optname} is set or unset.
 | |
| If multiple @var{optname} arguments are given with @option{-q},
 | |
| the return status is zero if all @var{optnames} are enabled;
 | |
| non-zero otherwise.
 | |
| 
 | |
| @item -o
 | |
| Restricts the values of
 | |
| @var{optname} to be those defined for the @option{-o} option to the
 | |
| @code{set} builtin (@pxref{The Set Builtin}).
 | |
| @end table
 | |
| 
 | |
| If either @option{-s} or @option{-u}
 | |
| is used with no @var{optname} arguments, the display is limited to
 | |
| those options which are set or unset, respectively.
 | |
| 
 | |
| Unless otherwise noted, the @code{shopt} options are disabled (off)
 | |
| by default.
 | |
| 
 | |
| The return status when listing options is zero if all @var{optnames}
 | |
| are enabled, non-zero otherwise.  When setting or unsetting options,
 | |
| the return status is zero unless an @var{optname} is not a valid shell
 | |
| option.
 | |
| 
 | |
| The list of @code{shopt} options is:
 | |
| @table @code
 | |
| 
 | |
| @item autocd
 | |
| If set, a command name that is the name of a directory is executed as if
 | |
| it were the argument to the @code{cd} command.
 | |
| This option is only used by interactive shells.
 | |
| 
 | |
| @item cdable_vars
 | |
| If this is set, an argument to the @code{cd} builtin command that
 | |
| is not a directory is assumed to be the name of a variable whose
 | |
| value is the directory to change to.
 | |
| 
 | |
| @item cdspell
 | |
| If set, minor errors in the spelling of a directory component in a
 | |
| @code{cd} command will be corrected.
 | |
| The errors checked for are transposed characters,
 | |
| a missing character, and a character too many.
 | |
| If a correction is found, the corrected path is printed,
 | |
| and the command proceeds.
 | |
| This option is only used by interactive shells.
 | |
| 
 | |
| @item checkhash
 | |
| If this is set, Bash checks that a command found in the hash
 | |
| table exists before trying to execute it.  If a hashed command no
 | |
| longer exists, a normal path search is performed.
 | |
| 
 | |
| @item checkjobs
 | |
| If set, Bash lists the status of any stopped and running jobs before
 | |
| exiting an interactive shell.  If any jobs are running, this causes
 | |
| the exit to be deferred until a second exit is attempted without an
 | |
| intervening command (@pxref{Job Control}).
 | |
| The shell always postpones exiting if any jobs are stopped.
 | |
| 
 | |
| @item checkwinsize
 | |
| If set, Bash checks the window size after each command
 | |
| and, if necessary, updates the values of    
 | |
| @env{LINES} and @env{COLUMNS}.
 | |
| 
 | |
| @item cmdhist
 | |
| If set, Bash
 | |
| attempts to save all lines of a multiple-line
 | |
| command in the same history entry.  This allows
 | |
| easy re-editing of multi-line commands.
 | |
| 
 | |
| @item compat31
 | |
| If set, Bash
 | |
| changes its behavior to that of version 3.1 with respect to quoted
 | |
| arguments to the conditional command's @samp{=~} operator.
 | |
| 
 | |
| @item compat32
 | |
| If set, Bash
 | |
| changes its behavior to that of version 3.2 with respect to locale-specific
 | |
| string comparison when using the @samp{[[}
 | |
| conditional command's @samp{<} and @samp{>} operators.
 | |
| Bash versions prior to bash-4.0 use ASCII collation and strcmp(3);
 | |
| bash-4.1 and later use the current locale's collation sequence and strcoll(3).
 | |
| 
 | |
| @item compat40
 | |
| If set, Bash
 | |
| changes its behavior to that of version 4.0 with respect to locale-specific
 | |
| string comparison when using the @samp{[[}
 | |
| conditional command's @samp{<} and @samp{>} operators (see previous item)
 | |
| and the effect of interrupting a command list.
 | |
| 
 | |
| @item compat41
 | |
| If set, Bash, when in posix mode, treats a single quote in a double-quoted
 | |
| parameter expansion as a special character.  The single quotes must match
 | |
| (an even number) and the characters between the single quotes are considered
 | |
| quoted.  This is the behavior of @sc{posix} mode through version 4.1.
 | |
| The default Bash behavior remains as in previous versions.
 | |
| 
 | |
| @item dirspell
 | |
| If set, Bash
 | |
| attempts spelling correction on directory names during word completion 
 | |
| if the directory name initially supplied does not exist.
 | |
| 
 | |
| @item dotglob
 | |
| If set, Bash includes filenames beginning with a `.' in
 | |
| the results of filename expansion.
 | |
| 
 | |
| @item execfail
 | |
| If this is set, a non-interactive shell will not exit if
 | |
| it cannot execute the file specified as an argument to the @code{exec}
 | |
| builtin command.  An interactive shell does not exit if @code{exec}
 | |
| fails.
 | |
| 
 | |
| @item expand_aliases
 | |
| If set, aliases are expanded as described below under Aliases,
 | |
| @ref{Aliases}.
 | |
| This option is enabled by default for interactive shells.
 | |
| 
 | |
| @item extdebug
 | |
| If set, behavior intended for use by debuggers is enabled:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| The @option{-F} option to the @code{declare} builtin (@pxref{Bash Builtins})
 | |
| displays the source file name and line number corresponding to each function
 | |
| name supplied as an argument.
 | |
| 
 | |
| @item
 | |
| If the command run by the @code{DEBUG} trap returns a non-zero value, the
 | |
| next command is skipped and not executed.
 | |
| 
 | |
| @item
 | |
| If the command run by the @code{DEBUG} trap returns a value of 2, and the
 | |
| shell is executing in a subroutine (a shell function or a shell script
 | |
| executed by the @code{.} or @code{source} builtins), a call to
 | |
| @code{return} is simulated.
 | |
| 
 | |
| @item
 | |
| @code{BASH_ARGC} and @code{BASH_ARGV} are updated as described in their
 | |
| descriptions (@pxref{Bash Variables}).
 | |
| 
 | |
| @item
 | |
| Function tracing is enabled:  command substitution, shell functions, and
 | |
| subshells invoked with @code{( @var{command} )} inherit the
 | |
| @code{DEBUG} and @code{RETURN} traps.
 | |
| 
 | |
| @item
 | |
| Error tracing is enabled:  command substitution, shell functions, and
 | |
| subshells invoked with @code{( @var{command} )} inherit the
 | |
| @code{ERR} trap.
 | |
| @end enumerate
 | |
| 
 | |
| @item extglob
 | |
| If set, the extended pattern matching features described above
 | |
| (@pxref{Pattern Matching}) are enabled.
 | |
| 
 | |
| @item extquote
 | |
| If set, @code{$'@var{string}'} and @code{$"@var{string}"} quoting is  
 | |
| performed within @code{$@{@var{parameter}@}} expansions                     
 | |
| enclosed in double quotes.  This option is enabled by default. 
 | |
| 
 | |
| @item failglob
 | |
| If set, patterns which fail to match filenames during filename expansion
 | |
| result in an expansion error.
 | |
| 
 | |
| @item force_fignore
 | |
| If set, the suffixes specified by the @env{FIGNORE} shell variable
 | |
| cause words to be ignored when performing word completion even if
 | |
| the ignored words are the only possible completions.
 | |
| @xref{Bash Variables}, for a description of @env{FIGNORE}.
 | |
| This option is enabled by default.
 | |
| 
 | |
| @item globstar
 | |
| If set, the pattern @samp{**} used in a filename expansion context will
 | |
| match all files and zero or more directories and subdirectories.
 | |
| If the pattern is followed by a @samp{/}, only directories and
 | |
| subdirectories match.
 | |
| 
 | |
| @item gnu_errfmt
 | |
| If set, shell error messages are written in the standard @sc{gnu} error
 | |
| message format.
 | |
| 
 | |
| @item histappend
 | |
| If set, the history list is appended to the file named by the value
 | |
| of the @env{HISTFILE}
 | |
| variable when the shell exits, rather than overwriting the file.
 | |
| 
 | |
| @item histreedit
 | |
| If set, and Readline
 | |
| is being used, a user is given the opportunity to re-edit a
 | |
| failed history substitution.
 | |
| 
 | |
| @item histverify
 | |
| If set, and Readline
 | |
| is being used, the results of history substitution are not immediately
 | |
| passed to the shell parser.  Instead, the resulting line is loaded into
 | |
| the Readline editing buffer, allowing further modification.
 | |
| 
 | |
| @item hostcomplete
 | |
| If set, and Readline is being used, Bash will attempt to perform
 | |
| hostname completion when a word containing a @samp{@@} is being
 | |
| completed (@pxref{Commands For Completion}).  This option is enabled
 | |
| by default.
 | |
| 
 | |
| @item huponexit
 | |
| If set, Bash will send @code{SIGHUP} to all jobs when an interactive
 | |
| login shell exits (@pxref{Signals}).
 | |
| 
 | |
| @item interactive_comments
 | |
| Allow a word beginning with @samp{#}
 | |
| to cause that word and all remaining characters on that
 | |
| line to be ignored in an interactive shell.
 | |
| This option is enabled by default.
 | |
| 
 | |
| @item lastpipe
 | |
| If set, and job control is not active, the shell runs the last command of
 | |
| a pipeline not executed in the background in the current shell environment.
 | |
| 
 | |
| @item lithist
 | |
| If enabled, and the @code{cmdhist}
 | |
| option is enabled, multi-line commands are saved to the history with
 | |
| embedded newlines rather than using semicolon separators where possible.
 | |
| 
 | |
| @item login_shell
 | |
| The shell sets this option if it is started as a login shell
 | |
| (@pxref{Invoking Bash}).
 | |
| The value may not be changed.
 | |
| 
 | |
| @item mailwarn
 | |
| If set, and a file that Bash is checking for mail has been  
 | |
| accessed since the last time it was checked, the message
 | |
| @code{"The mail in @var{mailfile} has been read"} is displayed.
 | |
| 
 | |
| @item no_empty_cmd_completion
 | |
| If set, and Readline is being used, Bash will not attempt to search
 | |
| the @env{PATH} for possible completions when completion is attempted
 | |
| on an empty line.
 | |
| 
 | |
| @item nocaseglob
 | |
| If set, Bash matches filenames in a case-insensitive fashion when
 | |
| performing filename expansion.
 | |
| 
 | |
| @item nocasematch
 | |
| If set, Bash matches patterns in a case-insensitive fashion when
 | |
| performing matching while executing @code{case} or @code{[[}
 | |
| conditional commands.
 | |
| 
 | |
| @item nullglob
 | |
| If set, Bash allows filename patterns which match no
 | |
| files to expand to a null string, rather than themselves.
 | |
| 
 | |
| @item progcomp
 | |
| If set, the programmable completion facilities
 | |
| (@pxref{Programmable Completion}) are enabled.
 | |
| This option is enabled by default.
 | |
| 
 | |
| @item promptvars
 | |
| If set, prompt strings undergo
 | |
| parameter expansion, command substitution, arithmetic
 | |
| expansion, and quote removal after being expanded
 | |
| as described below (@pxref{Printing a Prompt}).
 | |
| This option is enabled by default.
 | |
| 
 | |
| @item restricted_shell
 | |
| The shell sets this option if it is started in restricted mode
 | |
| (@pxref{The Restricted Shell}).
 | |
| The value may not be changed.
 | |
| This is not reset when the startup files are executed, allowing
 | |
| the startup files to discover whether or not a shell is restricted.
 | |
| 
 | |
| @item shift_verbose
 | |
| If this is set, the @code{shift}
 | |
| builtin prints an error message when the shift count exceeds the
 | |
| number of positional parameters.
 | |
| 
 | |
| @item sourcepath
 | |
| If set, the @code{source} builtin uses the value of @env{PATH}
 | |
| to find the directory containing the file supplied as an argument.
 | |
| This option is enabled by default.
 | |
| 
 | |
| @item xpg_echo
 | |
| If set, the @code{echo} builtin expands backslash-escape sequences
 | |
| by default.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @noindent
 | |
| The return status when listing options is zero if all @var{optnames}
 | |
| are enabled, non-zero otherwise.
 | |
| When setting or unsetting options, the return status is zero unless an
 | |
| @var{optname} is not a valid shell option.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Special Builtins
 | |
| @section Special Builtins
 | |
| @cindex special builtin
 | |
| 
 | |
| For historical reasons, the @sc{posix} standard has classified
 | |
| several builtin commands as @emph{special}.
 | |
| When Bash is executing in @sc{posix} mode, the special builtins
 | |
| differ from other builtin commands in three respects:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| Special builtins are found before shell functions during command lookup.
 | |
| 
 | |
| @item
 | |
| If a special builtin returns an error status, a non-interactive shell exits.
 | |
| 
 | |
| @item
 | |
| Assignment statements preceding the command stay in effect in the shell
 | |
| environment after the command completes.
 | |
| @end enumerate
 | |
| 
 | |
| When Bash is not executing in @sc{posix} mode, these builtins behave no
 | |
| differently than the rest of the Bash builtin commands.
 | |
| The Bash @sc{posix} mode is described in @ref{Bash POSIX Mode}. 
 | |
| 
 | |
| These are the @sc{posix} special builtins:
 | |
| @example
 | |
| @w{break : . continue eval exec exit export readonly return set}
 | |
| @w{shift trap unset}
 | |
| @end example
 | |
| 
 | |
| @node Shell Variables
 | |
| @chapter Shell Variables
 | |
| 
 | |
| @menu
 | |
| * Bourne Shell Variables::	Variables which Bash uses in the same way
 | |
| 				as the Bourne Shell.
 | |
| * Bash Variables::		List of variables that exist in Bash.
 | |
| @end menu
 | |
| 
 | |
| This chapter describes the shell variables that Bash uses.
 | |
| Bash automatically assigns default values to a number of variables.
 | |
| 
 | |
| @node Bourne Shell Variables
 | |
| @section Bourne Shell Variables
 | |
| 
 | |
| Bash uses certain shell variables in the same way as the Bourne shell.
 | |
| In some cases, Bash assigns a default value to the variable.
 | |
| 
 | |
| @vtable @code
 | |
| 
 | |
| @item CDPATH
 | |
| A colon-separated list of directories used as a search path for
 | |
| the @code{cd} builtin command.
 | |
| 
 | |
| @item HOME
 | |
| The current user's home directory; the default for the @code{cd} builtin
 | |
| command.
 | |
| The value of this variable is also used by tilde expansion
 | |
| (@pxref{Tilde Expansion}).
 | |
| 
 | |
| @item IFS
 | |
| A list of characters that separate fields; used when the shell splits
 | |
| words as part of expansion.
 | |
| 
 | |
| @item MAIL
 | |
| If this parameter is set to a filename or directory name
 | |
| and the @env{MAILPATH} variable
 | |
| is not set, Bash informs the user of the arrival of mail in
 | |
| the specified file or Maildir-format directory.
 | |
| 
 | |
| @item MAILPATH
 | |
| A colon-separated list of filenames which the shell periodically checks
 | |
| for new mail.
 | |
| Each list entry can specify the message that is printed when new mail
 | |
| arrives in the mail file by separating the file name from the message with
 | |
| a @samp{?}.
 | |
| When used in the text of the message, @code{$_} expands to the name of
 | |
| the current mail file.
 | |
| 
 | |
| @item OPTARG
 | |
| The value of the last option argument processed by the @code{getopts} builtin.
 | |
| 
 | |
| @item OPTIND
 | |
| The index of the last option argument processed by the @code{getopts} builtin.
 | |
| 
 | |
| @item PATH
 | |
| A colon-separated list of directories in which the shell looks for
 | |
| commands.
 | |
| A zero-length (null) directory name in the value of @code{PATH} indicates the
 | |
| current directory.
 | |
| A null directory name may appear as two adjacent colons, or as an initial
 | |
| or trailing colon.
 | |
| 
 | |
| 
 | |
| @item PS1
 | |
| The primary prompt string.  The default value is @samp{\s-\v\$ }.
 | |
| @xref{Printing a Prompt}, for the complete list of escape
 | |
| sequences that are expanded before @env{PS1} is displayed.
 | |
| 
 | |
| @item PS2
 | |
| The secondary prompt string.  The default value is @samp{> }.
 | |
| 
 | |
| @end vtable
 | |
| 
 | |
| @node Bash Variables
 | |
| @section Bash Variables
 | |
| 
 | |
| These variables are set or used by Bash, but other shells
 | |
| do not normally treat them specially.
 | |
| 
 | |
| A few variables used by Bash are described in different chapters:
 | |
| variables for controlling the job control facilities
 | |
| (@pxref{Job Control Variables}).
 | |
| 
 | |
| @vtable @code
 | |
| 
 | |
| @item BASH
 | |
| The full pathname used to execute the current instance of Bash.
 | |
| 
 | |
| @item BASHOPTS
 | |
| A colon-separated list of enabled shell options.  Each word in
 | |
| the list is a valid argument for the @option{-s} option to the
 | |
| @code{shopt} builtin command (@pxref{The Shopt Builtin}).
 | |
| The options appearing in @env{BASHOPTS} are those reported
 | |
| as @samp{on} by @samp{shopt}.
 | |
| If this variable is in the environment when Bash
 | |
| starts up, each shell option in the list will be enabled before
 | |
| reading any startup files.  This variable is readonly.
 | |
| 
 | |
| @item BASHPID
 | |
| Expands to the process ID of the current Bash process.
 | |
| This differs from @code{$$} under certain circumstances, such as subshells
 | |
| that do not require Bash to be re-initialized.
 | |
| 
 | |
| @item BASH_ALIASES
 | |
| An associative array variable whose members correspond to the internal
 | |
| list of aliases as maintained by the @code{alias} builtin.
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| Elements added to this array appear in the alias list; unsetting array
 | |
| elements cause aliases to be removed from the alias list.
 | |
| 
 | |
| @item BASH_ARGC
 | |
| An array variable whose values are the number of parameters in each
 | |
| frame of the current bash execution call stack.  The number of
 | |
| parameters to the current subroutine (shell function or script executed
 | |
| with @code{.} or @code{source}) is at the top of the stack.  When a
 | |
| subroutine is executed, the number of parameters passed is pushed onto
 | |
| @code{BASH_ARGC}.
 | |
| The shell sets @code{BASH_ARGC} only when in extended debugging mode
 | |
| (see @ref{The Shopt Builtin}
 | |
| for a description of the @code{extdebug} option to the @code{shopt}
 | |
| builtin).
 | |
| 
 | |
| @item BASH_ARGV
 | |
| An array variable containing all of the parameters in the current bash
 | |
| execution call stack.  The final parameter of the last subroutine call
 | |
| is at the top of the stack; the first parameter of the initial call is
 | |
| at the bottom.  When a subroutine is executed, the parameters supplied
 | |
| are pushed onto @code{BASH_ARGV}.
 | |
| The shell sets @code{BASH_ARGV} only when in extended debugging mode
 | |
| (see @ref{The Shopt Builtin}
 | |
| for a description of the @code{extdebug} option to the @code{shopt}
 | |
| builtin).
 | |
| 
 | |
| @item BASH_CMDS
 | |
| An associative array variable whose members correspond to the internal
 | |
| hash table of commands as maintained by the @code{hash} builtin
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| Elements added to this array appear in the hash table; unsetting array
 | |
| elements cause commands to be removed from the hash table.
 | |
| 
 | |
| @item BASH_COMMAND
 | |
| The command currently being executed or about to be executed, unless the
 | |
| shell is executing a command as the result of a trap,
 | |
| in which case it is the command executing at the time of the trap.
 | |
| 
 | |
| @item BASH_ENV
 | |
| If this variable is set when Bash is invoked to execute a shell
 | |
| script, its value is expanded and used as the name of a startup file
 | |
| to read before executing the script.  @xref{Bash Startup Files}.
 | |
| 
 | |
| @item BASH_EXECUTION_STRING
 | |
| The command argument to the @option{-c} invocation option.
 | |
| 
 | |
| @item BASH_LINENO
 | |
| An array variable whose members are the line numbers in source files
 | |
| where each corresponding member of @var{FUNCNAME} was invoked.
 | |
| @code{$@{BASH_LINENO[$i]@}} is the line number in the source file
 | |
| (@code{$@{BASH_SOURCE[$i+1]@}}) where
 | |
| @code{$@{FUNCNAME[$i]@}} was called (or @code{$@{BASH_LINENO[$i-1]@}} if
 | |
| referenced within another shell function). 
 | |
| Use @code{LINENO} to obtain the current line number.
 | |
| 
 | |
| @item BASH_REMATCH
 | |
| An array variable whose members are assigned by the @samp{=~} binary
 | |
| operator to the @code{[[} conditional command
 | |
| (@pxref{Conditional Constructs}).
 | |
| The element with index 0 is the portion of the string
 | |
| matching the entire regular expression.
 | |
| The element with index @var{n} is the portion of the
 | |
| string matching the @var{n}th parenthesized subexpression.
 | |
| This variable is read-only.
 | |
| 
 | |
| @item BASH_SOURCE
 | |
| An array variable whose members are the source filenames where the
 | |
| corresponding shell function names in the @code{FUNCNAME} array
 | |
| variable are defined.
 | |
| The shell function @code{$@{FUNCNAME[$i]@}} is defined in the file
 | |
| @code{$@{BASH_SOURCE[$i]@}} and called from @code{$@{BASH_SOURCE[$i+1]@}}
 | |
| 
 | |
| @item BASH_SUBSHELL
 | |
| Incremented by one each time a subshell or subshell environment is spawned.
 | |
| The initial value is 0.
 | |
| 
 | |
| @item BASH_VERSINFO
 | |
| A readonly array variable (@pxref{Arrays})
 | |
| whose members hold version information for this instance of Bash.
 | |
| The values assigned to the array members are as follows:
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item BASH_VERSINFO[0]
 | |
| The major version number (the @var{release}).
 | |
| 
 | |
| @item BASH_VERSINFO[1]
 | |
| The minor version number (the @var{version}).
 | |
| 
 | |
| @item BASH_VERSINFO[2]
 | |
| The patch level.
 | |
| 
 | |
| @item BASH_VERSINFO[3]
 | |
| The build version.
 | |
| 
 | |
| @item BASH_VERSINFO[4]
 | |
| The release status (e.g., @var{beta1}).
 | |
| 
 | |
| @item BASH_VERSINFO[5]
 | |
| The value of @env{MACHTYPE}.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @item BASH_VERSION
 | |
| The version number of the current instance of Bash.
 | |
| 
 | |
| @item BASH_XTRACEFD
 | |
| If set to an integer corresponding to a valid file descriptor, Bash
 | |
| will write the trace output generated when @samp{set -x}
 | |
| is enabled to that file descriptor.
 | |
| This allows tracing output to be separated from diagnostic and error
 | |
| messages.
 | |
| The file descriptor is closed when @code{BASH_XTRACEFD} is unset or assigned
 | |
| a new value.
 | |
| Unsetting @code{BASH_XTRACEFD} or assigning it the empty string causes the
 | |
| trace output to be sent to the standard error.
 | |
| Note that setting @code{BASH_XTRACEFD} to 2 (the standard error file
 | |
| descriptor) and then unsetting it will result in the standard error
 | |
| being closed.
 | |
| 
 | |
| @item COLUMNS
 | |
| Used by the @code{select} command to determine the terminal width
 | |
| when printing selection lists.  Automatically set upon receipt of a
 | |
| @code{SIGWINCH}.
 | |
| 
 | |
| @item COMP_CWORD
 | |
| An index into @env{$@{COMP_WORDS@}} of the word containing the current
 | |
| cursor position.
 | |
| This variable is available only in shell functions invoked by the
 | |
| programmable completion facilities (@pxref{Programmable Completion}).
 | |
| 
 | |
| @item COMP_LINE
 | |
| The current command line.
 | |
| This variable is available only in shell functions and external
 | |
| commands invoked by the
 | |
| programmable completion facilities (@pxref{Programmable Completion}).
 | |
| 
 | |
| @item COMP_POINT
 | |
| The index of the current cursor position relative to the beginning of
 | |
| the current command.
 | |
| If the current cursor position is at the end of the current command,
 | |
| the value of this variable is equal to @code{$@{#COMP_LINE@}}.
 | |
| This variable is available only in shell functions and external
 | |
| commands invoked by the
 | |
| programmable completion facilities (@pxref{Programmable Completion}).
 | |
| 
 | |
| @item COMP_TYPE
 | |
| Set to an integer value corresponding to the type of completion attempted
 | |
| that caused a completion function to be called:
 | |
| @var{TAB}, for normal completion,
 | |
| @samp{?}, for listing completions after successive tabs,
 | |
| @samp{!}, for listing alternatives on partial word completion,
 | |
| @samp{@@}, to list completions if the word is not unmodified,
 | |
| or
 | |
| @samp{%}, for menu completion.
 | |
| This variable is available only in shell functions and external
 | |
| commands invoked by the
 | |
| programmable completion facilities (@pxref{Programmable Completion}).
 | |
| 
 | |
| @item COMP_KEY
 | |
| The key (or final key of a key sequence) used to invoke the current
 | |
| completion function.
 | |
| 
 | |
| @item COMP_WORDBREAKS
 | |
| The set of characters that the Readline library treats as word
 | |
| separators when performing word completion.
 | |
| If @code{COMP_WORDBREAKS} is unset, it loses its special properties,
 | |
| even if it is subsequently reset.
 | |
| 
 | |
| @item COMP_WORDS
 | |
| An array variable consisting of the individual
 | |
| words in the current command line.
 | |
| The line is split into words as Readline would split it, using
 | |
| @code{COMP_WORDBREAKS} as described above.
 | |
| This variable is available only in shell functions invoked by the
 | |
| programmable completion facilities (@pxref{Programmable Completion}).
 | |
| 
 | |
| @item COMPREPLY
 | |
| An array variable from which Bash reads the possible completions
 | |
| generated by a shell function invoked by the programmable completion
 | |
| facility (@pxref{Programmable Completion}).
 | |
| 
 | |
| @item COPROC
 | |
| An array variable created to hold the file descriptors
 | |
| for output from and input to an unnamed coprocess (@pxref{Coprocesses}).
 | |
| 
 | |
| @item DIRSTACK
 | |
| An array variable containing the current contents of the directory stack.
 | |
| Directories appear in the stack in the order they are displayed by the
 | |
| @code{dirs} builtin.
 | |
| Assigning to members of this array variable may be used to modify
 | |
| directories already in the stack, but the @code{pushd} and @code{popd}
 | |
| builtins must be used to add and remove directories.
 | |
| Assignment to this variable will not change the current directory.
 | |
| If @env{DIRSTACK} is unset, it loses its special properties, even if
 | |
| it is subsequently reset.
 | |
| 
 | |
| @item EMACS
 | |
| If Bash finds this variable in the environment when the shell
 | |
| starts with value @samp{t}, it assumes that the shell is running in an
 | |
| Emacs shell buffer and disables line editing.
 | |
| 
 | |
| @item ENV
 | |
| Similar to @code{BASH_ENV}; used when the shell is invoked in
 | |
| @sc{posix} Mode (@pxref{Bash POSIX Mode}).
 | |
| 
 | |
| @item EUID
 | |
| The numeric effective user id of the current user.  This variable
 | |
| is readonly.
 | |
| 
 | |
| @item FCEDIT
 | |
| The editor used as a default by the @option{-e} option to the @code{fc}
 | |
| builtin command.
 | |
| 
 | |
| @item FIGNORE
 | |
| A colon-separated list of suffixes to ignore when performing
 | |
| filename completion.
 | |
| A file name whose suffix matches one of the entries in 
 | |
| @env{FIGNORE}
 | |
| is excluded from the list of matched file names.  A sample
 | |
| value is @samp{.o:~}
 | |
| 
 | |
| @item FUNCNAME
 | |
| An array variable containing the names of all shell functions
 | |
| currently in the execution call stack.
 | |
| The element with index 0 is the name of any currently-executing
 | |
| shell function.
 | |
| The bottom-most element (the one with the highest index)
 | |
| is @code{"main"}.
 | |
| This variable exists only when a shell function is executing.
 | |
| Assignments to @env{FUNCNAME} have no effect and return an error status.
 | |
| If @env{FUNCNAME} is unset, it loses its special properties, even if
 | |
| it is subsequently reset.
 | |
| 
 | |
| This variable can be used with @code{BASH_LINENO} and @code{BASH_SOURCE}.
 | |
| Each element of @code{FUNCNAME} has corresponding elements in
 | |
| @code{BASH_LINENO} and @code{BASH_SOURCE} to describe the call stack.
 | |
| For instance, @code{$@{FUNCNAME[$i]@}} was called from the file
 | |
| @code{$@{BASH_SOURCE[$i+1]@}} at line number @code{$@{BASH_LINENO[$i]@}}.
 | |
| The @code{caller} builtin displays the current call stack using this
 | |
| information.
 | |
| 
 | |
| @item FUNCNEST
 | |
| If set to a numeric value greater than 0, defines a maximum function
 | |
| nesting level.  Function invocations that exceed this nesting level
 | |
| will cause the current command to abort.
 | |
| 
 | |
| @item GLOBIGNORE
 | |
| A colon-separated list of patterns defining the set of filenames to
 | |
| be ignored by filename expansion.
 | |
| If a filename matched by a filename expansion pattern also matches one
 | |
| of the patterns in @env{GLOBIGNORE}, it is removed from the list
 | |
| of matches.
 | |
| 
 | |
| @item GROUPS
 | |
| An array variable containing the list of groups of which the current    
 | |
| user is a member.
 | |
| Assignments to @env{GROUPS} have no effect and return an error status.
 | |
| If @env{GROUPS} is unset, it loses its special properties, even if it is
 | |
| subsequently reset.
 | |
| 
 | |
| @item histchars
 | |
| Up to three characters which control history expansion, quick
 | |
| substitution, and tokenization (@pxref{History Interaction}).
 | |
| The first character is the
 | |
| @var{history expansion} character, that is, the character which signifies the
 | |
| start of a history expansion, normally @samp{!}.  The second character is the
 | |
| character which signifies `quick substitution' when seen as the first
 | |
| character on a line, normally @samp{^}.  The optional third character is the
 | |
| character which indicates that the remainder of the line is a comment when
 | |
| found as the first character of a word, usually @samp{#}.  The history
 | |
| comment character causes history substitution to be skipped for the
 | |
| remaining words on the line.  It does not necessarily cause the shell
 | |
| parser to treat the rest of the line as a comment.
 | |
| 
 | |
| @item HISTCMD
 | |
| The history number, or index in the history list, of the current
 | |
| command.  If @env{HISTCMD} is unset, it loses its special properties,
 | |
| even if it is subsequently reset.
 | |
| 
 | |
| @item HISTCONTROL
 | |
| A colon-separated list of values controlling how commands are saved on
 | |
| the history list.
 | |
| If the list of values includes @samp{ignorespace}, lines which begin
 | |
| with a space character are not saved in the history list.
 | |
| A value of @samp{ignoredups} causes lines which match the previous
 | |
| history entry to not be saved.
 | |
| A value of @samp{ignoreboth} is shorthand for
 | |
| @samp{ignorespace} and @samp{ignoredups}.
 | |
| A value of @samp{erasedups} causes all previous lines matching the
 | |
| current line to be removed from the history list before that line
 | |
| is saved.
 | |
| Any value not in the above list is ignored.
 | |
| If @env{HISTCONTROL} is unset, or does not include a valid value, 
 | |
| all lines read by the shell parser are saved on the history list, 
 | |
| subject to the value of @env{HISTIGNORE}.
 | |
| The second and subsequent lines of a multi-line compound command are
 | |
| not tested, and are added to the history regardless of the value of
 | |
| @env{HISTCONTROL}.
 | |
| 
 | |
| @item HISTFILE
 | |
| The name of the file to which the command history is saved.  The
 | |
| default value is @file{~/.bash_history}.
 | |
| 
 | |
| @item HISTFILESIZE
 | |
| The maximum number of lines contained in the history file.  When this
 | |
| variable is assigned a value, the history file is truncated, if
 | |
| necessary, by removing the oldest entries,
 | |
| to contain no more than that number of lines.
 | |
| The history file is also truncated to this size after
 | |
| writing it when an interactive shell exits.
 | |
| The default value is 500.
 | |
| 
 | |
| @item HISTIGNORE
 | |
| A colon-separated list of patterns used to decide which command
 | |
| lines should be saved on the history list.  Each pattern is
 | |
| anchored at the beginning of the line and must match the complete
 | |
| line (no implicit @samp{*} is appended).  Each pattern is tested
 | |
| against the line after the checks specified by @env{HISTCONTROL}
 | |
| are applied.  In addition to the normal shell pattern matching
 | |
| characters, @samp{&} matches the previous history line.  @samp{&}
 | |
| may be escaped using a backslash; the backslash is removed
 | |
| before attempting a match. 
 | |
| The second and subsequent lines of a multi-line compound command are
 | |
| not tested, and are added to the history regardless of the value of
 | |
| @env{HISTIGNORE}.
 | |
| 
 | |
| @env{HISTIGNORE} subsumes the function of @env{HISTCONTROL}.  A
 | |
| pattern of @samp{&} is identical to @code{ignoredups}, and a
 | |
| pattern of @samp{[ ]*} is identical to @code{ignorespace}. 
 | |
| Combining these two patterns, separating them with a colon,
 | |
| provides the functionality of @code{ignoreboth}. 
 | |
| 
 | |
| @item HISTSIZE
 | |
| The maximum number of commands to remember on the history list.
 | |
| The default value is 500.
 | |
| 
 | |
| @item HISTTIMEFORMAT
 | |
| If this variable is set and not null, its value is used as a format string
 | |
| for @var{strftime} to print the time stamp associated with each history
 | |
| entry displayed by the @code{history} builtin.
 | |
| If this variable is set, time stamps are written to the history file so
 | |
| they may be preserved across shell sessions.
 | |
| This uses the history comment character to distinguish timestamps from
 | |
| other history lines.
 | |
| 
 | |
| @item HOSTFILE
 | |
| Contains the name of a file in the same format as @file{/etc/hosts} that
 | |
| should be read when the shell needs to complete a hostname.
 | |
| The list of possible hostname completions may be changed while the shell
 | |
| is running;
 | |
| the next time hostname completion is attempted after the
 | |
| value is changed, Bash adds the contents of the new file to the
 | |
| existing list.
 | |
| If @env{HOSTFILE} is set, but has no value, or does not name a readable file,
 | |
| Bash attempts to read 
 | |
| @file{/etc/hosts} to obtain the list of possible hostname completions.
 | |
| When @env{HOSTFILE} is unset, the hostname list is cleared.
 | |
| 
 | |
| @item HOSTNAME
 | |
| The name of the current host.
 | |
| 
 | |
| @item HOSTTYPE
 | |
| A string describing the machine Bash is running on.
 | |
| 
 | |
| @item IGNOREEOF
 | |
| Controls the action of the shell on receipt of an @code{EOF} character
 | |
| as the sole input.  If set, the value denotes the number
 | |
| of consecutive @code{EOF} characters that can be read as the
 | |
| first character on an input line
 | |
| before the shell will exit.  If the variable exists but does not
 | |
| have a numeric value (or has no value) then the default is 10.
 | |
| If the variable does not exist, then @code{EOF} signifies the end of 
 | |
| input to the shell.  This is only in effect for interactive shells.
 | |
| 
 | |
| @item INPUTRC
 | |
| The name of the Readline initialization file, overriding the default
 | |
| of @file{~/.inputrc}.
 | |
| 
 | |
| @item LANG  
 | |
| Used to determine the locale category for any category not specifically
 | |
| selected with a variable starting with @code{LC_}.
 | |
| 
 | |
| @item LC_ALL
 | |
| This variable overrides the value of @env{LANG} and any other
 | |
| @code{LC_} variable specifying a locale category.
 | |
| 
 | |
| @item LC_COLLATE
 | |
| This variable determines the collation order used when sorting the
 | |
| results of filename expansion, and
 | |
| determines the behavior of range expressions, equivalence classes,
 | |
| and collating sequences within filename expansion and pattern matching
 | |
| (@pxref{Filename Expansion}).
 | |
| 
 | |
| @item LC_CTYPE
 | |
| This variable determines the interpretation of characters and the
 | |
| behavior of character classes within filename expansion and pattern
 | |
| matching (@pxref{Filename Expansion}).
 | |
| 
 | |
| @item LC_MESSAGES
 | |
| This variable determines the locale used to translate double-quoted
 | |
| strings preceded by a @samp{$} (@pxref{Locale Translation}).
 | |
| 
 | |
| @item LC_NUMERIC
 | |
| This variable determines the locale category used for number formatting.
 | |
| 
 | |
| @item LINENO
 | |
| The line number in the script or shell function currently executing.
 | |
| 
 | |
| @item LINES
 | |
| Used by the @code{select} command to determine the column length
 | |
| for printing selection lists.  Automatically set upon receipt of a
 | |
| @code{SIGWINCH}.
 | |
| 
 | |
| @item MACHTYPE
 | |
| A string that fully describes the system type on which Bash
 | |
| is executing, in the standard @sc{gnu} @var{cpu-company-system} format.
 | |
| 
 | |
| @item MAILCHECK
 | |
| How often (in seconds) that the shell should check for mail in the
 | |
| files specified in the @env{MAILPATH} or @env{MAIL} variables.
 | |
| The default is 60 seconds.  When it is time to check
 | |
| for mail, the shell does so before displaying the primary prompt.
 | |
| If this variable is unset, or set to a value that is not a number
 | |
| greater than or equal to zero, the shell disables mail checking.
 | |
| 
 | |
| @item MAPFILE
 | |
| An array variable created to hold the text read by the
 | |
| @code{mapfile} builtin when no variable name is supplied.
 | |
| 
 | |
| @item OLDPWD
 | |
| The previous working directory as set by the @code{cd} builtin.
 | |
| 
 | |
| @item OPTERR
 | |
| If set to the value 1, Bash displays error messages
 | |
| generated by the @code{getopts} builtin command.
 | |
| 
 | |
| @item OSTYPE
 | |
| A string describing the operating system Bash is running on.
 | |
| 
 | |
| @item PIPESTATUS
 | |
| An array variable (@pxref{Arrays})
 | |
| containing a list of exit status values from the processes
 | |
| in the most-recently-executed foreground pipeline (which may
 | |
| contain only a single command).
 | |
| 
 | |
| @item POSIXLY_CORRECT
 | |
| If this variable is in the environment when @code{bash} starts, the shell
 | |
| enters @sc{posix} mode (@pxref{Bash POSIX Mode}) before reading the
 | |
| startup files, as if the @option{--posix} invocation option had been supplied.
 | |
| If it is set while the shell is running, @code{bash} enables @sc{posix} mode,
 | |
| as if the command
 | |
| @example
 | |
| @code{set -o posix}
 | |
| @end example
 | |
| @noindent
 | |
| had been executed.  
 | |
| 
 | |
| @item PPID
 | |
| The process @sc{id} of the shell's parent process.  This variable
 | |
| is readonly.
 | |
| 
 | |
| @item PROMPT_COMMAND
 | |
| If set, the value is interpreted as a command to execute
 | |
| before the printing of each primary prompt (@env{$PS1}).
 | |
| 
 | |
| @item PROMPT_DIRTRIM
 | |
| If set to a number greater than zero, the value is used as the number of
 | |
| trailing directory components to retain when expanding the @code{\w} and
 | |
| @code{\W} prompt string escapes (@pxref{Printing a Prompt}).
 | |
| Characters removed are replaced with an ellipsis.
 | |
| 
 | |
| @item PS3
 | |
| The value of this variable is used as the prompt for the
 | |
| @code{select} command.  If this variable is not set, the
 | |
| @code{select} command prompts with @samp{#? }
 | |
| 
 | |
| @item PS4
 | |
| The value is the prompt printed before the command line is echoed
 | |
| when the @option{-x} option is set (@pxref{The Set Builtin}).
 | |
| The first character of @env{PS4} is replicated multiple times, as
 | |
| necessary, to indicate multiple levels of indirection.
 | |
| The default is @samp{+ }.
 | |
| 
 | |
| @item PWD
 | |
| The current working directory as set by the @code{cd} builtin.
 | |
| 
 | |
| @item RANDOM
 | |
| Each time this parameter is referenced, a random integer
 | |
| between 0 and 32767 is generated.  Assigning a value to this
 | |
| variable seeds the random number generator.
 | |
| 
 | |
| @item READLINE_LINE
 | |
| The contents of the Readline line buffer, for use
 | |
| with @samp{bind -x} (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item READLINE_POINT
 | |
| The position of the insertion point in the Readline line buffer, for use
 | |
| with @samp{bind -x} (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item REPLY
 | |
| The default variable for the @code{read} builtin.
 | |
| 
 | |
| @item SECONDS
 | |
| This variable expands to the number of seconds since the
 | |
| shell was started.  Assignment to this variable resets
 | |
| the count to the value assigned, and the expanded value
 | |
| becomes the value assigned plus the number of seconds
 | |
| since the assignment.
 | |
| 
 | |
| @item SHELL
 | |
| The full pathname to the shell is kept in this environment variable.
 | |
| If it is not set when the shell starts,
 | |
| Bash assigns to it the full pathname of the current user's login shell.
 | |
| 
 | |
| @item SHELLOPTS
 | |
| A colon-separated list of enabled shell options.  Each word in
 | |
| the list is a valid argument for the @option{-o} option to the
 | |
| @code{set} builtin command (@pxref{The Set Builtin}).
 | |
| The options appearing in @env{SHELLOPTS} are those reported
 | |
| as @samp{on} by @samp{set -o}.
 | |
| If this variable is in the environment when Bash
 | |
| starts up, each shell option in the list will be enabled before
 | |
| reading any startup files.  This variable is readonly.
 | |
| 
 | |
| @item SHLVL
 | |
| Incremented by one each time a new instance of Bash is started.  This is
 | |
| intended to be a count of how deeply your Bash shells are nested.
 | |
| 
 | |
| @item TIMEFORMAT
 | |
| The value of this parameter is used as a format string specifying
 | |
| how the timing information for pipelines prefixed with the @code{time}
 | |
| reserved word should be displayed.
 | |
| The @samp{%} character introduces an
 | |
| escape sequence that is expanded to a time value or other
 | |
| information.
 | |
| The escape sequences and their meanings are as
 | |
| follows; the braces denote optional portions. 
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item %%
 | |
| A literal @samp{%}.
 | |
| 
 | |
| @item %[@var{p}][l]R
 | |
| The elapsed time in seconds. 
 | |
| 
 | |
| @item %[@var{p}][l]U
 | |
| The number of CPU seconds spent in user mode. 
 | |
| 
 | |
| @item %[@var{p}][l]S
 | |
| The number of CPU seconds spent in system mode. 
 | |
| 
 | |
| @item %P
 | |
| The CPU percentage, computed as (%U + %S) / %R. 
 | |
| @end table
 | |
| 
 | |
| The optional @var{p} is a digit specifying the precision, the number of
 | |
| fractional digits after a decimal point.
 | |
| A value of 0 causes no decimal point or fraction to be output.
 | |
| At most three places after the decimal point may be specified; values
 | |
| of @var{p} greater than 3 are changed to 3.
 | |
| If @var{p} is not specified, the value 3 is used. 
 | |
| 
 | |
| The optional @code{l} specifies a longer format, including minutes, of
 | |
| the form @var{MM}m@var{SS}.@var{FF}s.
 | |
| The value of @var{p} determines whether or not the fraction is included. 
 | |
| 
 | |
| If this variable is not set, Bash acts as if it had the value
 | |
| @example
 | |
| @code{$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'}
 | |
| @end example
 | |
| If the value is null, no timing information is displayed.
 | |
| A trailing newline is added when the format string is displayed.
 | |
| 
 | |
| @item TMOUT
 | |
| If set to a value greater than zero, @code{TMOUT} is treated as the
 | |
| default timeout for the @code{read} builtin (@pxref{Bash Builtins}).
 | |
| The @code{select} command (@pxref{Conditional Constructs}) terminates
 | |
| if input does not arrive after @code{TMOUT} seconds when input is coming
 | |
| from a terminal.
 | |
| 
 | |
| In an interactive shell, the value is interpreted as
 | |
| the number of seconds to wait for input after issuing the primary
 | |
| prompt when the shell is interactive.
 | |
| Bash terminates after that number of seconds if input does
 | |
| not arrive.
 | |
| 
 | |
| @item TMPDIR
 | |
| If set, Bash uses its value as the name of a directory in which
 | |
| Bash creates temporary files for the shell's use.
 | |
| 
 | |
| @item UID
 | |
| The numeric real user id of the current user.  This variable is readonly.
 | |
| 
 | |
| @end vtable
 | |
| 
 | |
| @node Bash Features
 | |
| @chapter Bash Features
 | |
| 
 | |
| This section describes features unique to Bash.
 | |
| 
 | |
| @menu
 | |
| * Invoking Bash::		Command line options that you can give
 | |
| 				to Bash.
 | |
| * Bash Startup Files::		When and how Bash executes scripts.
 | |
| * Interactive Shells::		What an interactive shell is.
 | |
| * Bash Conditional Expressions::	Primitives used in composing expressions for
 | |
| 				the @code{test} builtin.
 | |
| * Shell Arithmetic::		Arithmetic on shell variables.
 | |
| * Aliases::			Substituting one command for another.
 | |
| * Arrays::			Array Variables.
 | |
| * The Directory Stack::		History of visited directories.
 | |
| * Printing a Prompt::		Controlling the PS1 string.
 | |
| * The Restricted Shell::	A more controlled mode of shell execution.
 | |
| * Bash POSIX Mode::		Making Bash behave more closely to what
 | |
| 				the POSIX standard specifies.
 | |
| @end menu
 | |
| 
 | |
| @node Invoking Bash
 | |
| @section Invoking Bash
 | |
| 
 | |
| @example
 | |
| bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @var{option}] [-O @var{shopt_option}] [@var{argument} @dots{}]
 | |
| bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @var{option}] [-O @var{shopt_option}] -c @var{string} [@var{argument} @dots{}]
 | |
| bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @var{option}] [-O @var{shopt_option}] [@var{argument} @dots{}]
 | |
| @end example
 | |
| 
 | |
| All of the single-character options used with the @code{set} builtin
 | |
| (@pxref{The Set Builtin}) can be used as options when the shell is invoked.
 | |
| In addition, there are several multi-character
 | |
| options that you can use.  These options must appear on the command
 | |
| line before the single-character options to be recognized. 
 | |
| 
 | |
| @table @code
 | |
| @item --debugger
 | |
| Arrange for the debugger profile to be executed before the shell
 | |
| starts.  Turns on extended debugging mode (see @ref{The Shopt Builtin}
 | |
| for a description of the @code{extdebug} option to the @code{shopt}
 | |
| builtin).
 | |
| 
 | |
| @item --dump-po-strings
 | |
| A list of all double-quoted strings preceded by @samp{$}
 | |
| is printed on the standard output
 | |
| in the @sc{gnu} @code{gettext} PO (portable object) file format.
 | |
| Equivalent to @option{-D} except for the output format.
 | |
| 
 | |
| @item --dump-strings
 | |
| Equivalent to @option{-D}.
 | |
| 
 | |
| @item --help
 | |
| Display a usage message on standard output and exit successfully.
 | |
| 
 | |
| @item --init-file @var{filename}
 | |
| @itemx --rcfile @var{filename}
 | |
| Execute commands from @var{filename} (instead of @file{~/.bashrc})
 | |
| in an interactive shell.
 | |
| 
 | |
| @item --login
 | |
| Equivalent to @option{-l}.
 | |
| 
 | |
| @item --noediting
 | |
| Do not use the @sc{gnu} Readline library (@pxref{Command Line Editing})
 | |
| to read  command lines when the shell is interactive.
 | |
| 
 | |
| @item --noprofile
 | |
| Don't load the system-wide startup file @file{/etc/profile}
 | |
| or any of the personal initialization files
 | |
| @file{~/.bash_profile}, @file{~/.bash_login}, or @file{~/.profile}
 | |
| when Bash is invoked as a login shell.
 | |
| 
 | |
| @item --norc
 | |
| Don't read the @file{~/.bashrc} initialization file in an
 | |
| interactive shell.  This is on by default if the shell is
 | |
| invoked as @code{sh}.
 | |
| 
 | |
| @item --posix
 | |
| Change the behavior of Bash where the default operation differs
 | |
| from the @sc{posix} standard to match the standard.  This
 | |
| is intended to make Bash behave as a strict superset of that
 | |
| standard.  @xref{Bash POSIX Mode}, for a description of the Bash
 | |
| @sc{posix} mode.
 | |
| 
 | |
| @item --restricted
 | |
| Make the shell a restricted shell (@pxref{The Restricted Shell}).
 | |
| 
 | |
| @item --verbose
 | |
| Equivalent to @option{-v}.  Print shell input lines as they're read.
 | |
| 
 | |
| @item --version
 | |
| Show version information for this instance of
 | |
| Bash on the standard output and exit successfully.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| There are several single-character options that may be supplied at
 | |
| invocation which are not available with the @code{set} builtin.
 | |
| 
 | |
| @table @code
 | |
| @item -c @var{string}
 | |
| Read and execute commands from @var{string} after processing the
 | |
| options, then exit.  Any remaining arguments are assigned to the
 | |
| positional parameters, starting with @code{$0}.
 | |
| 
 | |
| @item -i
 | |
| Force the shell to run interactively.  Interactive shells are
 | |
| described in @ref{Interactive Shells}.
 | |
| 
 | |
| @item -l
 | |
| Make this shell act as if it had been directly invoked by login.
 | |
| When the shell is interactive, this is equivalent to starting a
 | |
| login shell with @samp{exec -l bash}.
 | |
| When the shell is not interactive, the login shell startup files will
 | |
| be executed.
 | |
| @samp{exec bash -l} or @samp{exec bash --login}
 | |
| will replace the current shell with a Bash login shell.
 | |
| @xref{Bash Startup Files}, for a description of the special behavior
 | |
| of a login shell.
 | |
| 
 | |
| @item -r
 | |
| Make the shell a restricted shell (@pxref{The Restricted Shell}).
 | |
| 
 | |
| @item -s
 | |
| If this option is present, or if no arguments remain after option
 | |
| processing, then commands are read from the standard input.
 | |
| This option allows the positional parameters to be set
 | |
| when invoking an interactive shell.
 | |
| 
 | |
| @item -D
 | |
| A list of all double-quoted strings preceded by @samp{$}
 | |
| is printed on the standard output.
 | |
| These are the strings that
 | |
| are subject to language translation when the current locale
 | |
| is not @code{C} or @code{POSIX} (@pxref{Locale Translation}).
 | |
| This implies the @option{-n} option; no commands will be executed.
 | |
| 
 | |
| @item [-+]O [@var{shopt_option}]
 | |
| @var{shopt_option} is one of the shell options accepted by the
 | |
| @code{shopt} builtin (@pxref{The Shopt Builtin}).
 | |
| If @var{shopt_option} is present, @option{-O} sets the value of that option;
 | |
| @option{+O} unsets it.  
 | |
| If @var{shopt_option} is not supplied, the names and values of the shell
 | |
| options accepted by @code{shopt} are printed on the standard output.
 | |
| If the invocation option is @option{+O}, the output is displayed in a format
 | |
| that may be reused as input.
 | |
| 
 | |
| @item --
 | |
| A @code{--} signals the end of options and disables further option
 | |
| processing.
 | |
| Any arguments after the @code{--} are treated as filenames and arguments.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @cindex login shell
 | |
| A @emph{login} shell is one whose first character of argument zero is
 | |
| @samp{-}, or one invoked with the @option{--login} option.
 | |
| 
 | |
| @cindex interactive shell
 | |
| An @emph{interactive} shell is one started without non-option arguments,
 | |
| unless @option{-s} is specified,
 | |
| without specifying the @option{-c} option, and whose input and output are both
 | |
| connected to terminals (as determined by @code{isatty(3)}), or one
 | |
| started with the @option{-i} option.  @xref{Interactive Shells}, for more
 | |
| information.
 | |
| 
 | |
| If arguments remain after option processing, and neither the
 | |
| @option{-c} nor the @option{-s}
 | |
| option has been supplied, the first argument is assumed to
 | |
| be the name of a file containing shell commands (@pxref{Shell Scripts}).
 | |
| When Bash is invoked in this fashion, @code{$0}
 | |
| is set to the name of the file, and the positional parameters
 | |
| are set to the remaining arguments.
 | |
| Bash reads and executes commands from this file, then exits.   
 | |
| Bash's exit status is the exit status of the last command executed
 | |
| in the script.  If no commands are executed, the exit status is 0.
 | |
| 
 | |
| @node Bash Startup Files
 | |
| @section Bash Startup Files
 | |
| @cindex startup files
 | |
| 
 | |
| This section describes how Bash executes its startup files.
 | |
| If any of the files exist but cannot be read, Bash reports an error.
 | |
| Tildes are expanded in file names as described above under
 | |
| Tilde Expansion (@pxref{Tilde Expansion}).
 | |
| 
 | |
| Interactive shells are described in @ref{Interactive Shells}.
 | |
| 
 | |
| @subsubheading Invoked as an interactive login shell, or with @option{--login}
 | |
| 
 | |
| When Bash is invoked as an interactive login shell, or as a
 | |
| non-interactive shell with the @option{--login} option, it first reads and
 | |
| executes commands from the file @file{/etc/profile}, if that file exists.
 | |
| After reading that file, it looks for @file{~/.bash_profile},
 | |
| @file{~/.bash_login}, and @file{~/.profile}, in that order, and reads
 | |
| and executes commands from the first one that exists and is readable.
 | |
| The @option{--noprofile} option may be used when the shell is started to
 | |
| inhibit this behavior.
 | |
| 
 | |
| When a login shell exits, Bash reads and executes commands from
 | |
| the file @file{~/.bash_logout}, if it exists.
 | |
| 
 | |
| @subsubheading Invoked as an interactive non-login shell
 | |
| 
 | |
| When an interactive shell that is not a login shell is started, Bash
 | |
| reads and executes commands from @file{~/.bashrc}, if that file exists.
 | |
| This may be inhibited by using the @option{--norc} option.
 | |
| The @option{--rcfile @var{file}} option will force Bash to read and
 | |
| execute commands from @var{file} instead of @file{~/.bashrc}.
 | |
| 
 | |
| So, typically, your @file{~/.bash_profile} contains the line
 | |
| @example
 | |
| @code{if [ -f ~/.bashrc ]; then . ~/.bashrc; fi}
 | |
| @end example
 | |
| @noindent
 | |
| after (or before) any login-specific initializations.
 | |
| 
 | |
| @subsubheading Invoked non-interactively
 | |
| 
 | |
| When Bash is started non-interactively, to run a shell script,
 | |
| for example, it looks for the variable @env{BASH_ENV} in the environment,
 | |
| expands its value if it appears there, and uses the expanded value as
 | |
| the name of a file to read and execute.  Bash behaves as if the
 | |
| following command were executed:
 | |
| @example
 | |
| @code{if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi}
 | |
| @end example
 | |
| @noindent
 | |
| but the value of the @env{PATH} variable is not used to search for the
 | |
| file name.
 | |
| 
 | |
| As noted above, if a non-interactive shell is invoked with the
 | |
| @option{--login} option, Bash attempts to read and execute commands from the
 | |
| login shell startup files. 
 | |
| 
 | |
| @subsubheading Invoked with name @code{sh}
 | |
| 
 | |
| If Bash is invoked with the name @code{sh}, it tries to mimic the
 | |
| startup behavior of historical versions of @code{sh} as closely as
 | |
| possible, while conforming to the @sc{posix} standard as well.
 | |
| 
 | |
| When invoked as an interactive login shell, or as a non-interactive
 | |
| shell with the @option{--login} option, it first attempts to read
 | |
| and execute commands from @file{/etc/profile} and @file{~/.profile}, in
 | |
| that order.
 | |
| The @option{--noprofile} option may be used to inhibit this behavior.
 | |
| When invoked as an interactive shell with the name @code{sh}, Bash
 | |
| looks for the variable @env{ENV}, expands its value if it is defined,
 | |
| and uses the expanded value as the name of a file to read and execute.
 | |
| Since a shell invoked as @code{sh} does not attempt to read and execute
 | |
| commands from any other startup files, the @option{--rcfile} option has
 | |
| no effect.
 | |
| A non-interactive shell invoked with the name @code{sh} does not attempt
 | |
| to read any other startup files.
 | |
| 
 | |
| When invoked as @code{sh}, Bash enters @sc{posix} mode after
 | |
| the startup files are read.
 | |
| 
 | |
| @subsubheading Invoked in @sc{posix} mode
 | |
| 
 | |
| When Bash is started in @sc{posix} mode, as with the
 | |
| @option{--posix} command line option, it follows the @sc{posix} standard
 | |
| for startup files.
 | |
| In this mode, interactive shells expand the @env{ENV} variable
 | |
| and commands are read and executed from the file whose name is the
 | |
| expanded value.
 | |
| No other startup files are read.
 | |
| 
 | |
| @subsubheading Invoked by remote shell daemon
 | |
| 
 | |
| Bash attempts to determine when it is being run with its standard input
 | |
| connected to a network connection, as when executed by the remote shell
 | |
| daemon, usually @code{rshd}, or the secure shell daemon @code{sshd}.
 | |
| If Bash determines it is being run in
 | |
| this fashion, it reads and executes commands from @file{~/.bashrc}, if that
 | |
| file exists and is readable.
 | |
| It will not do this if invoked as @code{sh}.
 | |
| The @option{--norc} option may be used to inhibit this behavior, and the
 | |
| @option{--rcfile} option may be used to force another file to be read, but
 | |
| @code{rshd} does not generally invoke the shell with those options or
 | |
| allow them to be specified.
 | |
| 
 | |
| @subsubheading Invoked with unequal effective and real @sc{uid/gid}s
 | |
| 
 | |
| If Bash is started with the effective user (group) id not equal to the
 | |
| real user (group) id, and the @code{-p} option is not supplied, no startup
 | |
| files are read, shell functions are not inherited from the environment,
 | |
| the @env{SHELLOPTS}, @env{BASHOPTS}, @env{CDPATH}, and @env{GLOBIGNORE}
 | |
| variables, if they appear in the environment, are ignored, and the effective
 | |
| user id is set to the real user id.
 | |
| If the @code{-p} option is supplied at invocation, the startup behavior is
 | |
| the same, but the effective user id is not reset.
 | |
| 
 | |
| @node Interactive Shells
 | |
| @section Interactive Shells
 | |
| @cindex interactive shell
 | |
| @cindex shell, interactive
 | |
| 
 | |
| @menu
 | |
| * What is an Interactive Shell?::	What determines whether a shell is Interactive.
 | |
| * Is this Shell Interactive?::	How to tell if a shell is interactive.
 | |
| * Interactive Shell Behavior::	What changes in a interactive shell?
 | |
| @end menu
 | |
| 
 | |
| @node What is an Interactive Shell?
 | |
| @subsection What is an Interactive Shell?
 | |
| 
 | |
| An interactive shell
 | |
| is one started without non-option arguments, unless @option{-s} is
 | |
| specified, without specifying the @option{-c} option, and
 | |
| whose input and error output are both
 | |
| connected to terminals (as determined by @code{isatty(3)}),
 | |
| or one started with the @option{-i} option.
 | |
| 
 | |
| An interactive shell generally reads from and writes to a user's
 | |
| terminal.
 | |
| 
 | |
| The @option{-s} invocation option may be used to set the positional parameters
 | |
| when an interactive shell is started.
 | |
| 
 | |
| @node Is this Shell Interactive?
 | |
| @subsection Is this Shell Interactive?
 | |
| 
 | |
| To determine within a startup script whether or not Bash is
 | |
| running interactively,
 | |
| test the value of the @samp{-} special parameter.
 | |
| It contains @code{i} when the shell is interactive.  For example:
 | |
| 
 | |
| @example
 | |
| case "$-" in
 | |
| *i*)	echo This shell is interactive ;;
 | |
| *)	echo This shell is not interactive ;;
 | |
| esac
 | |
| @end example
 | |
| 
 | |
| Alternatively, startup scripts may examine the variable
 | |
| @env{PS1}; it is unset in non-interactive shells, and set in
 | |
| interactive shells.  Thus:
 | |
| 
 | |
| @example
 | |
| if [ -z "$PS1" ]; then
 | |
|         echo This shell is not interactive
 | |
| else
 | |
|         echo This shell is interactive
 | |
| fi
 | |
| @end example
 | |
| 
 | |
| @node Interactive Shell Behavior
 | |
| @subsection Interactive Shell Behavior
 | |
| 
 | |
| When the shell is running interactively, it changes its behavior in
 | |
| several ways.
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| Startup files are read and executed as described in @ref{Bash Startup Files}.
 | |
| 
 | |
| @item
 | |
| Job Control (@pxref{Job Control}) is enabled by default.  When job
 | |
| control is in effect, Bash ignores the keyboard-generated job control
 | |
| signals @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
 | |
| 
 | |
| @item
 | |
| Bash expands and displays @env{PS1} before reading the first line
 | |
| of a command, and expands and displays @env{PS2} before reading the
 | |
| second and subsequent lines of a multi-line command.
 | |
| 
 | |
| @item
 | |
| Bash executes the value of the @env{PROMPT_COMMAND} variable as a command
 | |
| before printing the primary prompt, @env{$PS1}
 | |
| (@pxref{Bash Variables}).
 | |
| 
 | |
| @item
 | |
| Readline (@pxref{Command Line Editing}) is used to read commands from
 | |
| the user's terminal.
 | |
| 
 | |
| @item
 | |
| Bash inspects the value of the @code{ignoreeof} option to @code{set -o}
 | |
| instead of exiting immediately when it receives an @code{EOF} on its
 | |
| standard input when reading a command (@pxref{The Set Builtin}).
 | |
| 
 | |
| @item
 | |
| Command history (@pxref{Bash History Facilities})
 | |
| and history expansion (@pxref{History Interaction})
 | |
| are enabled by default.
 | |
| Bash will save the command history to the file named by @env{$HISTFILE}
 | |
| when an interactive shell exits.
 | |
| 
 | |
| @item
 | |
| Alias expansion (@pxref{Aliases}) is performed by default.
 | |
| 
 | |
| @item
 | |
| In the absence of any traps, Bash ignores @code{SIGTERM}
 | |
| (@pxref{Signals}).
 | |
| 
 | |
| @item
 | |
| In the absence of any traps, @code{SIGINT} is caught and handled
 | |
| ((@pxref{Signals}).
 | |
| @code{SIGINT} will interrupt some shell builtins.
 | |
| 
 | |
| @item
 | |
| An interactive login shell sends a @code{SIGHUP} to all jobs on exit
 | |
| if the @code{huponexit} shell option has been enabled (@pxref{Signals}).
 | |
| 
 | |
| @item
 | |
| The @option{-n} invocation option is ignored, and @samp{set -n} has
 | |
| no effect (@pxref{The Set Builtin}).
 | |
| 
 | |
| @item
 | |
| Bash will check for mail periodically, depending on the values of the
 | |
| @env{MAIL}, @env{MAILPATH}, and @env{MAILCHECK} shell variables
 | |
| (@pxref{Bash Variables}).
 | |
| 
 | |
| @item
 | |
| Expansion errors due to references to unbound shell variables after
 | |
| @samp{set -u} has been enabled will not cause the shell to exit
 | |
| (@pxref{The Set Builtin}).
 | |
| 
 | |
| @item
 | |
| The shell will not exit on expansion errors caused by @var{var} being unset
 | |
| or null in @code{$@{@var{var}:?@var{word}@}} expansions
 | |
| (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| Redirection errors encountered by shell builtins will not cause the
 | |
| shell to exit.
 | |
| 
 | |
| @item
 | |
| When running in @sc{posix} mode, a special builtin returning an error
 | |
| status will not cause the shell to exit (@pxref{Bash POSIX Mode}).
 | |
| 
 | |
| @item
 | |
| A failed @code{exec} will not cause the shell to exit
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| @item
 | |
| Parser syntax errors will not cause the shell to exit.
 | |
| 
 | |
| @item
 | |
| Simple spelling correction for directory arguments to the @code{cd}
 | |
| builtin is enabled by default (see the description of the @code{cdspell}
 | |
| option to the @code{shopt} builtin in @ref{The Shopt Builtin}).
 | |
| 
 | |
| @item
 | |
| The shell will check the value of the @env{TMOUT} variable and exit
 | |
| if a command is not read within the specified number of seconds after
 | |
| printing @env{$PS1} (@pxref{Bash Variables}).
 | |
| 
 | |
| @end enumerate
 | |
| 
 | |
| @node Bash Conditional Expressions
 | |
| @section Bash Conditional Expressions
 | |
| @cindex expressions, conditional
 | |
| 
 | |
| Conditional expressions are used by the @code{[[} compound command
 | |
| and the @code{test} and @code{[} builtin commands.
 | |
| 
 | |
| Expressions may be unary or binary.
 | |
| Unary expressions are often used to examine the status of a file.
 | |
| There are string operators and numeric comparison operators as well.
 | |
| If the @var{file} argument to one of the primaries is of the form
 | |
| @file{/dev/fd/@var{N}}, then file descriptor @var{N} is checked.
 | |
| If the @var{file} argument to one of the primaries is one of
 | |
| @file{/dev/stdin}, @file{/dev/stdout}, or @file{/dev/stderr}, file
 | |
| descriptor 0, 1, or 2, respectively, is checked.
 | |
| 
 | |
| When used with @samp{[[}, the @samp{<} and @samp{>} operators sort
 | |
| lexicographically using the current locale.
 | |
| The @code{test} command uses ASCII ordering.
 | |
| 
 | |
| Unless otherwise specified, primaries that operate on files follow symbolic
 | |
| links and operate on the target of the link, rather than the link itself.
 | |
| 
 | |
| @table @code
 | |
| @item -a @var{file}
 | |
| True if @var{file} exists.
 | |
| 
 | |
| @item -b @var{file}
 | |
| True if @var{file} exists and is a block special file.
 | |
| 
 | |
| @item -c @var{file}
 | |
| True if @var{file} exists and is a character special file.
 | |
| 
 | |
| @item -d @var{file}
 | |
| True if @var{file} exists and is a directory.
 | |
| 
 | |
| @item -e @var{file}
 | |
| True if @var{file} exists.
 | |
| 
 | |
| @item -f @var{file}
 | |
| True if @var{file} exists and is a regular file.
 | |
| 
 | |
| @item -g @var{file}
 | |
| True if @var{file} exists and its set-group-id bit is set.
 | |
| 
 | |
| @item -h @var{file}
 | |
| True if @var{file} exists and is a symbolic link.
 | |
| 
 | |
| @item -k @var{file}
 | |
| True if @var{file} exists and its "sticky" bit is set.
 | |
| 
 | |
| @item -p @var{file}
 | |
| True if @var{file} exists and is a named pipe (FIFO).
 | |
| 
 | |
| @item -r @var{file}
 | |
| True if @var{file} exists and is readable.
 | |
| 
 | |
| @item -s @var{file}
 | |
| True if @var{file} exists and has a size greater than zero.
 | |
| 
 | |
| @item -t @var{fd}
 | |
| True if file descriptor @var{fd} is open and refers to a terminal.
 | |
| 
 | |
| @item -u @var{file}
 | |
| True if @var{file} exists and its set-user-id bit is set.
 | |
| 
 | |
| @item -w @var{file}
 | |
| True if @var{file} exists and is writable.
 | |
| 
 | |
| @item -x @var{file}
 | |
| True if @var{file} exists and is executable.
 | |
| 
 | |
| @item -G @var{file}
 | |
| True if @var{file} exists and is owned by the effective group id.
 | |
| 
 | |
| @item -L @var{file}
 | |
| True if @var{file} exists and is a symbolic link.
 | |
| 
 | |
| @item -N @var{file}
 | |
| True if @var{file} exists and has been modified since it was last read.
 | |
| 
 | |
| @item -O @var{file}
 | |
| True if @var{file} exists and is owned by the effective user id.
 | |
| 
 | |
| @item -S @var{file}
 | |
| True if @var{file} exists and is a socket.
 | |
| 
 | |
| @item @var{file1} -ef @var{file2}
 | |
| True if @var{file1} and @var{file2} refer to the same device and
 | |
| inode numbers.
 | |
| 
 | |
| @item @var{file1} -nt @var{file2}
 | |
| True if @var{file1} is newer (according to modification date)
 | |
| than @var{file2}, or if @var{file1} exists and @var{file2} does not.
 | |
| 
 | |
| @item @var{file1} -ot @var{file2}
 | |
| True if @var{file1} is older than @var{file2},
 | |
| or if @var{file2} exists and @var{file1} does not.
 | |
| 
 | |
| @item -o @var{optname}
 | |
| True if the shell option @var{optname} is enabled.
 | |
| The list of options appears in the description of the @option{-o}
 | |
| option to the @code{set} builtin (@pxref{The Set Builtin}).
 | |
| 
 | |
| @item -v @var{varname}
 | |
| True if the shell variable @var{varname} is set (has been assigned a value).
 | |
| 
 | |
| @item -z @var{string}
 | |
| True if the length of @var{string} is zero.
 | |
| 
 | |
| @item -n @var{string}
 | |
| @itemx @var{string}
 | |
| True if the length of @var{string} is non-zero.
 | |
| 
 | |
| @item @var{string1} == @var{string2}
 | |
| @itemx @var{string1} = @var{string2}
 | |
| True if the strings are equal.
 | |
| @samp{=} should be used with the @code{test} command for @sc{posix} conformance.
 | |
| 
 | |
| @item @var{string1} != @var{string2}
 | |
| True if the strings are not equal.
 | |
| 
 | |
| @item @var{string1} < @var{string2}
 | |
| True if @var{string1} sorts before @var{string2} lexicographically.
 | |
| 
 | |
| @item @var{string1} > @var{string2}
 | |
| True if @var{string1} sorts after @var{string2} lexicographically.
 | |
| 
 | |
| @item @var{arg1} OP @var{arg2}
 | |
| @code{OP} is one of 
 | |
| @samp{-eq}, @samp{-ne}, @samp{-lt}, @samp{-le}, @samp{-gt}, or @samp{-ge}.
 | |
| These arithmetic binary operators return true if @var{arg1}
 | |
| is equal to, not equal to, less than, less than or equal to,
 | |
| greater than, or greater than or equal to @var{arg2},
 | |
| respectively.  @var{Arg1} and @var{arg2}
 | |
| may be positive or negative integers.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Shell Arithmetic
 | |
| @section Shell Arithmetic
 | |
| @cindex arithmetic, shell
 | |
| @cindex shell arithmetic
 | |
| @cindex expressions, arithmetic
 | |
| @cindex evaluation, arithmetic
 | |
| @cindex arithmetic evaluation
 | |
| 
 | |
| The shell allows arithmetic expressions to be evaluated, as one of
 | |
| the shell expansions or by the @code{let} and the @option{-i} option
 | |
| to the @code{declare} builtins.
 | |
| 
 | |
| Evaluation is done in fixed-width integers with no check for overflow,
 | |
| though division by 0 is trapped and flagged as an error.
 | |
| The operators and their precedence, associativity, and values
 | |
| are the same as in the C language.
 | |
| The following list of operators is grouped into levels of
 | |
| equal-precedence operators.
 | |
| The levels are listed in order of decreasing precedence. 
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item @var{id}++ @var{id}--
 | |
| variable post-increment and post-decrement 
 | |
| 
 | |
| @item ++@var{id} --@var{id}
 | |
| variable pre-increment and pre-decrement
 | |
| 
 | |
| @item - +
 | |
| unary minus and plus
 | |
| 
 | |
| @item ! ~
 | |
| logical and bitwise negation
 | |
| 
 | |
| @item **
 | |
| exponentiation
 | |
| 
 | |
| @item * / %
 | |
| multiplication, division, remainder
 | |
| 
 | |
| @item + -
 | |
| addition, subtraction
 | |
| 
 | |
| @item << >>
 | |
| left and right bitwise shifts
 | |
| 
 | |
| @item <= >= < >
 | |
| comparison
 | |
| 
 | |
| @item == !=
 | |
| equality and inequality
 | |
| 
 | |
| @item &
 | |
| bitwise AND
 | |
| 
 | |
| @item ^
 | |
| bitwise exclusive OR
 | |
| 
 | |
| @item |
 | |
| bitwise OR
 | |
| 
 | |
| @item &&
 | |
| logical AND
 | |
| 
 | |
| @item ||
 | |
| logical OR
 | |
| 
 | |
| @item expr ? expr : expr
 | |
| conditional operator
 | |
| 
 | |
| @item = *= /= %= += -= <<= >>= &= ^= |=
 | |
| assignment
 | |
| 
 | |
| @item expr1 , expr2
 | |
| comma
 | |
| @end table
 | |
| 
 | |
| Shell variables are allowed as operands; parameter expansion is
 | |
| performed before the expression is evaluated. 
 | |
| Within an expression, shell variables may also be referenced by name
 | |
| without using the parameter expansion syntax.
 | |
| A shell variable that is null or unset evaluates to 0 when referenced
 | |
| by name without using the parameter expansion syntax.
 | |
| The value of a variable is evaluated as an arithmetic expression
 | |
| when it is referenced, or when a variable which has been given the  
 | |
| @var{integer} attribute using @samp{declare -i} is assigned a value.
 | |
| A null value evaluates to 0.
 | |
| A shell variable need not have its @var{integer} attribute turned on
 | |
| to be used in an expression.
 | |
| 
 | |
| Constants with a leading 0 are interpreted as octal numbers.
 | |
| A leading @samp{0x} or @samp{0X} denotes hexadecimal.  Otherwise,
 | |
| numbers take the form [@var{base}@code{#}]@var{n}, where the optional @var{base}
 | |
| is a decimal number between 2 and 64 representing the arithmetic
 | |
| base, and @var{n} is a number in that base.  If @var{base}@code{#} is
 | |
| omitted, then base 10 is used.
 | |
| The digits greater than 9 are represented by the lowercase letters,
 | |
| the uppercase letters, @samp{@@}, and @samp{_}, in that order.
 | |
| If @var{base} is less than or equal to 36, lowercase and uppercase
 | |
| letters may be used interchangeably to represent numbers between 10
 | |
| and 35.
 | |
| 
 | |
| Operators are evaluated in order of precedence.  Sub-expressions in
 | |
| parentheses are evaluated first and may override the precedence
 | |
| rules above.
 | |
| 
 | |
| @node Aliases
 | |
| @section Aliases
 | |
| @cindex alias expansion
 | |
| 
 | |
| @var{Aliases} allow a string to be substituted for a word when it is used
 | |
| as the first word of a simple command.
 | |
| The shell maintains a list of aliases that may be set and unset with
 | |
| the @code{alias} and @code{unalias} builtin commands.
 | |
| 
 | |
| The first word of each simple command, if unquoted, is checked to see
 | |
| if it has an alias.
 | |
| If so, that word is replaced by the text of the alias.
 | |
| The characters @samp{/}, @samp{$}, @samp{`}, @samp{=} and any of the
 | |
| shell metacharacters or quoting characters listed above may not appear
 | |
| in an alias name.
 | |
| The replacement text may contain any valid
 | |
| shell input, including shell metacharacters.
 | |
| The first word of the replacement text is tested for
 | |
| aliases, but a word that is identical to an alias being expanded
 | |
| is not expanded a second time.
 | |
| This means that one may alias @code{ls} to @code{"ls -F"},
 | |
| for instance, and Bash does not try to recursively expand the
 | |
| replacement text. If the last character of the alias value is a
 | |
| space or tab character, then the next command word following the
 | |
| alias is also checked for alias expansion.
 | |
| 
 | |
| Aliases are created and listed with the @code{alias}
 | |
| command, and removed with the @code{unalias} command.
 | |
| 
 | |
| There is no mechanism for using arguments in the replacement text,
 | |
| as in @code{csh}.
 | |
| If arguments are needed, a shell function should be used
 | |
| (@pxref{Shell Functions}).
 | |
| 
 | |
| Aliases are not expanded when the shell is not interactive,
 | |
| unless the @code{expand_aliases} shell option is set using
 | |
| @code{shopt} (@pxref{The Shopt Builtin}).
 | |
| 
 | |
| The rules concerning the definition and use of aliases are
 | |
| somewhat confusing.  Bash
 | |
| always reads at least one complete line
 | |
| of input before executing any
 | |
| of the commands on that line.  Aliases are expanded when a
 | |
| command is read, not when it is executed.  Therefore, an
 | |
| alias definition appearing on the same line as another
 | |
| command does not take effect until the next line of input is read.
 | |
| The commands following the alias definition
 | |
| on that line are not affected by the new alias.
 | |
| This behavior is also an issue when functions are executed.
 | |
| Aliases are expanded when a function definition is read,
 | |
| not when the function is executed, because a function definition
 | |
| is itself a compound command.  As a consequence, aliases
 | |
| defined in a function are not available until after that
 | |
| function is executed.  To be safe, always put
 | |
| alias definitions on a separate line, and do not use @code{alias}
 | |
| in compound commands.
 | |
| 
 | |
| For almost every purpose, shell functions are preferred over aliases.
 | |
| 
 | |
| @node Arrays
 | |
| @section Arrays
 | |
| @cindex arrays
 | |
| 
 | |
| Bash provides one-dimensional indexed and associative array variables.
 | |
| Any variable may be used as an indexed array;
 | |
| the @code{declare} builtin will explicitly declare an array.
 | |
| There is no maximum
 | |
| limit on the size of an array, nor any requirement that members
 | |
| be indexed or assigned contiguously.
 | |
| Indexed arrays are referenced using integers (including arithmetic
 | |
| expressions (@pxref{Shell Arithmetic}) and are zero-based;
 | |
| associative arrays use arbitrary strings.
 | |
| 
 | |
| An indexed array is created automatically if any variable is assigned to
 | |
| using the syntax
 | |
| @example
 | |
| name[@var{subscript}]=@var{value}
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| The @var{subscript}
 | |
| is treated as an arithmetic expression that must evaluate to a number.
 | |
| If @var{subscript} evaluates to a number less than zero, it is used as
 | |
| an offset from one greater than the array's maximum index (so a subcript
 | |
| of -1 refers to the last element of the array).
 | |
| To explicitly declare an array, use
 | |
| @example
 | |
| declare -a @var{name}
 | |
| @end example
 | |
| @noindent
 | |
| The syntax
 | |
| @example
 | |
| declare -a @var{name}[@var{subscript}]
 | |
| @end example
 | |
| @noindent
 | |
| is also accepted; the @var{subscript} is ignored.
 | |
| 
 | |
| Associative arrays are created using
 | |
| @example
 | |
| declare -A @var{name}.
 | |
| @end example
 | |
| 
 | |
| Attributes may be
 | |
| specified for an array variable using the @code{declare} and
 | |
| @code{readonly} builtins.  Each attribute applies to all members of
 | |
| an array.
 | |
| 
 | |
| Arrays are assigned to using compound assignments of the form
 | |
| @example
 | |
| name=(value@var{1} @dots{} value@var{n})
 | |
| @end example
 | |
| @noindent
 | |
| where each
 | |
| @var{value} is of the form @code{[@var{subscript}]=}@var{string}.
 | |
| Indexed array assignments do not require the bracket and subscript.
 | |
| When assigning to indexed arrays, if
 | |
| the optional subscript is supplied, that index is assigned to;
 | |
| otherwise the index of the element assigned is the last index assigned
 | |
| to by the statement plus one.  Indexing starts at zero.
 | |
| 
 | |
| When assigning to an associative array, the subscript is required.
 | |
| 
 | |
| This syntax is also accepted by the @code{declare}
 | |
| builtin.  Individual array elements may be assigned to using the
 | |
| @code{name[}@var{subscript}@code{]=}@var{value} syntax introduced above.
 | |
| 
 | |
| Any element of an array may be referenced using
 | |
| @code{$@{name[}@var{subscript}@code{]@}}.
 | |
| The braces are required to avoid
 | |
| conflicts with the shell's filename expansion operators.  If the
 | |
| @var{subscript} is @samp{@@} or @samp{*}, the word expands to all members
 | |
| of the array @var{name}.  These subscripts differ only when the word
 | |
| appears within double quotes.
 | |
| If the word is double-quoted,
 | |
| @code{$@{name[*]@}} expands to a single word with
 | |
| the value of each array member separated by the first character of the
 | |
| @env{IFS} variable, and @code{$@{name[@@]@}} expands each element of
 | |
| @var{name} to a separate word.  When there are no array members,
 | |
| @code{$@{name[@@]@}} expands to nothing.
 | |
| If the double-quoted expansion occurs within a word, the expansion of
 | |
| the first parameter is joined with the beginning part of the original
 | |
| word, and the expansion of the last parameter is joined with the last
 | |
| part of the original word.
 | |
| This is analogous to the
 | |
| expansion of the special parameters @samp{@@} and @samp{*}. 
 | |
| @code{$@{#name[}@var{subscript}@code{]@}} expands to the length of
 | |
| @code{$@{name[}@var{subscript}@code{]@}}.
 | |
| If @var{subscript} is @samp{@@} or
 | |
| @samp{*}, the expansion is the number of elements in the array. 
 | |
| Referencing an array variable without a subscript is equivalent to
 | |
| referencing with a subscript of 0. 
 | |
| 
 | |
| An array variable is considered set if a subscript has been assigned a
 | |
| value.  The null string is a valid value.
 | |
| 
 | |
| The @code{unset} builtin is used to destroy arrays.
 | |
| @code{unset} @var{name}[@var{subscript}]
 | |
| destroys the array element at index @var{subscript}.
 | |
| Care must be taken to avoid unwanted side effects caused by filename
 | |
| expansion.
 | |
| @code{unset} @var{name}, where @var{name} is an array, removes the
 | |
| entire array. A subscript of @samp{*} or @samp{@@} also removes the
 | |
| entire array.
 | |
| 
 | |
| The @code{declare}, @code{local}, and @code{readonly}
 | |
| builtins each accept a @option{-a} option to specify an indexed
 | |
| array and a @option{-A} option to specify an associative array.
 | |
| If both options are supplied, @option{-A} takes precedence.
 | |
| The @code{read} builtin accepts a @option{-a}
 | |
| option to assign a list of words read from the standard input
 | |
| to an array, and can read values from the standard input into
 | |
| individual array elements.  The @code{set} and @code{declare}
 | |
| builtins display array values in a way that allows them to be
 | |
| reused as input.
 | |
| 
 | |
| @node The Directory Stack
 | |
| @section The Directory Stack
 | |
| @cindex directory stack
 | |
| 
 | |
| @menu
 | |
| * Directory Stack Builtins::		Bash builtin commands to manipulate
 | |
| 					the directory stack.
 | |
| @end menu
 | |
| 
 | |
| The directory stack is a list of recently-visited directories.  The
 | |
| @code{pushd} builtin adds directories to the stack as it changes
 | |
| the current directory, and the @code{popd} builtin removes specified
 | |
| directories from the stack and changes the current directory to
 | |
| the directory removed.  The @code{dirs} builtin displays the contents
 | |
| of the directory stack.
 | |
| 
 | |
| The contents of the directory stack are also visible
 | |
| as the value of the @env{DIRSTACK} shell variable.
 | |
| 
 | |
| @node Directory Stack Builtins
 | |
| @subsection Directory Stack Builtins
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item dirs
 | |
| @btindex dirs
 | |
| @example
 | |
| dirs [+@var{N} | -@var{N}] [-clpv]
 | |
| @end example
 | |
| Display the list of currently remembered directories.  Directories
 | |
| are added to the list with the @code{pushd} command; the
 | |
| @code{popd} command removes directories from the list.
 | |
| @table @code
 | |
| @item +@var{N}
 | |
| Displays the @var{N}th directory (counting from the left of the
 | |
| list printed by @code{dirs} when invoked without options), starting
 | |
| with zero.
 | |
| @item -@var{N}
 | |
| Displays the @var{N}th directory (counting from the right of the
 | |
| list printed by @code{dirs} when invoked without options), starting
 | |
| with zero.
 | |
| @item -c
 | |
| Clears the directory stack by deleting all of the elements.
 | |
| @item -l
 | |
| Produces a longer listing; the default listing format uses a 
 | |
| tilde to denote the home directory.
 | |
| @item -p
 | |
| Causes @code{dirs} to print the directory stack with one entry per
 | |
| line.
 | |
| @item -v
 | |
| Causes @code{dirs} to print the directory stack with one entry per
 | |
| line, prefixing each entry with its index in the stack.
 | |
| @end table
 | |
| 
 | |
| @item popd
 | |
| @btindex popd
 | |
| @example
 | |
| popd [+@var{N} | -@var{N}] [-n]
 | |
| @end example
 | |
| 
 | |
| Remove the top entry from the directory stack, and @code{cd}
 | |
| to the new top directory.
 | |
| When no arguments are given, @code{popd}
 | |
| removes the top directory from the stack and
 | |
| performs a @code{cd} to the new top directory.  The
 | |
| elements are numbered from 0 starting at the first directory listed with
 | |
| @code{dirs}; i.e., @code{popd} is equivalent to @code{popd +0}.
 | |
| @table @code
 | |
| @item +@var{N}
 | |
| Removes the @var{N}th directory (counting from the left of the
 | |
| list printed by @code{dirs}), starting with zero.
 | |
| @item -@var{N}
 | |
| Removes the @var{N}th directory (counting from the right of the
 | |
| list printed by @code{dirs}), starting with zero.
 | |
| @item -n
 | |
| Suppresses the normal change of directory when removing directories
 | |
| from the stack, so that only the stack is manipulated.
 | |
| @end table
 | |
| 
 | |
| @btindex pushd
 | |
| @item pushd
 | |
| @example
 | |
| pushd [-n] [@var{+N} | @var{-N} | @var{dir} ]
 | |
| @end example
 | |
| 
 | |
| Save the current directory on the top of the directory stack
 | |
| and then @code{cd} to @var{dir}.
 | |
| With no arguments, @code{pushd} exchanges the top two directories.
 | |
| 
 | |
| @table @code
 | |
| @item -n
 | |
| Suppresses the normal change of directory when adding directories
 | |
| to the stack, so that only the stack is manipulated.
 | |
| @item +@var{N}
 | |
| Brings the @var{N}th directory (counting from the left of the
 | |
| list printed by @code{dirs}, starting with zero) to the top of
 | |
| the list by rotating the stack.
 | |
| @item -@var{N}
 | |
| Brings the @var{N}th directory (counting from the right of the
 | |
| list printed by @code{dirs}, starting with zero) to the top of
 | |
| the list by rotating the stack.
 | |
| @item @var{dir}
 | |
| Makes the current working directory be the top of the stack, and then
 | |
| executes the equivalent of `@code{cd} @var{dir}'.
 | |
| @code{cd}s to @var{dir}.
 | |
| @end table
 | |
| 
 | |
| @end table
 | |
| 
 | |
| @node Printing a Prompt
 | |
| @section Controlling the Prompt
 | |
| @cindex prompting
 | |
| 
 | |
| The value of the variable @env{PROMPT_COMMAND} is examined just before
 | |
| Bash prints each primary prompt.  If @env{PROMPT_COMMAND} is set and
 | |
| has a non-null value, then the
 | |
| value is executed just as if it had been typed on the command line.
 | |
| 
 | |
| In addition, the following table describes the special characters which
 | |
| can appear in the prompt variables:
 | |
| 
 | |
| @table @code
 | |
| @item \a
 | |
| A bell character.
 | |
| @item \d
 | |
| The date, in "Weekday Month Date" format (e.g., "Tue May 26").
 | |
| @item \D@{@var{format}@}
 | |
| The @var{format} is passed to @code{strftime}(3) and the result is inserted
 | |
| into the prompt string; an empty @var{format} results in a locale-specific
 | |
| time representation.  The braces are required.
 | |
| @item \e
 | |
| An escape character.
 | |
| @item \h
 | |
| The hostname, up to the first `.'.
 | |
| @item \H
 | |
| The hostname.
 | |
| @item \j
 | |
| The number of jobs currently managed by the shell.
 | |
| @item \l
 | |
| The basename of the shell's terminal device name.
 | |
| @item \n
 | |
| A newline.
 | |
| @item \r
 | |
| A carriage return.
 | |
| @item \s
 | |
| The name of the shell, the basename of @code{$0} (the portion
 | |
| following the final slash).
 | |
| @item \t
 | |
| The time, in 24-hour HH:MM:SS format.
 | |
| @item \T
 | |
| The time, in 12-hour HH:MM:SS format.
 | |
| @item \@@
 | |
| The time, in 12-hour am/pm format.
 | |
| @item \A
 | |
| The time, in 24-hour HH:MM format.
 | |
| @item \u
 | |
| The username of the current user.
 | |
| @item \v
 | |
| The version of Bash (e.g., 2.00)          
 | |
| @item \V
 | |
| The release of Bash, version + patchlevel (e.g., 2.00.0)
 | |
| @item \w
 | |
| The current working directory, with @env{$HOME} abbreviated with a tilde
 | |
| (uses the @env{$PROMPT_DIRTRIM} variable).
 | |
| @item \W
 | |
| The basename of @env{$PWD}, with @env{$HOME} abbreviated with a tilde.
 | |
| @item \!
 | |
| The history number of this command.
 | |
| @item \#
 | |
| The command number of this command.
 | |
| @item \$
 | |
| If the effective uid is 0, @code{#}, otherwise @code{$}.
 | |
| @item \@var{nnn}
 | |
| The character whose ASCII code is the octal value @var{nnn}.
 | |
| @item \\
 | |
| A backslash.
 | |
| @item \[
 | |
| Begin a sequence of non-printing characters.  This could be used to
 | |
| embed a terminal control sequence into the prompt.
 | |
| @item \]
 | |
| End a sequence of non-printing characters.
 | |
| @end table
 | |
| 
 | |
| The command number and the history number are usually different:
 | |
| the history number of a command is its position in the history
 | |
| list, which may include commands restored from the history file
 | |
| (@pxref{Bash History Facilities}), while the command number is
 | |
| the position in the sequence of commands executed during the current
 | |
| shell session.
 | |
| 
 | |
| After the string is decoded, it is expanded via
 | |
| parameter expansion, command substitution, arithmetic
 | |
| expansion, and quote removal, subject to the value of the
 | |
| @code{promptvars} shell option (@pxref{Bash Builtins}).
 | |
| 
 | |
| @node The Restricted Shell
 | |
| @section The Restricted Shell
 | |
| @cindex restricted shell
 | |
| 
 | |
| If Bash is started with the name @code{rbash}, or the
 | |
| @option{--restricted}
 | |
| or
 | |
| @option{-r}
 | |
| option is supplied at invocation, the shell becomes restricted.
 | |
| A restricted shell is used to
 | |
| set up an environment more controlled than the standard shell.
 | |
| A restricted shell behaves identically to @code{bash}
 | |
| with the exception that the following are disallowed or not performed:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| Changing directories with the @code{cd} builtin.
 | |
| @item
 | |
| Setting or unsetting the values of the @env{SHELL}, @env{PATH},
 | |
| @env{ENV}, or @env{BASH_ENV} variables.
 | |
| @item
 | |
| Specifying command names containing slashes.
 | |
| @item
 | |
| Specifying a filename containing a slash as an argument to the @code{.}
 | |
| builtin command.
 | |
| @item
 | |
| Specifying a filename containing a slash as an argument to the @option{-p}
 | |
| option to the @code{hash} builtin command.
 | |
| @item
 | |
| Importing function definitions from the shell environment at startup.
 | |
| @item
 | |
| Parsing the value of @env{SHELLOPTS} from the shell environment at startup.
 | |
| @item
 | |
| Redirecting output using the @samp{>}, @samp{>|}, @samp{<>}, @samp{>&},
 | |
| @samp{&>}, and @samp{>>} redirection operators.
 | |
| @item
 | |
| Using the @code{exec} builtin to replace the shell with another command.
 | |
| @item
 | |
| Adding or deleting builtin commands with the
 | |
| @option{-f} and @option{-d} options to the @code{enable} builtin.
 | |
| @item
 | |
| Using the @code{enable} builtin command to enable disabled shell builtins.
 | |
| @item
 | |
| Specifying the @option{-p} option to the @code{command} builtin.
 | |
| @item
 | |
| Turning off restricted mode with @samp{set +r} or @samp{set +o restricted}.
 | |
| @end itemize
 | |
| 
 | |
| These restrictions are enforced after any startup files are read.
 | |
| 
 | |
| When a command that is found to be a shell script is executed
 | |
| (@pxref{Shell Scripts}), @code{rbash} turns off any restrictions in
 | |
| the shell spawned to execute the script.
 | |
| 
 | |
| @node Bash POSIX Mode
 | |
| @section Bash POSIX Mode
 | |
| @cindex POSIX Mode
 | |
| 
 | |
| Starting Bash with the @option{--posix} command-line option or executing
 | |
| @samp{set -o posix} while Bash is running will cause Bash to conform more
 | |
| closely to the @sc{posix} standard by changing the behavior to
 | |
| match that specified by @sc{posix} in areas where the Bash default differs.
 | |
| 
 | |
| When invoked as @code{sh}, Bash enters @sc{posix} mode after reading the
 | |
| startup files.
 | |
| 
 | |
| The following list is what's changed when `@sc{posix} mode' is in effect:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| When a command in the hash table no longer exists, Bash will re-search
 | |
| @env{$PATH} to find the new location.  This is also available with
 | |
| @samp{shopt -s checkhash}.
 | |
| 
 | |
| @item
 | |
| The message printed by the job control code and builtins when a job
 | |
| exits with a non-zero status is `Done(status)'.
 | |
| 
 | |
| @item
 | |
| The message printed by the job control code and builtins when a job
 | |
| is stopped is `Stopped(@var{signame})', where @var{signame} is, for
 | |
| example, @code{SIGTSTP}.
 | |
| 
 | |
| @item
 | |
| The @code{bg} builtin uses the required format to describe each job placed
 | |
| in the background, which does not include an indication of whether the job
 | |
| is the current or previous job.
 | |
| 
 | |
| @item
 | |
| Reserved words appearing in a context where reserved words are recognized
 | |
| do not undergo alias expansion.
 | |
| 
 | |
| @item
 | |
| The @sc{posix} @env{PS1} and @env{PS2} expansions of @samp{!} to
 | |
| the history number and @samp{!!} to @samp{!} are enabled,
 | |
| and parameter expansion is performed on the values of @env{PS1} and
 | |
| @env{PS2} regardless of the setting of the @code{promptvars} option.
 | |
| 
 | |
| @item
 | |
| The @sc{posix} startup files are executed (@env{$ENV}) rather than
 | |
| the normal Bash files.
 | |
| 
 | |
| @item
 | |
| Tilde expansion is only performed on assignments preceding a command
 | |
| name, rather than on all assignment statements on the line.
 | |
| 
 | |
| @item
 | |
| The default history file is @file{~/.sh_history} (this is the
 | |
| default value of @env{$HISTFILE}).
 | |
| 
 | |
| @item
 | |
| The output of @samp{kill -l} prints all the signal names on a single line,
 | |
| separated by spaces, without the @samp{SIG} prefix.
 | |
| 
 | |
| @item
 | |
| The @code{kill} builtin does not accept signal names with a @samp{SIG}
 | |
| prefix.
 | |
| 
 | |
| @item
 | |
| Non-interactive shells exit if @var{filename} in @code{.} @var{filename}
 | |
| is not found.
 | |
| 
 | |
| @item
 | |
| Non-interactive shells exit if a syntax error in an arithmetic expansion
 | |
| results in an invalid expression.
 | |
| 
 | |
| @item
 | |
| Non-interactive shells exit if there is a syntax error in a script read
 | |
| with the @code{.} or @code{source} builtins, or in a string processed by
 | |
| the @code{eval} builtin.
 | |
| 
 | |
| @item
 | |
| Redirection operators do not perform filename expansion on the word
 | |
| in the redirection unless the shell is interactive.
 | |
| 
 | |
| @item
 | |
| Redirection operators do not perform word splitting on the word in the
 | |
| redirection.
 | |
| 
 | |
| @item
 | |
| Function names must be valid shell @code{name}s.  That is, they may not
 | |
| contain characters other than letters, digits, and underscores, and
 | |
| may not start with a digit.  Declaring a function with an invalid name
 | |
| causes a fatal syntax error in non-interactive shells.
 | |
| 
 | |
| @item
 | |
| @sc{posix} special builtins are found before shell functions
 | |
| during command lookup.
 | |
| 
 | |
| @item
 | |
| The @code{time} reserved word may be used by itself as a command.  When
 | |
| used in this way, it displays timing statistics for the shell and its
 | |
| completed children.  The @env{TIMEFORMAT} variable controls the format
 | |
| of the timing information.
 | |
| 
 | |
| @item
 | |
| When parsing and expanding a $@{@dots{}@} expansion that appears within
 | |
| double quotes, single quotes are no longer special and cannot be used to
 | |
| quote a closing brace or other special character, unless the operator is
 | |
| one of those defined to perform pattern removal.  In this case, they do
 | |
| not have to appear as matched pairs.
 | |
| 
 | |
| @item
 | |
| The parser does not recognize @code{time} as a reserved word if the next
 | |
| token begins with a @samp{-}.
 | |
| 
 | |
| @item
 | |
| If a @sc{posix} special builtin returns an error status, a
 | |
| non-interactive shell exits.  The fatal errors are those listed in
 | |
| the @sc{posix} standard, and include things like passing incorrect options,
 | |
| redirection errors, variable assignment errors for assignments preceding
 | |
| the command name, and so on.
 | |
| 
 | |
| @item
 | |
| A non-interactive shell exits with an error status if a variable
 | |
| assignment error occurs when no command name follows the assignment
 | |
| statements.
 | |
| A variable assignment error occurs, for example, when trying to assign
 | |
| a value to a readonly variable.
 | |
| 
 | |
| @item
 | |
| A non-interactive shell exists with an error status if a variable
 | |
| assignment error occurs in an assignment statement preceding a special
 | |
| builtin, but not with any other simple command.
 | |
| 
 | |
| @item
 | |
| A non-interactive shell exits with an error status if the iteration
 | |
| variable in a @code{for} statement or the selection variable in a
 | |
| @code{select} statement is a readonly variable.
 | |
| 
 | |
| @item
 | |
| Process substitution is not available.
 | |
| 
 | |
| @item
 | |
| Assignment statements preceding @sc{posix} special builtins
 | |
| persist in the shell environment after the builtin completes.
 | |
| 
 | |
| @item
 | |
| Assignment statements preceding shell function calls persist in the
 | |
| shell environment after the function returns, as if a @sc{posix}
 | |
| special builtin command had been executed.
 | |
| 
 | |
| @item
 | |
| The @code{export} and @code{readonly} builtin commands display their
 | |
| output in the format required by @sc{posix}.
 | |
| 
 | |
| @item
 | |
| The @code{trap} builtin displays signal names without the leading
 | |
| @code{SIG}.
 | |
| 
 | |
| @item
 | |
| The @code{trap} builtin doesn't check the first argument for a possible
 | |
| signal specification and revert the signal handling to the original
 | |
| disposition if it is, unless that argument consists solely of digits and
 | |
| is a valid signal number.  If users want to reset the handler for a given
 | |
| signal to the original disposition, they should use @samp{-} as the
 | |
| first argument.
 | |
| 
 | |
| @item
 | |
| The @code{.} and @code{source} builtins do not search the current directory
 | |
| for the filename argument if it is not found by searching @env{PATH}.
 | |
| 
 | |
| @item
 | |
| Subshells spawned to execute command substitutions inherit the value of
 | |
| the @option{-e} option from the parent shell.  When not in @sc{posix} mode,
 | |
| Bash clears the @option{-e} option in such subshells.
 | |
| 
 | |
| @item
 | |
| Alias expansion is always enabled, even in non-interactive shells.
 | |
| 
 | |
| @item
 | |
| When the @code{alias} builtin displays alias definitions, it does not
 | |
| display them with a leading @samp{alias } unless the @option{-p} option
 | |
| is supplied.
 | |
| 
 | |
| @item
 | |
| When the @code{set} builtin is invoked without options, it does not display
 | |
| shell function names and definitions.
 | |
| 
 | |
| @item
 | |
| When the @code{set} builtin is invoked without options, it displays
 | |
| variable values without quotes, unless they contain shell metacharacters,
 | |
| even if the result contains nonprinting characters.
 | |
| 
 | |
| @item
 | |
| When the @code{cd} builtin is invoked in @var{logical} mode, and the pathname
 | |
| constructed from @code{$PWD} and the directory name supplied as an argument
 | |
| does not refer to an existing directory, @code{cd} will fail instead of
 | |
| falling back to @var{physical} mode.
 | |
| 
 | |
| @item
 | |
| The @code{pwd} builtin verifies that the value it prints is the same as the
 | |
| current directory, even if it is not asked to check the file system with the
 | |
| @option{-P} option.
 | |
| 
 | |
| @item
 | |
| When listing the history, the @code{fc} builtin does not include an
 | |
| indication of whether or not a history entry has been modified.
 | |
| 
 | |
| @item
 | |
| The default editor used by @code{fc} is @code{ed}.
 | |
| 
 | |
| @item
 | |
| The @code{type} and @code{command} builtins will not report a non-executable
 | |
| file as having been found, though the shell will attempt to execute such a
 | |
| file if it is the only so-named file found in @code{$PATH}.
 | |
| 
 | |
| @item
 | |
| The @code{vi} editing mode will invoke the @code{vi} editor directly when
 | |
| the @samp{v} command is run, instead of checking @code{$VISUAL} and
 | |
| @code{$EDITOR}.
 | |
| 
 | |
| @item
 | |
| When the @code{xpg_echo} option is enabled, Bash does not attempt to interpret
 | |
| any arguments to @code{echo} as options.  Each argument is displayed, after
 | |
| escape characters are converted.
 | |
| 
 | |
| @item
 | |
| The @code{ulimit} builtin uses a block size of 512 bytes for the @option{-c}
 | |
| and @option{-f} options.
 | |
| 
 | |
| @item
 | |
| The arrival of @code{SIGCHLD}  when a trap is set on @code{SIGCHLD} does
 | |
| not interrupt the @code{wait} builtin and cause it to return immediately.
 | |
| The trap command is run once for each child that exits.
 | |
| 
 | |
| @end enumerate
 | |
| 
 | |
| There is other @sc{posix} behavior that Bash does not implement by
 | |
| default even when in @sc{posix} mode.
 | |
| Specifically:
 | |
| 
 | |
| @enumerate
 | |
| 
 | |
| @item
 | |
| The @code{fc} builtin checks @code{$EDITOR} as a program to edit history
 | |
| entries if @code{FCEDIT} is unset, rather than defaulting directly to
 | |
| @code{ed}.  @code{fc} uses @code{ed} if @code{EDITOR} is unset.
 | |
| 
 | |
| @item
 | |
| As noted above, Bash requires the @code{xpg_echo} option to be enabled for
 | |
| the @code{echo} builtin to be fully conformant.
 | |
| 
 | |
| @end enumerate
 | |
| 
 | |
| Bash can be configured to be @sc{posix}-conformant by default, by specifying
 | |
| the @option{--enable-strict-posix-default} to @code{configure} when building
 | |
| (@pxref{Optional Features}).
 | |
| 
 | |
| @node Job Control
 | |
| @chapter Job Control
 | |
| 
 | |
| This chapter discusses what job control is, how it works, and how
 | |
| Bash allows you to access its facilities.
 | |
| 
 | |
| @menu
 | |
| * Job Control Basics::		How job control works.
 | |
| * Job Control Builtins::	Bash builtin commands used to interact
 | |
| 				with job control.
 | |
| * Job Control Variables::	Variables Bash uses to customize job
 | |
| 				control.
 | |
| @end menu
 | |
| 
 | |
| @node Job Control Basics
 | |
| @section Job Control Basics
 | |
| @cindex job control
 | |
| @cindex foreground
 | |
| @cindex background
 | |
| @cindex suspending jobs
 | |
| 
 | |
| Job control
 | |
| refers to the ability to selectively stop (suspend)
 | |
| the execution of processes and continue (resume)
 | |
| their execution at a later point.  A user typically employs
 | |
| this facility via an interactive interface supplied jointly
 | |
| by the operating system kernel's terminal driver and Bash.
 | |
| 
 | |
| The shell associates a @var{job} with each pipeline.  It keeps a
 | |
| table of currently executing jobs, which may be listed with the
 | |
| @code{jobs} command.  When Bash starts a job
 | |
| asynchronously, it prints a line that looks
 | |
| like:
 | |
| @example
 | |
| [1] 25647
 | |
| @end example
 | |
| @noindent
 | |
| indicating that this job is job number 1 and that the process @sc{id}
 | |
| of the last process in the pipeline associated with this job is
 | |
| 25647.  All of the processes in a single pipeline are members of
 | |
| the same job.  Bash uses the @var{job} abstraction as the
 | |
| basis for job control. 
 | |
| 
 | |
| To facilitate the implementation of the user interface to job
 | |
| control, the operating system maintains the notion of a current terminal
 | |
| process group @sc{id}.  Members of this process group (processes whose
 | |
| process group @sc{id} is equal to the current terminal process group
 | |
| @sc{id}) receive keyboard-generated signals such as @code{SIGINT}. 
 | |
| These processes are said to be in the foreground.  Background
 | |
| processes are those whose process group @sc{id} differs from the
 | |
| terminal's; such processes are immune to keyboard-generated
 | |
| signals.  Only foreground processes are allowed to read from or, if
 | |
| the user so specifies with @code{stty tostop}, write to the terminal.
 | |
| Background processes which attempt to
 | |
| read from (write to when @code{stty tostop} is in effect) the
 | |
| terminal are sent a @code{SIGTTIN} (@code{SIGTTOU})
 | |
| signal by the kernel's terminal driver,
 | |
| which, unless caught, suspends the process. 
 | |
| 
 | |
| If the operating system on which Bash is running supports
 | |
| job control, Bash contains facilities to use it.  Typing the
 | |
| @var{suspend} character (typically @samp{^Z}, Control-Z) while a
 | |
| process is running causes that process to be stopped and returns
 | |
| control to Bash.  Typing the @var{delayed suspend} character
 | |
| (typically @samp{^Y}, Control-Y) causes the process to be stopped
 | |
| when it attempts to read input from the terminal, and control to
 | |
| be returned to Bash.  The user then manipulates the state of
 | |
| this job, using the @code{bg} command to continue it in the
 | |
| background, the @code{fg} command to continue it in the
 | |
| foreground, or the @code{kill} command to kill it.  A @samp{^Z}
 | |
| takes effect immediately, and has the additional side effect of
 | |
| causing pending output and typeahead to be discarded. 
 | |
| 
 | |
| There are a number of ways to refer to a job in the shell.  The
 | |
| character @samp{%} introduces a job specification (@var{jobspec}).
 | |
| 
 | |
| Job number @code{n} may be referred to as @samp{%n}.
 | |
| The symbols @samp{%%} and  @samp{%+} refer to the shell's notion of the
 | |
| current job, which is the last job stopped while it was in the foreground
 | |
| or started in the background.
 | |
| A single @samp{%} (with no accompanying job specification) also refers
 | |
| to the current job.
 | |
| The previous job may be referenced using @samp{%-}.
 | |
| If there is only a single job, @samp{%+} and @samp{%-} can both be used
 | |
| to refer to that job.
 | |
| In output pertaining to jobs (e.g., the output of the @code{jobs}
 | |
| command), the current job is always flagged with a @samp{+}, and the
 | |
| previous job with a @samp{-}. 
 | |
| 
 | |
| A job may also be referred to
 | |
| using a prefix of the name used to start it, or using a substring
 | |
| that appears in its command line.  For example, @samp{%ce} refers
 | |
| to a stopped @code{ce} job. Using @samp{%?ce}, on the
 | |
| other hand, refers to any job containing the string @samp{ce} in
 | |
| its command line.  If the prefix or substring matches more than one job,
 | |
| Bash reports an error.
 | |
| 
 | |
| Simply naming a job can be used to bring it into the foreground:
 | |
| @samp{%1} is a synonym for @samp{fg %1}, bringing job 1 from the
 | |
| background into the foreground.  Similarly, @samp{%1 &} resumes
 | |
| job 1 in the background, equivalent to @samp{bg %1}
 | |
| 
 | |
| The shell learns immediately whenever a job changes state. 
 | |
| Normally, Bash waits until it is about to print a prompt
 | |
| before reporting changes in a job's status so as to not interrupt
 | |
| any other output.
 | |
| If the @option{-b} option to the @code{set} builtin is enabled,
 | |
| Bash reports such changes immediately (@pxref{The Set Builtin}).
 | |
| Any trap on @code{SIGCHLD} is executed for each child process
 | |
| that exits.
 | |
| 
 | |
| If an attempt to exit Bash is made while jobs are stopped, (or running, if
 | |
| the @code{checkjobs} option is enabled -- see @ref{The Shopt Builtin}), the
 | |
| shell prints a warning message, and if the @code{checkjobs} option is
 | |
| enabled, lists the jobs and their statuses.
 | |
| The @code{jobs} command may then be used to inspect their status.
 | |
| If a second attempt to exit is made without an intervening command,
 | |
| Bash does not print another warning, and any stopped jobs are terminated.
 | |
| 
 | |
| @node Job Control Builtins
 | |
| @section Job Control Builtins
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item bg
 | |
| @btindex bg
 | |
| @example
 | |
| bg [@var{jobspec} @dots{}]
 | |
| @end example
 | |
| Resume each suspended job @var{jobspec} in the background, as if it
 | |
| had been started with @samp{&}.
 | |
| If @var{jobspec} is not supplied, the current job is used.
 | |
| The return status is zero unless it is run when job control is not
 | |
| enabled, or, when run with job control enabled, any
 | |
| @var{jobspec} was not found or specifies a job
 | |
| that was started without job control.
 | |
| 
 | |
| @item fg
 | |
| @btindex fg
 | |
| @example
 | |
| fg [@var{jobspec}]
 | |
| @end example
 | |
| Resume the job @var{jobspec} in the foreground and make it the current job.
 | |
| If @var{jobspec} is not supplied, the current job is used.
 | |
| The return status is that of the command placed into the foreground,
 | |
| or non-zero if run when job control is disabled or, when run with
 | |
| job control enabled, @var{jobspec} does not specify a valid job or
 | |
| @var{jobspec} specifies a job that was started without job control.
 | |
| 
 | |
| @item jobs
 | |
| @btindex jobs
 | |
| @example
 | |
| jobs [-lnprs] [@var{jobspec}]
 | |
| jobs -x @var{command} [@var{arguments}]
 | |
| @end example
 | |
| 
 | |
| The first form lists the active jobs.  The options have the
 | |
| following meanings:
 | |
| 
 | |
| @table @code
 | |
| @item -l
 | |
| List process @sc{id}s in addition to the normal information.
 | |
| 
 | |
| @item -n
 | |
| Display information only about jobs that have changed status since
 | |
| the user was last notified of their status.
 | |
| 
 | |
| @item -p
 | |
| List only the process @sc{id} of the job's process group leader.
 | |
| 
 | |
| @item -r
 | |
| Restrict output to running jobs.
 | |
| 
 | |
| @item -s
 | |
| Restrict output to stopped jobs.
 | |
| @end table
 | |
| 
 | |
| If @var{jobspec} is given,
 | |
| output is restricted to information about that job. 
 | |
| If @var{jobspec} is not supplied, the status of all jobs is
 | |
| listed.
 | |
| 
 | |
| If the @option{-x} option is supplied, @code{jobs} replaces any
 | |
| @var{jobspec} found in @var{command} or @var{arguments} with the
 | |
| corresponding process group @sc{id}, and executes @var{command},
 | |
| passing it @var{argument}s, returning its exit status. 
 | |
| 
 | |
| @item kill
 | |
| @btindex kill
 | |
| @example
 | |
| kill [-s @var{sigspec}] [-n @var{signum}] [-@var{sigspec}] @var{jobspec} or @var{pid}
 | |
| kill -l [@var{exit_status}]
 | |
| @end example
 | |
| Send a signal specified by @var{sigspec} or @var{signum} to the process
 | |
| named by job specification @var{jobspec} or process @sc{id} @var{pid}.
 | |
| @var{sigspec} is either a case-insensitive signal name such as
 | |
| @code{SIGINT} (with or without the @code{SIG} prefix)
 | |
| or a signal number; @var{signum} is a signal number.
 | |
| If @var{sigspec} and @var{signum} are not present, @code{SIGTERM} is used.
 | |
| The @option{-l} option lists the signal names.
 | |
| If any arguments are supplied when @option{-l} is given, the names of the
 | |
| signals corresponding to the arguments are listed, and the return status
 | |
| is zero.
 | |
| @var{exit_status} is a number specifying a signal number or the exit
 | |
| status of a process terminated by a signal.
 | |
| The return status is zero if at least one signal was successfully sent,
 | |
| or non-zero if an error occurs or an invalid option is encountered.
 | |
| 
 | |
| @item wait
 | |
| @btindex wait
 | |
| @example
 | |
| wait [@var{jobspec} or @var{pid} ...]
 | |
| @end example
 | |
| Wait until the child process specified by each process @sc{id} @var{pid}
 | |
| or job specification @var{jobspec} exits and return the exit status of the
 | |
| last command waited for.
 | |
| If a job spec is given, all processes in the job are waited for.
 | |
| If no arguments are given, all currently active child processes are
 | |
| waited for, and the return status is zero.
 | |
| If neither @var{jobspec} nor @var{pid} specifies an active child process
 | |
| of the shell, the return status is 127.
 | |
| 
 | |
| @item disown
 | |
| @btindex disown
 | |
| @example
 | |
| disown [-ar] [-h] [@var{jobspec} @dots{}]
 | |
| @end example
 | |
| Without options, each @var{jobspec} is removed from the table of
 | |
| active jobs.
 | |
| If the @option{-h} option is given, the job is not removed from the table,
 | |
| but is marked so that @code{SIGHUP} is not sent to the job if the shell
 | |
| receives a @code{SIGHUP}.
 | |
| If @var{jobspec} is not present, and neither the @option{-a} nor @option{-r}
 | |
| option is supplied, the current job is used.
 | |
| If no @var{jobspec} is supplied, the @option{-a} option means to remove or
 | |
| mark all jobs; the @option{-r} option without a @var{jobspec}
 | |
| argument restricts operation to running jobs.
 | |
| 
 | |
| @item suspend
 | |
| @btindex suspend
 | |
| @example
 | |
| suspend [-f]
 | |
| @end example
 | |
| Suspend the execution of this shell until it receives a
 | |
| @code{SIGCONT} signal.
 | |
| A login shell cannot be suspended; the @option{-f}
 | |
| option can be used to override this and force the suspension.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| When job control is not active, the @code{kill} and @code{wait}
 | |
| builtins do not accept @var{jobspec} arguments.  They must be
 | |
| supplied process @sc{id}s.
 | |
| 
 | |
| @node Job Control Variables
 | |
| @section Job Control Variables
 | |
| 
 | |
| @vtable @code
 | |
| 
 | |
| @item auto_resume
 | |
| This variable controls how the shell interacts with the user and
 | |
| job control.  If this variable exists then single word simple
 | |
| commands without redirections are treated as candidates for resumption
 | |
| of an existing job.  There is no ambiguity allowed; if there is
 | |
| more than one job beginning with the string typed, then
 | |
| the most recently accessed job will be selected.
 | |
| The name of a stopped job, in this context, is the command line
 | |
| used to start it.  If this variable is set to the value @samp{exact},
 | |
| the string supplied must match the name of a stopped job exactly;
 | |
| if set to @samp{substring},
 | |
| the string supplied needs to match a substring of the name of a
 | |
| stopped job.  The @samp{substring} value provides functionality
 | |
| analogous to the @samp{%?} job @sc{id} (@pxref{Job Control Basics}).
 | |
| If set to any other value, the supplied string must
 | |
| be a prefix of a stopped job's name; this provides functionality
 | |
| analogous to the @samp{%} job @sc{id}.
 | |
| 
 | |
| @end vtable
 | |
| 
 | |
| @set readline-appendix
 | |
| @set history-appendix
 | |
| @cindex Readline, how to use
 | |
| @include rluser.texi
 | |
| @cindex History, how to use
 | |
| @include hsuser.texi
 | |
| @clear readline-appendix
 | |
| @clear history-appendix
 | |
| 
 | |
| @node Installing Bash
 | |
| @chapter Installing Bash
 | |
| 
 | |
| This chapter provides basic instructions for installing Bash on
 | |
| the various supported platforms.  The distribution supports the
 | |
| @sc{gnu} operating systems, nearly every version of Unix, and several
 | |
| non-Unix systems such as BeOS and Interix.
 | |
| Other independent ports exist for
 | |
| @sc{ms-dos}, @sc{os/2}, and Windows platforms.
 | |
| 
 | |
| @menu
 | |
| * Basic Installation::	Installation instructions.
 | |
| * Compilers and Options::	How to set special options for various
 | |
| 				systems.
 | |
| * Compiling For Multiple Architectures::	How to compile Bash for more
 | |
| 						than one kind of system from
 | |
| 						the same source tree.
 | |
| * Installation Names::	How to set the various paths used by the installation.
 | |
| * Specifying the System Type::	How to configure Bash for a particular system.
 | |
| * Sharing Defaults::	How to share default configuration values among GNU
 | |
| 			programs.
 | |
| * Operation Controls::	Options recognized by the configuration program.
 | |
| * Optional Features::	How to enable and disable optional features when
 | |
| 			building Bash.
 | |
| @end menu
 | |
| 
 | |
| @node Basic Installation
 | |
| @section Basic Installation
 | |
| @cindex installation
 | |
| @cindex configuration
 | |
| @cindex Bash installation
 | |
| @cindex Bash configuration
 | |
| 
 | |
| These are installation instructions for Bash.
 | |
| 
 | |
| The simplest way to compile Bash is:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| @code{cd} to the directory containing the source code and type
 | |
| @samp{./configure} to configure Bash for your system.  If you're
 | |
| using @code{csh} on an old version of System V, you might need to
 | |
| type @samp{sh ./configure} instead to prevent @code{csh} from trying
 | |
| to execute @code{configure} itself.
 | |
| 
 | |
| Running @code{configure} takes some time.
 | |
| While running, it prints messages telling which features it is
 | |
| checking for.
 | |
| 
 | |
| @item
 | |
| Type @samp{make} to compile Bash and build the @code{bashbug} bug
 | |
| reporting script.
 | |
| 
 | |
| @item
 | |
| Optionally, type @samp{make tests} to run the Bash test suite.
 | |
| 
 | |
| @item
 | |
| Type @samp{make install} to install @code{bash} and @code{bashbug}.
 | |
| This will also install the manual pages and Info file.
 | |
| 
 | |
| @end enumerate
 | |
| 
 | |
| The @code{configure} shell script attempts to guess correct
 | |
| values for various system-dependent variables used during
 | |
| compilation.  It uses those values to create a @file{Makefile} in
 | |
| each directory of the package (the top directory, the
 | |
| @file{builtins}, @file{doc}, and @file{support} directories,
 | |
| each directory under @file{lib}, and several others).  It also creates a
 | |
| @file{config.h} file containing system-dependent definitions. 
 | |
| Finally, it creates a shell script named @code{config.status} that you
 | |
| can run in the future to recreate the current configuration, a
 | |
| file @file{config.cache} that saves the results of its tests to
 | |
| speed up reconfiguring, and a file @file{config.log} containing
 | |
| compiler output (useful mainly for debugging @code{configure}). 
 | |
| If at some point
 | |
| @file{config.cache} contains results you don't want to keep, you
 | |
| may remove or edit it. 
 | |
| 
 | |
| To find out more about the options and arguments that the
 | |
| @code{configure} script understands, type 
 | |
| 
 | |
| @example
 | |
| bash-2.04$ ./configure --help
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| at the Bash prompt in your Bash source directory.
 | |
| 
 | |
| If you need to do unusual things to compile Bash, please
 | |
| try to figure out how @code{configure} could check whether or not
 | |
| to do them, and mail diffs or instructions to
 | |
| @email{bash-maintainers@@gnu.org} so they can be
 | |
| considered for the next release.
 | |
| 
 | |
| The file @file{configure.in} is used to create @code{configure}
 | |
| by a program called Autoconf.  You only need
 | |
| @file{configure.in} if you want to change it or regenerate
 | |
| @code{configure} using a newer version of Autoconf.  If
 | |
| you do this, make sure you are using Autoconf version 2.50 or
 | |
| newer.
 | |
| 
 | |
| You can remove the program binaries and object files from the
 | |
| source code directory by typing @samp{make clean}.  To also remove the
 | |
| files that @code{configure} created (so you can compile Bash for
 | |
| a different kind of computer), type @samp{make distclean}.
 | |
| 
 | |
| @node Compilers and Options
 | |
| @section Compilers and Options
 | |
| 
 | |
| Some systems require unusual options for compilation or linking
 | |
| that the @code{configure} script does not know about.  You can
 | |
| give @code{configure} initial values for variables by setting
 | |
| them in the environment.  Using a Bourne-compatible shell, you
 | |
| can do that on the command line like this:
 | |
| 
 | |
| @example
 | |
| CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
 | |
| @end example
 | |
| 
 | |
| On systems that have the @code{env} program, you can do it like this:
 | |
| 
 | |
| @example
 | |
| env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
 | |
| @end example
 | |
| 
 | |
| The configuration process uses GCC to build Bash if it
 | |
| is available.
 | |
| 
 | |
| @node Compiling For Multiple Architectures
 | |
| @section Compiling For Multiple Architectures
 | |
| 
 | |
| You can compile Bash for more than one kind of computer at the
 | |
| same time, by placing the object files for each architecture in their
 | |
| own directory.  To do this, you must use a version of @code{make} that
 | |
| supports the @code{VPATH} variable, such as GNU @code{make}.
 | |
| @code{cd} to the
 | |
| directory where you want the object files and executables to go and run
 | |
| the @code{configure} script from the source directory.  You may need to
 | |
| supply the @option{--srcdir=PATH} argument to tell @code{configure} where the
 | |
| source files are.  @code{configure} automatically checks for the
 | |
| source code in the directory that @code{configure} is in and in `..'.
 | |
| 
 | |
| If you have to use a @code{make} that does not supports the @code{VPATH}
 | |
| variable, you can compile Bash for one architecture at a
 | |
| time in the source code directory.  After you have installed
 | |
| Bash for one architecture, use @samp{make distclean} before
 | |
| reconfiguring for another architecture.
 | |
| 
 | |
| Alternatively, if your system supports symbolic links, you can use the
 | |
| @file{support/mkclone} script to create a build tree which has
 | |
| symbolic links back to each file in the source directory.  Here's an
 | |
| example that creates a build directory in the current directory from a
 | |
| source directory @file{/usr/gnu/src/bash-2.0}:
 | |
| 
 | |
| @example
 | |
| bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| The @code{mkclone} script requires Bash, so you must have already built
 | |
| Bash for at least one architecture before you can create build
 | |
| directories for other architectures.
 | |
| 
 | |
| @node Installation Names
 | |
| @section Installation Names
 | |
| 
 | |
| By default, @samp{make install} will install into
 | |
| @file{/usr/local/bin}, @file{/usr/local/man}, etc.  You can
 | |
| specify an installation prefix other than @file{/usr/local} by
 | |
| giving @code{configure} the option @option{--prefix=@var{PATH}},
 | |
| or by specifying a value for the @code{DESTDIR} @samp{make}
 | |
| variable when running @samp{make install}.
 | |
| 
 | |
| You can specify separate installation prefixes for
 | |
| architecture-specific files and architecture-independent files. 
 | |
| If you give @code{configure} the option
 | |
| @option{--exec-prefix=@var{PATH}}, @samp{make install} will use
 | |
| @var{PATH} as the prefix for installing programs and libraries.
 | |
| Documentation and other data files will still use the regular prefix. 
 | |
| 
 | |
| @node Specifying the System Type
 | |
| @section Specifying the System Type
 | |
| 
 | |
| There may be some features @code{configure} can not figure out
 | |
| automatically, but need to determine by the type of host Bash
 | |
| will run on.  Usually @code{configure} can figure that
 | |
| out, but if it prints a message saying it can not guess the host
 | |
| type, give it the @option{--host=TYPE} option.  @samp{TYPE} can
 | |
| either be a short name for the system type, such as @samp{sun4},
 | |
| or a canonical name with three fields: @samp{CPU-COMPANY-SYSTEM}
 | |
| (e.g., @samp{i386-unknown-freebsd4.2}).
 | |
| 
 | |
| See the file @file{support/config.sub} for the possible
 | |
| values of each field. 
 | |
| 
 | |
| @node Sharing Defaults
 | |
| @section Sharing Defaults
 | |
| 
 | |
| If you want to set default values for @code{configure} scripts to
 | |
| share, you can create a site shell script called
 | |
| @code{config.site} that gives default values for variables like
 | |
| @code{CC}, @code{cache_file}, and @code{prefix}.  @code{configure}
 | |
| looks for @file{PREFIX/share/config.site} if it exists, then
 | |
| @file{PREFIX/etc/config.site} if it exists.  Or, you can set the
 | |
| @code{CONFIG_SITE} environment variable to the location of the site
 | |
| script.  A warning: the Bash @code{configure} looks for a site script,
 | |
| but not all @code{configure} scripts do.
 | |
| 
 | |
| @node Operation Controls
 | |
| @section Operation Controls
 | |
| 
 | |
| @code{configure} recognizes the following options to control how it
 | |
| operates.
 | |
| 
 | |
| @table @code
 | |
| 
 | |
| @item --cache-file=@var{file}
 | |
| Use and save the results of the tests in
 | |
| @var{file} instead of @file{./config.cache}.  Set @var{file} to
 | |
| @file{/dev/null} to disable caching, for debugging
 | |
| @code{configure}. 
 | |
| 
 | |
| @item --help
 | |
| Print a summary of the options to @code{configure}, and exit.
 | |
| 
 | |
| @item --quiet
 | |
| @itemx --silent
 | |
| @itemx -q
 | |
| Do not print messages saying which checks are being made.
 | |
| 
 | |
| @item --srcdir=@var{dir}
 | |
| Look for the Bash source code in directory @var{dir}.  Usually
 | |
| @code{configure} can determine that directory automatically.
 | |
| 
 | |
| @item --version
 | |
| Print the version of Autoconf used to generate the @code{configure}
 | |
| script, and exit.
 | |
| @end table
 | |
| 
 | |
| @code{configure} also accepts some other, not widely used, boilerplate
 | |
| options.  @samp{configure --help} prints the complete list.
 | |
| 
 | |
| @node Optional Features
 | |
| @section Optional Features
 | |
| 
 | |
| The Bash @code{configure} has a number of @option{--enable-@var{feature}}
 | |
| options, where @var{feature} indicates an optional part of Bash.
 | |
| There are also several @option{--with-@var{package}} options,
 | |
| where @var{package} is something like @samp{bash-malloc} or @samp{purify}.
 | |
| To turn off the default use of a package, use
 | |
| @option{--without-@var{package}}.  To configure Bash without a feature
 | |
| that is enabled by default, use @option{--disable-@var{feature}}.
 | |
| 
 | |
| Here is a complete list of the @option{--enable-} and
 | |
| @option{--with-} options that the Bash @code{configure} recognizes. 
 | |
| 
 | |
| @table @code
 | |
| @item --with-afs
 | |
| Define if you are using the Andrew File System from Transarc.
 | |
| 
 | |
| @item --with-bash-malloc
 | |
| Use the Bash version of
 | |
| @code{malloc} in the directory @file{lib/malloc}.  This is not the same
 | |
| @code{malloc} that appears in @sc{gnu} libc, but an older version
 | |
| originally derived from the 4.2 @sc{bsd} @code{malloc}.  This @code{malloc}
 | |
| is very fast, but wastes some space on each allocation.
 | |
| This option is enabled by default.
 | |
| The @file{NOTES} file contains a list of systems for
 | |
| which this should be turned off, and @code{configure} disables this
 | |
| option automatically for a number of systems.
 | |
| 
 | |
| @item --with-curses
 | |
| Use the curses library instead of the termcap library.  This should
 | |
| be supplied if your system has an inadequate or incomplete termcap
 | |
| database.
 | |
| 
 | |
| @item --with-gnu-malloc
 | |
| A synonym for @code{--with-bash-malloc}.
 | |
| 
 | |
| @item --with-installed-readline[=@var{PREFIX}]
 | |
| Define this to make Bash link with a locally-installed version of Readline
 | |
| rather than the version in @file{lib/readline}.  This works only with
 | |
| Readline 5.0 and later versions.  If @var{PREFIX} is @code{yes} or not
 | |
| supplied, @code{configure} uses the values of the make variables
 | |
| @code{includedir} and @code{libdir}, which are subdirectories of @code{prefix}
 | |
| by default, to find the installed version of Readline if it is not in
 | |
| the standard system include and library directories.
 | |
| If @var{PREFIX} is @code{no}, Bash links with the version in
 | |
| @file{lib/readline}.
 | |
| If @var{PREFIX} is set to any other value, @code{configure} treats it as
 | |
| a directory pathname and looks for
 | |
| the installed version of Readline in subdirectories of that directory
 | |
| (include files in @var{PREFIX}/@code{include} and the library in
 | |
| @var{PREFIX}/@code{lib}).
 | |
| 
 | |
| @item --with-purify
 | |
| Define this to use the Purify memory allocation checker from Rational
 | |
| Software.
 | |
| 
 | |
| @item --enable-minimal-config
 | |
| This produces a shell with minimal features, close to the historical
 | |
| Bourne shell.
 | |
| @end table
 | |
| 
 | |
| There are several @option{--enable-} options that alter how Bash is
 | |
| compiled and linked, rather than changing run-time features.
 | |
| 
 | |
| @table @code
 | |
| @item --enable-largefile
 | |
| Enable support for @uref{http://www.sas.com/standards/large_file/x_open.20Mar96.html,
 | |
| large files} if the operating system requires special compiler options
 | |
| to build programs which can access large files.  This is enabled by
 | |
| default, if the operating system provides large file support.
 | |
| 
 | |
| @item --enable-profiling
 | |
| This builds a Bash binary that produces profiling information to be
 | |
| processed by @code{gprof} each time it is executed.
 | |
| 
 | |
| @item --enable-static-link
 | |
| This causes Bash to be linked statically, if @code{gcc} is being used.
 | |
| This could be used to build a version to use as root's shell.
 | |
| @end table
 | |
| 
 | |
| The @samp{minimal-config} option can be used to disable all of
 | |
| the following options, but it is processed first, so individual
 | |
| options may be enabled using @samp{enable-@var{feature}}. 
 | |
| 
 | |
| All of the following options except for @samp{disabled-builtins} and
 | |
| @samp{xpg-echo-default} are
 | |
| enabled by default, unless the operating system does not provide the
 | |
| necessary support.
 | |
| 
 | |
| @table @code
 | |
| @item --enable-alias
 | |
| Allow alias expansion and include the @code{alias} and @code{unalias}
 | |
| builtins (@pxref{Aliases}).
 | |
| 
 | |
| @item --enable-arith-for-command
 | |
| Include support for the alternate form of the @code{for} command
 | |
| that behaves like the C language @code{for} statement
 | |
| (@pxref{Looping Constructs}).
 | |
| 
 | |
| @item --enable-array-variables
 | |
| Include support for one-dimensional array shell variables
 | |
| (@pxref{Arrays}).
 | |
| 
 | |
| @item --enable-bang-history
 | |
| Include support for @code{csh}-like history substitution
 | |
| (@pxref{History Interaction}).
 | |
| 
 | |
| @item --enable-brace-expansion
 | |
| Include @code{csh}-like brace expansion
 | |
| ( @code{b@{a,b@}c} @expansion{} @code{bac bbc} ).
 | |
| See @ref{Brace Expansion}, for a complete description.
 | |
| 
 | |
| @item --enable-casemod-attributes
 | |
| Include support for case-modifying attributes in the @code{declare} builtin
 | |
| and assignment statements.  Variables with the @var{uppercase} attribute,
 | |
| for example, will have their values converted to uppercase upon assignment.
 | |
| 
 | |
| @item --enable-casemod-expansion
 | |
| Include support for case-modifying word expansions.
 | |
| 
 | |
| @item --enable-command-timing
 | |
| Include support for recognizing @code{time} as a reserved word and for
 | |
| displaying timing statistics for the pipeline following @code{time}
 | |
| (@pxref{Pipelines}).
 | |
| This allows pipelines as well as shell builtins and functions to be timed.
 | |
| 
 | |
| @item --enable-cond-command
 | |
| Include support for the @code{[[} conditional command.
 | |
| (@pxref{Conditional Constructs}).
 | |
| 
 | |
| @item --enable-cond-regexp
 | |
| Include support for matching @sc{posix} regular expressions using the
 | |
| @samp{=~} binary operator in the @code{[[} conditional command.
 | |
| (@pxref{Conditional Constructs}).
 | |
| 
 | |
| @item --enable-coprocesses
 | |
| Include support for coprocesses and the @code{coproc} reserved word
 | |
| (@pxref{Pipelines}).
 | |
| 
 | |
| @item --enable-debugger
 | |
| Include support for the bash debugger (distributed separately).
 | |
| 
 | |
| @item --enable-directory-stack
 | |
| Include support for a @code{csh}-like directory stack and the
 | |
| @code{pushd}, @code{popd}, and @code{dirs} builtins
 | |
| (@pxref{The Directory Stack}).
 | |
| 
 | |
| @item --enable-disabled-builtins
 | |
| Allow builtin commands to be invoked via @samp{builtin xxx}
 | |
| even after @code{xxx} has been disabled using @samp{enable -n xxx}.
 | |
| See @ref{Bash Builtins}, for details of the @code{builtin} and
 | |
| @code{enable} builtin commands.
 | |
| 
 | |
| @item --enable-dparen-arithmetic
 | |
| Include support for the @code{((@dots{}))} command
 | |
| (@pxref{Conditional Constructs}).
 | |
| 
 | |
| @item --enable-extended-glob
 | |
| Include support for the extended pattern matching features described
 | |
| above under @ref{Pattern Matching}.
 | |
| 
 | |
| @item --enable-extended-glob-default
 | |
| Set the default value of the @var{extglob} shell option described
 | |
| above under @ref{The Shopt Builtin} to be enabled.
 | |
| 
 | |
| @item --enable-help-builtin
 | |
| Include the @code{help} builtin, which displays help on shell builtins and
 | |
| variables (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item --enable-history
 | |
| Include command history and the @code{fc} and @code{history}
 | |
| builtin commands (@pxref{Bash History Facilities}).
 | |
| 
 | |
| @item --enable-job-control
 | |
| This enables the job control features (@pxref{Job Control}),
 | |
| if the operating system supports them.
 | |
| 
 | |
| @item --enable-multibyte
 | |
| This enables support for multibyte characters if the operating
 | |
| system provides the necessary support.
 | |
| 
 | |
| @item --enable-net-redirections
 | |
| This enables the special handling of filenames of the form
 | |
| @code{/dev/tcp/@var{host}/@var{port}} and
 | |
| @code{/dev/udp/@var{host}/@var{port}}
 | |
| when used in redirections (@pxref{Redirections}).
 | |
| 
 | |
| @item --enable-process-substitution
 | |
| This enables process substitution (@pxref{Process Substitution}) if
 | |
| the operating system provides the necessary support.
 | |
| 
 | |
| @item --enable-progcomp
 | |
| Enable the programmable completion facilities
 | |
| (@pxref{Programmable Completion}).
 | |
| If Readline is not enabled, this option has no effect.
 | |
| 
 | |
| @item --enable-prompt-string-decoding
 | |
| Turn on the interpretation of a number of backslash-escaped characters
 | |
| in the @env{$PS1}, @env{$PS2}, @env{$PS3}, and @env{$PS4} prompt
 | |
| strings.  See @ref{Printing a Prompt}, for a complete list of prompt
 | |
| string escape sequences.
 | |
| 
 | |
| @item --enable-readline
 | |
| Include support for command-line editing and history with the Bash
 | |
| version of the Readline library (@pxref{Command Line Editing}).
 | |
| 
 | |
| @item --enable-restricted
 | |
| Include support for a @dfn{restricted shell}.  If this is enabled, Bash,
 | |
| when called as @code{rbash}, enters a restricted mode.  See
 | |
| @ref{The Restricted Shell}, for a description of restricted mode.
 | |
| 
 | |
| @item --enable-select
 | |
| Include the @code{select} compound command, which allows the generation of
 | |
| simple menus (@pxref{Conditional Constructs}).
 | |
| 
 | |
| @item --enable-separate-helpfiles
 | |
| Use external files for the documentation displayed by the @code{help} builtin
 | |
| instead of storing the text internally.
 | |
| 
 | |
| @item --enable-single-help-strings
 | |
| Store the text displayed by the @code{help} builtin as a single string for
 | |
| each help topic.  This aids in translating the text to different languages.
 | |
| You may need to disable this if your compiler cannot handle very long string
 | |
| literals.
 | |
| 
 | |
| @item --enable-strict-posix-default
 | |
| Make Bash @sc{posix}-conformant by default (@pxref{Bash POSIX Mode}).
 | |
| 
 | |
| @item --enable-usg-echo-default
 | |
| A synonym for @code{--enable-xpg-echo-default}.
 | |
| 
 | |
| @item --enable-xpg-echo-default
 | |
| Make the @code{echo} builtin expand backslash-escaped characters by default,
 | |
| without requiring the @option{-e} option.
 | |
| This sets the default value of the @code{xpg_echo} shell option to @code{on},
 | |
| which makes the Bash @code{echo} behave more like the version specified in
 | |
| the Single Unix Specification, version 3.
 | |
| @xref{Bash Builtins}, for a description of the escape sequences that
 | |
| @code{echo} recognizes.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| The file @file{config-top.h} contains C Preprocessor
 | |
| @samp{#define} statements for options which are not settable from
 | |
| @code{configure}.
 | |
| Some of these are not meant to be changed; beware of the consequences if
 | |
| you do.
 | |
| Read the comments associated with each definition for more
 | |
| information about its effect.
 | |
| 
 | |
| @node Reporting Bugs
 | |
| @appendix Reporting Bugs
 | |
| 
 | |
| Please report all bugs you find in Bash.
 | |
| But first, you should
 | |
| make sure that it really is a bug, and that it appears in the latest
 | |
| version of Bash.
 | |
| The latest version of Bash is always available for FTP from
 | |
| @uref{ftp://ftp.gnu.org/pub/gnu/bash/}.
 | |
| 
 | |
| Once you have determined that a bug actually exists, use the
 | |
| @code{bashbug} command to submit a bug report.
 | |
| If you have a fix, you are encouraged to mail that as well!
 | |
| Suggestions and `philosophical' bug reports may be mailed
 | |
| to @email{bug-bash@@gnu.org} or posted to the Usenet
 | |
| newsgroup @code{gnu.bash.bug}.
 | |
| 
 | |
| All bug reports should include:
 | |
| @itemize @bullet
 | |
| @item
 | |
| The version number of Bash.
 | |
| @item
 | |
| The hardware and operating system.
 | |
| @item
 | |
| The compiler used to compile Bash.
 | |
| @item
 | |
| A description of the bug behaviour.
 | |
| @item
 | |
| A short script or `recipe' which exercises the bug and may be used
 | |
| to reproduce it.
 | |
| @end itemize
 | |
| 
 | |
| @noindent
 | |
| @code{bashbug} inserts the first three items automatically into
 | |
| the template it provides for filing a bug report.
 | |
| 
 | |
| Please send all reports concerning this manual to
 | |
| @email{chet.ramey@@case.edu}.
 | |
| 
 | |
| @node Major Differences From The Bourne Shell
 | |
| @appendix Major Differences From The Bourne Shell
 | |
| 
 | |
| Bash implements essentially the same grammar, parameter and
 | |
| variable expansion, redirection, and quoting as the Bourne Shell. 
 | |
| Bash uses the @sc{posix} standard as the specification of
 | |
| how these features are to be implemented.  There are some
 | |
| differences between the traditional Bourne shell and Bash; this
 | |
| section quickly details the differences of significance.  A
 | |
| number of these differences are explained in greater depth in
 | |
| previous sections.
 | |
| This section uses the version of @code{sh} included in SVR4.2 (the
 | |
| last version of the historical Bourne shell) as the baseline reference.
 | |
| 
 | |
| @itemize @bullet
 | |
| 
 | |
| @item
 | |
| Bash is @sc{posix}-conformant, even where the @sc{posix} specification
 | |
| differs from traditional @code{sh} behavior (@pxref{Bash POSIX Mode}).
 | |
| 
 | |
| @item
 | |
| Bash has multi-character invocation options (@pxref{Invoking Bash}).
 | |
| 
 | |
| @item
 | |
| Bash has command-line editing (@pxref{Command Line Editing}) and
 | |
| the @code{bind} builtin.
 | |
| 
 | |
| @item
 | |
| Bash provides a programmable word completion mechanism
 | |
| (@pxref{Programmable Completion}), and builtin commands
 | |
| @code{complete}, @code{compgen}, and @code{compopt}, to
 | |
| manipulate it.
 | |
| 
 | |
| @item
 | |
| Bash has command history (@pxref{Bash History Facilities}) and the
 | |
| @code{history} and @code{fc} builtins to manipulate it.
 | |
| The Bash history list maintains timestamp information and uses the
 | |
| value of the @code{HISTTIMEFORMAT} variable to display it.
 | |
| 
 | |
| @item
 | |
| Bash implements @code{csh}-like history expansion
 | |
| (@pxref{History Interaction}).
 | |
| 
 | |
| @item
 | |
| Bash has one-dimensional array variables (@pxref{Arrays}), and the
 | |
| appropriate variable expansions and assignment syntax to use them.
 | |
| Several of the Bash builtins take options to act on arrays.
 | |
| Bash provides a number of built-in array variables.
 | |
| 
 | |
| @item
 | |
| The @code{$'@dots{}'} quoting syntax, which expands ANSI-C
 | |
| backslash-escaped characters in the text between the single quotes,
 | |
| is supported (@pxref{ANSI-C Quoting}).
 | |
| 
 | |
| @item
 | |
| Bash supports the @code{$"@dots{}"} quoting syntax to do
 | |
| locale-specific translation of the characters between the double
 | |
| quotes.  The @option{-D}, @option{--dump-strings}, and @option{--dump-po-strings}
 | |
| invocation options list the translatable strings found in a script
 | |
| (@pxref{Locale Translation}).
 | |
| 
 | |
| @item
 | |
| Bash implements the @code{!} keyword to negate the return value of
 | |
| a pipeline (@pxref{Pipelines}).
 | |
| Very useful when an @code{if} statement needs to act only if a test fails.
 | |
| The Bash @samp{-o pipefail} option to @code{set} will cause a pipeline to
 | |
| return a failure status if any command fails.
 | |
| 
 | |
| @item
 | |
| Bash has the @code{time} reserved word and command timing (@pxref{Pipelines}).
 | |
| The display of the timing statistics may be controlled with the
 | |
| @env{TIMEFORMAT} variable.
 | |
| 
 | |
| @item
 | |
| Bash implements the @code{for (( @var{expr1} ; @var{expr2} ; @var{expr3} ))}
 | |
| arithmetic for command, similar to the C language (@pxref{Looping Constructs}).
 | |
| 
 | |
| @item
 | |
| Bash includes the @code{select} compound command, which allows the
 | |
| generation of simple menus (@pxref{Conditional Constructs}).
 | |
| 
 | |
| @item
 | |
| Bash includes the @code{[[} compound command, which makes conditional
 | |
| testing part of the shell grammar (@pxref{Conditional Constructs}), including
 | |
| optional regular expression matching.
 | |
| 
 | |
| @item
 | |
| Bash provides optional case-insensitive matching for the @code{case} and
 | |
| @code{[[} constructs.
 | |
| 
 | |
| @item
 | |
| Bash includes brace expansion (@pxref{Brace Expansion}) and tilde
 | |
| expansion (@pxref{Tilde Expansion}).
 | |
| 
 | |
| @item
 | |
| Bash implements command aliases and the @code{alias} and @code{unalias}
 | |
| builtins (@pxref{Aliases}).
 | |
| 
 | |
| @item
 | |
| Bash provides shell arithmetic, the @code{((} compound command
 | |
| (@pxref{Conditional Constructs}),
 | |
| and arithmetic expansion (@pxref{Shell Arithmetic}).
 | |
| 
 | |
| @item
 | |
| Variables present in the shell's initial environment are automatically
 | |
| exported to child processes.  The Bourne shell does not normally do
 | |
| this unless the variables are explicitly marked using the @code{export}
 | |
| command.
 | |
| 
 | |
| @item
 | |
| Bash supports the @samp{+=} assignment operator, which appends to the value
 | |
| of the variable named on the left hand side.
 | |
| 
 | |
| @item
 | |
| Bash includes the @sc{posix} pattern removal @samp{%}, @samp{#}, @samp{%%}
 | |
| and @samp{##} expansions to remove leading or trailing substrings from
 | |
| variable values (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| The expansion @code{$@{#xx@}}, which returns the length of @code{$@{xx@}},
 | |
| is supported (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| The expansion @code{$@{var:}@var{offset}@code{[:}@var{length}@code{]@}},
 | |
| which expands to the substring of @code{var}'s value of length
 | |
| @var{length}, beginning at @var{offset}, is present
 | |
| (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| The expansion
 | |
| @code{$@{var/[/]}@var{pattern}@code{[/}@var{replacement}@code{]@}},
 | |
| which matches @var{pattern} and replaces it with @var{replacement} in
 | |
| the value of @code{var}, is available (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| The expansion @code{$@{!@var{prefix@}*}} expansion, which expands to
 | |
| the names of all shell variables whose names begin with @var{prefix},
 | |
| is available (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| Bash has @var{indirect} variable expansion using @code{$@{!word@}}
 | |
| (@pxref{Shell Parameter Expansion}).
 | |
| 
 | |
| @item
 | |
| Bash can expand positional parameters beyond @code{$9} using
 | |
| @code{$@{@var{num}@}}.
 | |
| 
 | |
| @item
 | |
| The @sc{posix} @code{$()} form of command substitution
 | |
| is implemented (@pxref{Command Substitution}),
 | |
| and preferred to the Bourne shell's @code{``} (which
 | |
| is also implemented for backwards compatibility).
 | |
| 
 | |
| @item
 | |
| Bash has process substitution (@pxref{Process Substitution}).
 | |
| 
 | |
| @item
 | |
| Bash automatically assigns variables that provide information about the
 | |
| current user (@env{UID}, @env{EUID}, and @env{GROUPS}), the current host
 | |
| (@env{HOSTTYPE}, @env{OSTYPE}, @env{MACHTYPE}, and @env{HOSTNAME}),
 | |
| and the instance of Bash that is running (@env{BASH},
 | |
| @env{BASH_VERSION}, and @env{BASH_VERSINFO}).  @xref{Bash Variables},
 | |
| for details.
 | |
| 
 | |
| @item
 | |
| The @env{IFS} variable is used to split only the results of expansion,
 | |
| not all words (@pxref{Word Splitting}).
 | |
| This closes a longstanding shell security hole.
 | |
| 
 | |
| @item
 | |
| Bash implements the full set of @sc{posix} filename expansion operators,
 | |
| including @var{character classes}, @var{equivalence classes}, and
 | |
| @var{collating symbols} (@pxref{Filename Expansion}).
 | |
| 
 | |
| @item
 | |
| Bash implements extended pattern matching features when the @code{extglob}
 | |
| shell option is enabled (@pxref{Pattern Matching}).
 | |
| 
 | |
| @item
 | |
| It is possible to have a variable and a function with the same name;
 | |
| @code{sh} does not separate the two name spaces.
 | |
| 
 | |
| @item
 | |
| Bash functions are permitted to have local variables using the
 | |
| @code{local} builtin, and thus useful recursive functions may be written
 | |
| (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| Variable assignments preceding commands affect only that command, even
 | |
| builtins and functions (@pxref{Environment}).
 | |
| In @code{sh}, all variable assignments 
 | |
| preceding commands are global unless the command is executed from the
 | |
| file system.
 | |
| 
 | |
| @item
 | |
| Bash performs filename expansion on filenames specified as operands
 | |
| to input and output redirection operators (@pxref{Redirections}).
 | |
| 
 | |
| @item
 | |
| Bash contains the @samp{<>} redirection operator, allowing a file to be
 | |
| opened for both reading and writing, and the @samp{&>} redirection
 | |
| operator, for directing standard output and standard error to the same
 | |
| file (@pxref{Redirections}).
 | |
| 
 | |
| @item
 | |
| Bash includes the @samp{<<<} redirection operator, allowing a string to
 | |
| be used as the standard input to a command.
 | |
| 
 | |
| @item
 | |
| Bash implements the @samp{[n]<&@var{word}} and @samp{[n]>&@var{word}}
 | |
| redirection operators, which move one file descriptor to another.
 | |
| 
 | |
| @item
 | |
| Bash treats a number of filenames specially when they are
 | |
| used in redirection operators (@pxref{Redirections}).
 | |
| 
 | |
| @item
 | |
| Bash can open network connections to arbitrary machines and services
 | |
| with the redirection operators (@pxref{Redirections}).
 | |
| 
 | |
| @item
 | |
| The @code{noclobber} option is available to avoid overwriting existing
 | |
| files with output redirection (@pxref{The Set Builtin}).
 | |
| The @samp{>|} redirection operator may be used to override @code{noclobber}.
 | |
| 
 | |
| @item
 | |
| The Bash @code{cd} and @code{pwd} builtins (@pxref{Bourne Shell Builtins})
 | |
| each take @option{-L} and @option{-P} options to switch between logical and
 | |
| physical modes.
 | |
| 
 | |
| @item
 | |
| Bash allows a function to override a builtin with the same name, and provides
 | |
| access to that builtin's functionality within the function via the
 | |
| @code{builtin} and @code{command} builtins (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| The @code{command} builtin allows selective disabling of functions
 | |
| when command lookup is performed (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| Individual builtins may be enabled or disabled using the @code{enable}
 | |
| builtin (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| The Bash @code{exec} builtin takes additional options that allow users
 | |
| to control the contents of the environment passed to the executed
 | |
| command, and what the zeroth argument to the command is to be
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| @item
 | |
| Shell functions may be exported to children via the environment
 | |
| using @code{export -f} (@pxref{Shell Functions}).
 | |
| 
 | |
| @item
 | |
| The Bash @code{export}, @code{readonly}, and @code{declare} builtins can
 | |
| take a @option{-f} option to act on shell functions, a @option{-p} option to
 | |
| display variables with various attributes set in a format that can be
 | |
| used as shell input, a @option{-n} option to remove various variable
 | |
| attributes, and @samp{name=value} arguments to set variable attributes
 | |
| and values simultaneously.
 | |
| 
 | |
| @item
 | |
| The Bash @code{hash} builtin allows a name to be associated with
 | |
| an arbitrary filename, even when that filename cannot be found by
 | |
| searching the @env{$PATH}, using @samp{hash -p}
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| @item
 | |
| Bash includes a @code{help} builtin for quick reference to shell
 | |
| facilities (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| The @code{printf} builtin is available to display formatted output
 | |
| (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| The Bash @code{read} builtin (@pxref{Bash Builtins})
 | |
| will read a line ending in @samp{\} with
 | |
| the @option{-r} option, and will use the @env{REPLY} variable as a
 | |
| default if no non-option arguments are supplied.
 | |
| The Bash @code{read} builtin
 | |
| also accepts a prompt string with the @option{-p} option and will use
 | |
| Readline to obtain the line when given the @option{-e} option.
 | |
| The @code{read} builtin also has additional options to control input:
 | |
| the @option{-s} option will turn off echoing of input characters as
 | |
| they are read, the @option{-t} option will allow @code{read} to time out
 | |
| if input does not arrive within a specified number of seconds, the
 | |
| @option{-n} option will allow reading only a specified number of
 | |
| characters rather than a full line, and the @option{-d} option will read
 | |
| until a particular character rather than newline.
 | |
| 
 | |
| @item
 | |
| The @code{return} builtin may be used to abort execution of scripts
 | |
| executed with the @code{.} or @code{source} builtins
 | |
| (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| @item
 | |
| Bash includes the @code{shopt} builtin, for finer control of shell
 | |
| optional capabilities (@pxref{The Shopt Builtin}), and allows these options
 | |
| to be set and unset at shell invocation (@pxref{Invoking Bash}).
 | |
| 
 | |
| @item
 | |
| Bash has much more optional behavior controllable with the @code{set}
 | |
| builtin (@pxref{The Set Builtin}).
 | |
| 
 | |
| @item
 | |
| The @samp{-x} (@code{xtrace}) option displays commands other than
 | |
| simple commands when performing an execution trace
 | |
| (@pxref{The Set Builtin}).
 | |
| 
 | |
| @item
 | |
| The @code{test} builtin (@pxref{Bourne Shell Builtins})
 | |
| is slightly different, as it implements the @sc{posix} algorithm,
 | |
| which specifies the behavior based on the number of arguments.
 | |
| 
 | |
| @item
 | |
| Bash includes the @code{caller} builtin, which displays the context of
 | |
| any active subroutine call (a shell function or a script executed with
 | |
| the @code{.} or @code{source} builtins).  This supports the bash
 | |
| debugger.
 | |
| 
 | |
| @item
 | |
| The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows a
 | |
| @code{DEBUG} pseudo-signal specification, similar to @code{EXIT}.
 | |
| Commands specified with a @code{DEBUG} trap are executed before every
 | |
| simple command, @code{for} command, @code{case} command,
 | |
| @code{select} command, every arithmetic @code{for} command, and before
 | |
| the first command executes in a shell function.
 | |
| The @code{DEBUG} trap is not inherited by shell functions unless the
 | |
| function has been given the @code{trace} attribute or the
 | |
| @code{functrace} option has been enabled using the @code{shopt} builtin.
 | |
| The @code{extdebug} shell option has additional effects on the
 | |
| @code{DEBUG} trap.
 | |
| 
 | |
| The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows an
 | |
| @code{ERR} pseudo-signal specification, similar to @code{EXIT} and @code{DEBUG}.
 | |
| Commands specified with an @code{ERR} trap are executed after a simple
 | |
| command fails, with a few exceptions.
 | |
| The @code{ERR} trap is not inherited by shell functions unless the
 | |
| @code{-o errtrace} option to the @code{set} builtin is enabled.
 | |
| 
 | |
| The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows a
 | |
| @code{RETURN} pseudo-signal specification, similar to
 | |
| @code{EXIT} and @code{DEBUG}.
 | |
| Commands specified with an @code{RETURN} trap are executed before
 | |
| execution resumes after a shell function or a shell script executed with
 | |
| @code{.} or @code{source} returns.
 | |
| The @code{RETURN} trap is not inherited by shell functions unless the
 | |
| function has been given the @code{trace} attribute or the
 | |
| @code{functrace} option has been enabled using the @code{shopt} builtin.
 | |
| 
 | |
| @item
 | |
| The Bash @code{type} builtin is more extensive and gives more information
 | |
| about the names it finds (@pxref{Bash Builtins}).
 | |
| 
 | |
| @item
 | |
| The Bash @code{umask} builtin permits a @option{-p} option to cause
 | |
| the output to be displayed in the form of a @code{umask} command
 | |
| that may be reused as input (@pxref{Bourne Shell Builtins}).
 | |
| 
 | |
| @item
 | |
| Bash implements a @code{csh}-like directory stack, and provides the
 | |
| @code{pushd}, @code{popd}, and @code{dirs} builtins to manipulate it
 | |
| (@pxref{The Directory Stack}).
 | |
| Bash also makes the directory stack visible as the value of the
 | |
| @env{DIRSTACK} shell variable.
 | |
| 
 | |
| @item
 | |
| Bash interprets special backslash-escaped characters in the prompt
 | |
| strings when interactive (@pxref{Printing a Prompt}).
 | |
| 
 | |
| @item
 | |
| The Bash restricted mode is more useful (@pxref{The Restricted Shell});
 | |
| the SVR4.2 shell restricted mode is too limited.
 | |
| 
 | |
| @item
 | |
| The @code{disown} builtin can remove a job from the internal shell
 | |
| job table (@pxref{Job Control Builtins}) or suppress the sending
 | |
| of @code{SIGHUP} to a job when the shell exits as the result of a
 | |
| @code{SIGHUP}.
 | |
| 
 | |
| @item
 | |
| Bash includes a number of features to support a separate debugger for
 | |
| shell scripts.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 shell has two privilege-related builtins
 | |
| (@code{mldmode} and @code{priv}) not present in Bash.
 | |
| 
 | |
| @item
 | |
| Bash does not have the @code{stop} or @code{newgrp} builtins.
 | |
| 
 | |
| @item
 | |
| Bash does not use the @env{SHACCT} variable or perform shell accounting.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 @code{sh} uses a @env{TIMEOUT} variable like Bash uses
 | |
| @env{TMOUT}.
 | |
| 
 | |
| @end itemize
 | |
| 
 | |
| @noindent
 | |
| More features unique to Bash may be found in @ref{Bash Features}.
 | |
| 
 | |
| 
 | |
| @appendixsec Implementation Differences From The SVR4.2 Shell
 | |
| 
 | |
| Since Bash is a completely new implementation, it does not suffer from
 | |
| many of the limitations of the SVR4.2 shell.  For instance:
 | |
| 
 | |
| @itemize @bullet
 | |
| 
 | |
| @item
 | |
| Bash does not fork a subshell when redirecting into or out of
 | |
| a shell control structure such as  an @code{if} or @code{while}
 | |
| statement.
 | |
| 
 | |
| @item
 | |
| Bash does not allow unbalanced quotes.  The SVR4.2 shell will silently
 | |
| insert a needed closing quote at @code{EOF} under certain circumstances.
 | |
| This can be the cause of some hard-to-find errors.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 shell uses a baroque memory management scheme based on
 | |
| trapping @code{SIGSEGV}.  If the shell is started from a process with
 | |
| @code{SIGSEGV} blocked (e.g., by using the @code{system()} C library
 | |
| function call), it misbehaves badly.
 | |
| 
 | |
| @item
 | |
| In a questionable attempt at security, the SVR4.2 shell,
 | |
| when invoked without the @option{-p} option, will alter its real
 | |
| and effective @sc{uid} and @sc{gid} if they are less than some
 | |
| magic threshold value, commonly 100.
 | |
| This can lead to unexpected results.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 shell does not allow users to trap @code{SIGSEGV},
 | |
| @code{SIGALRM}, or @code{SIGCHLD}.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 shell does not allow the @env{IFS}, @env{MAILCHECK},
 | |
| @env{PATH}, @env{PS1}, or @env{PS2} variables to be unset.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 shell treats @samp{^} as the undocumented equivalent of
 | |
| @samp{|}.
 | |
| 
 | |
| @item
 | |
| Bash allows multiple option arguments when it is invoked (@code{-x -v});
 | |
| the SVR4.2 shell allows only one option argument (@code{-xv}).  In
 | |
| fact, some versions of the shell dump core if the second argument begins
 | |
| with a @samp{-}.
 | |
| 
 | |
| @item
 | |
| The SVR4.2 shell exits a script if any builtin fails; Bash exits
 | |
| a script only if one of the @sc{posix} special builtins fails, and
 | |
| only for certain failures, as enumerated in the @sc{posix} standard.
 | |
| 
 | |
| @item 
 | |
| The SVR4.2 shell behaves differently when invoked as @code{jsh}
 | |
| (it turns on job control).
 | |
| @end itemize
 | |
| 
 | |
| @node GNU Free Documentation License
 | |
| @appendix GNU Free Documentation License
 | |
| 
 | |
| @include fdl.texi
 | |
| 
 | |
| @node Indexes
 | |
| @appendix Indexes
 | |
| 
 | |
| @menu
 | |
| * Builtin Index::		Index of Bash builtin commands.
 | |
| * Reserved Word Index::		Index of Bash reserved words.
 | |
| * Variable Index::		Quick reference helps you find the
 | |
| 				variable you want.
 | |
| * Function Index::		Index of bindable Readline functions.
 | |
| * Concept Index::		General index for concepts described in
 | |
| 				this manual.
 | |
| @end menu
 | |
| 
 | |
| @node Builtin Index
 | |
| @appendixsec Index of Shell Builtin Commands
 | |
| @printindex bt
 | |
| 
 | |
| @node Reserved Word Index
 | |
| @appendixsec Index of Shell Reserved Words
 | |
| @printindex rw
 | |
| 
 | |
| @node Variable Index
 | |
| @appendixsec Parameter and Variable Index
 | |
| @printindex vr
 | |
| 
 | |
| @node Function Index
 | |
| @appendixsec Function Index
 | |
| @printindex fn
 | |
| 
 | |
| @node Concept Index
 | |
| @appendixsec Concept Index
 | |
| @printindex cp
 | |
| 
 | |
| @bye
 | 
