]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20140207 snapshot
authorChet Ramey <chet.ramey@case.edu>
Thu, 20 Feb 2014 15:25:06 +0000 (10:25 -0500)
committerChet Ramey <chet.ramey@case.edu>
Thu, 20 Feb 2014 15:25:06 +0000 (10:25 -0500)
44 files changed:
CHANGES
CHANGES-4.3
CWRU/CWRU.chlog
CWRU/CWRU.chlog~ [new file with mode: 0644]
CWRU/POSIX.NOTES.old [new file with mode: 0644]
CWRU/old/set.def.save [new file with mode: 0644]
CWRU/save/unwind_prot.h.save [new file with mode: 0644]
MANIFEST
bashline.c
bashline.c~ [new file with mode: 0644]
cross-build/cygwin32.cache.old [new file with mode: 0644]
doc/FAQ.orig [new file with mode: 0644]
doc/bash.0
doc/bash.1
doc/bash.html
doc/bash.pdf
doc/bash.ps
doc/bashref.aux
doc/bashref.cp
doc/bashref.cps
doc/bashref.dvi
doc/bashref.html
doc/bashref.info
doc/bashref.log
doc/bashref.pdf
doc/bashref.ps
doc/bashref.texi
doc/bashref.toc
doc/builtins.ps
doc/rbash.ps
examples/loadables/Makefile.in.save [new file with mode: 0644]
input.c
lib/readline/doc/Makefile.old [new file with mode: 0644]
lib/readline/doc/rltech.texi
lib/readline/doc/rluser.texi
lib/sh/strtrans.c
support/mk-takehome [new file with mode: 0755]
test.c
tests/array.right
tests/array.tests
tests/array16.sub [new file with mode: 0644]
tests/misc/regress/log.orig [new file with mode: 0644]
tests/misc/regress/shx.orig [new file with mode: 0644]
trap.c

diff --git a/CHANGES b/CHANGES
index c6d0649537885cf3b416bb343e226ba2cd687833..4f95e42e17ed6497e7413a7dc05a44fd02d1bfa0 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -790,8 +790,8 @@ j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
     beginning of the prompt indicating the current editing mode.
 
 k.  New application-settable variable: rl_input_available_hook; function to be
-    called when readline detects there is data available on its input file
-    descriptor.
+    called when readline needs to check whether there is data available on its
+    input source.  The default hook checks rl_instream.
 
 l.  Readline calls an application-set event hook (rl_signal_event_hook) after
     it gets a signal while reading input (read returns -1/EINTR but readline
index ce0b98a8c7b049b6472dcb85bff49e36239a8a95..9660b342f9ccc13db58bd3338e7eddeb213b070d 100644 (file)
@@ -791,8 +791,8 @@ j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
     beginning of the prompt indicating the current editing mode.
 
 k.  New application-settable variable: rl_input_available_hook; function to be
-    called when readline detects there is data available on its input file
-    descriptor.
+    called when readline needs to check whether there is data available on its
+    input source.  The default hook checks rl_instream.
 
 l.  Readline calls an application-set event hook (rl_signal_event_hook) after
     it gets a signal while reading input (read returns -1/EINTR but readline
index 71594ddd5fdb2175b2f65bbde65afb28085d569f..37311daaa151f23b4e6c88d540ccf4e6f37d9c28 100644 (file)
@@ -5779,3 +5779,44 @@ doc/{bash.1,bashref.texi}
        - added slight clarifying language to the description of $*,
          describing what happens when the expansion is not within double
          quotes
+
+                                   2/4
+                                   ---
+test.c
+       - unary_test: add code to -v case so that it interprets `bare' array
+         references (foo[1]) and returns true if that index has a value
+
+                                   2/5
+                                   ---
+trap.c
+       - restore_default_signal: fix SIGCHLD special case for SIG_TRAPPED flag
+         off but SIG_INPROGRESS mode set and handler IMPOSSIBLE_TRAP_HANDLER;
+         continue with resetting handler in this case. maybe_set_sigchld_trap
+         will check these things before resetting sigchld trap from
+         run_sigchld_trap.  Fixes (apparently long-standing?) problem reported
+         by Alexandru Damian <alexandru.damian@intel.com>
+
+                                   2/6
+                                   ---
+lib/sh/strtrans.c
+       - ansic_quote: fixed a bug when copying a printable character that
+         consumes more than one byte; byte counter was not being incremented.
+         Bug report from jidanni@jidanni.org
+
+                                   2/7
+                                   ---
+input.c
+       - getc_with_restart: if read(2) returns -1/EINTR and interrupt_state or
+         terminating_signal is set (which means QUIT; will longjmp out of this
+         function), make sure the local buffer variables are zeroed out to
+         avoid reading past the end of the buffer on the next call.  Bug report
+         from Dan Jacobson <jidanni@jidanni.org>
+
+                                   2/9
+                                   ---
+bashline.c
+       - command_word_completion_function: if a directory in $PATH contains
+         quote characters, we need to quote them before passing the candidate
+         path to rl_filename_completion_function, which performs dequoting on
+         the pathname it's passed.  Fixes bug reported by Ilyushkin Nikita
+         <ilyushkeane@gmail.com>
diff --git a/CWRU/CWRU.chlog~ b/CWRU/CWRU.chlog~
new file mode 100644 (file)
index 0000000..1f249f9
--- /dev/null
@@ -0,0 +1,5813 @@
+                                2/14/2011
+                                ---------
+[bash-4.2 released]
+
+                                  2/15
+                                  ----
+lib/glob/gmisc.c
+       - fix wmatchlen and umatchlen to avoid going past the end of the
+         string on an incomplete bracket expression that ends with a
+         NUL.  Partial fix for bug reported by Clark Wang <dearvoid@gmail.com>
+
+                                  2/16
+                                  ----
+subst.h
+       - new string extract flag value: SX_WORD.  Used when calling
+         extract_dollar_brace_string to skip over the word in
+         ${param op word} from parameter_brace_expand
+
+subst.c
+       - change parameter_brace_expand to add SX_WORD to flags passed to
+         extract_dollar_brace_string
+       - change parameter_brace_expand to use SX_POSIXEXP for all non-posix
+         word expansion operators that treat single quotes as special, not
+         just % and #
+       - change extract_dollar_brace_string to initialize dolbrace_state to
+         DOLBRACE_WORD if SX_WORD flag supplied and we shouldn't use
+         DOLBRACE_QUOTE.  Fixes bug reported by Juergen Daubert <jue@jue.li>
+
+doc/{bash.1,bashref.texi}
+       - document the exact expansions here strings undergo
+
+                                  2/17
+                                  ----
+lib/readline/vi_mode.c
+       - make sure that `dd', `cc', and `yy' call vidomove_dispatch from
+         rl_domove_read_callback.  Fixes bug reported by Clark Wang
+         <dearvoid@gmail.com>
+
+lib/readline/callback.c
+       - make sure _rl_internal_char_cleanup is called after the
+         vi-motion callbacks (rl_vi_domove_callback) in rl_callback_read_char.
+         Companion to above fix
+
+doc/{bash.1,bashref.texi}
+       - make sure that the text describing the rhs of the == and =~
+         operators to [[ states that only the quoted portion of the pattern
+         is matched as a string
+
+                                  2/18
+                                  ----
+lib/glob/gmisc.c
+       - better fix for umatchlen/wmatchlen: keep track of the number of
+         characters in a bracket expression as the value to increase
+         matchlen by if the bracket expression is not well-formed.  Fixes
+         bug reported by Clark Wang <dearvoid@gmail.com>
+
+subst.c
+       - change expand_string_for_rhs so that it sets the W_NOSPLIT2 flag
+         in the word flags.  We will not perform word splitting or quote
+         removal on the result, so we do not want to add quoted nulls if
+         we see "" or ''.  Fixes bug reported by Mike Frysinger
+         <vapier@gentoo.org>
+
+                                  2/19
+                                  ----
+variables.c
+       - new function, int chkexport(name), checks whether variable NAME is
+         exported and remakes the export environment if necessary.  Returns
+         1 if NAME is exported and 0 if not
+       - call chkexport(name) to get tzset to look at the right variable in
+         the environment when modifying TZ in sv_tz.  Don't call tzset if
+         chkexport doesn't indicate that the variable is exported
+
+variables.h
+       - new extern declaration for chkexport
+
+
+{parse.y,builtins/printf.def}
+       - call sv_tz before calling localtime() when formatting time strings
+         in prompt strings or using printf.  Fixes bug reported by
+         Dennis Williamson <dennistwilliamson@gmail.com>
+
+execute_cmd.c
+       - modify fix of 2/9 to add casts when those variables are passed to
+         functions; some compilers throw errors instead of warnings.  Report
+         and fix from Joachim Schmitz <jojo@schmitz-digital.de>
+
+support/shobj-conf
+       - add a stanza for nsk on the Tandem from Joachim Schmitz
+         <jojo@schmitz-digital.de>
+
+{shell,lib/readline/shell}.c
+       - Tandem systems should use getpwnam (getlogin()); for some reason
+         they don't do well with using getuid().  Fix from Joachim Schmitz
+         <jojo@schmitz-digital.de>
+
+                                   3/1
+                                   ---
+variables.c
+       - make sure that the return value from find_variable is non-null
+         before trying to use it in chkexport.  Fixes bug reported by
+         Evangelos Foutras <foutrelis@gmail.com>
+
+                                   3/3
+                                   ---
+parse.y
+       - when adding $$ to the current token buffer in read_token_word(),
+         don't xmalloc a buffer for two characters and then strcpy it, just
+         copy the characters directly into the token buffer.  Fix from
+         Michael Whitten <mfwitten@gmail.com>
+
+execute_cmd.c
+       - fix expand_word_unsplit to add the W_NOSPLIT2 flag to the word to
+         be expanded, so "" doesn't add CTLNUL.  Similar to fix of 2/18 to
+         expand_string_for_rhs.  Fixes bug reported by Nathanael D. Noblet
+         <nathanael@gnat.ca> and Matthias Klose <doko@debian.org>
+
+parse.y
+       - fix extended_glob case of read_token_word to allocate an extra
+         space in the buffer for the next character read after the extended
+         glob specification if it's a CTLESC or CTLNUL.  Report and fix from
+         Michael Witten <mfwitten@gmail.com>
+       - fix shell expansions case of read_token_word to allocate an extra
+         space in the buffer for the next character read after the shell
+         expansion if it's a CTLESC or CTLNUL.  Report and fix from
+         Michael Witten <mfwitten@gmail.com>
+       - TENTATIVE: fix read_token_word to reduce the amount of buffer space
+         required to hold the translated and double-quoted value of $"..."
+         strings.  Report and fix from Michael Witten <mfwitten@gmail.com>
+       - change code around got_character and got_escaped_character labels to
+         make sure that we call RESIZE_MALLOCED_BUFFER before adding the
+         CTLESC before a CTLESC or CTLNUL, and before adding the character if
+         we're not adding a CTLESC.  Report and fix from
+         Michael Witten <mfwitten@gmail.com>
+
+subst.c
+       - new param flags value, PF_ASSIGNRHS, mirrors W_ASSIGNRHS, noting that
+         parameter expansion is on rhs of assignment statement.  That inhibits
+         word splitting
+       - change param_expand to call string_list_dollar_at with quoted == 1
+         if PF_ASSIGNRHS is set, so it will quote IFS characters in the
+         positional parameter before separating them with the first char of
+         $IFS.  This keeps the rhs from being split inappropriately.  Fixes
+         bug reported by Andres Perera <andres.p@zoho.com>
+
+                                   3/4
+                                   ---
+lib/readline/bind.c
+       - add a missing free of `names' in rl_function_dumper.  Bug report
+         and fix from Michael Snyder <msnyder@vmware.com>
+
+                                   3/5
+                                   ---
+lib/readline/rltty.c
+       - change rl_deprep_terminal so it uses fileno (stdin) for the tty fd
+         if rl_instream is not set, like rl_prep_terminal
+
+                                   3/6
+                                   ---
+lib/readline/display.c
+       - fix rl_message to use a dynamically-allocated buffer instead of a
+         fixed-size buffer of 128 chars for the `local message prompt'.  Bug
+         report and fix from Micah Cowan <micah@cowan.name>
+
+                                   3/7
+                                   ---
+jobs.c
+       - add sentinel to wait_sigint_handler so it only sets wait_sigint_received
+         if waiting_for_child is non-zero; otherwise, it restores the old
+         SIGINT handler and sends itself the SIGINT
+       - set waiting_for_child around the calls to waitchld that use it to
+         synchronously wait for a process
+       - change logic that decides whether or not the child process blocked
+         or handled SIGINT based on whether or not waitpid returns -1/EINTR
+         and the shell receives a SIGINT and the child does not exit.  If
+         the child later exits due to SIGINT, cancel the assumoption that it
+         was handled
+       - instead of testing whether or not the child exited due to SIGINT
+         when deciding whether the shell should act on a SIGINT it received
+         while waiting, test whether or not we think the child caught
+         SIGINT.  If it did, we let it go (unless the shell has it trapped);
+         if it did not catch it, the shell acts on the SIGINT.  Fix from
+         Linus Torvalds <torvalds@linux-foundation.org>, bug report originally
+         from Oleg Nesterov <oleg@redhat.com>
+
+                                   3/8
+                                   ---
+shell.c
+       - initialize no_line_editing to 1 if READLINE is not defined -- we
+         can't have line editing without readline
+
+                                  3/12
+                                  ----
+lib/readline/signals.c
+       - add SIGHUP to the set of signals readline handles
+
+lib/readline/doc/rltech.texi
+       - document that SIGHUP is now part of the set of signals readline
+         handles
+
+lib/readline/input.c
+       - if _rl_caught_signal indicates that read() was interrupted by a
+         SIGHUP or SIGTERM, return READERR or EOF as appropriate
+       - call rl_event_hook, if it's set, if call to read in rl_getc
+         returns -1/EINTR.  If rl_event_hook doesn't do anything, this
+         continues the loop as before.  This handles the other fatal
+         signals
+
+execute_cmd.c
+       - add a couple of QUIT; calls to execute_disk_command and
+         execute_simple_command to improve responsiveness to interrupts
+         and fatal signals
+
+input.c
+       - rearrange getc_with_restart so that the return values from read()
+         are handled right
+
+parse.y
+       - don't need to set terminate_immediately in yy_stream_get, since
+         getc_with_restart checks for terminating signals itself
+       - since readline returns READERR on SIGHUP or SIGTERM, don't need
+         to set terminate_immediately.  Still doesn't handle other
+         signals well -- will have to check that some more
+
+bashline.c
+       - new function, bash_event_hook, for rl_event_hook.  Just checks for
+         terminating signals and acts on them using CHECK_TERMSIG.
+       - set rl_event_hook to bash_event_hook
+
+builtins/read.def
+       - take out setting terminate_immediately; add calls to CHECK_TERMSIG
+         after read calls
+
+doc/{bash.1,bashref.texi}
+       - move the text describing the effect of negative subscripts used to
+         reference indexed array elements to the paragraphs describing
+         ${parameter[subscript]}, since that's where they are implemented.
+         Pointed out by Christopher F. A. Johnson <cfajohnson@gmail.com>
+
+arrayfunc.[ch],subst.c
+       - array_expand_index now takes a new first argument: a SHELL_VAR *
+         of the array variable being subscripted.  Can be used later to fully
+         implement negative subscripts
+
+                                  3/14
+                                  ----
+lib/glob/glob.c
+       - fix mbskipname to not turn the directory entry name into a wide char
+         string if the conversion of the pattern to a wide char string fails
+       - fix mbskipname to call skipname if either the pattern or the filename
+         can't be converted into a wide-char string
+
+lib/glob/xmbsrtowcs.c
+       - fix xdupmbstowcs2 to handle return value of 0 from mbsnrtowcs and
+         short-circuit with failure in that case.  Fixes bug reported by
+         Roman Rakus <rrakus@redhat.com>
+
+                                  3/15
+                                  ----
+bashline.c
+       - new variable, bash_filename_quote_characters to store the value
+         assigned to rl_filename_quote_characters so it can be restored
+         if changed.
+       - change bashline_reset and attempt_shell_completion to restore
+         rl_filename_quote_characters if not set to default
+
+                                  3/22
+                                  ----
+lib/glob/glob.c
+       - wdequote_pathname falls back to udequote_pathname if xdupmbstowcs
+         fails to convert the pathname to a wide-character string
+
+lib/glob/xmbsrtowcs.c
+       - xdupmbstowcs2: change to fix problem with leading '\\' (results in
+         nms == 0, which causes it to short-circuit with failure right
+         away).  Fixes bug pointed out by Werner Fink <werner@suse.de>
+       - xdupmbstowcs2: compensate for mbsnrtowcs returning 0 by taking the
+         next single-byte character and going on
+       - xdupmbstowcs2: change memory allocation to increase by WSBUF_INC
+         bytes; try to avoid calls to realloc (even if they don't actually
+         result in more memory being allocated)
+
+                                  3/24
+                                  ----
+doc/{bash.1,bashref.texi}
+       - slightly modify BASH_SUBSHELL description based on complaint from
+         Sam Liddicott <sam@liddicott.com>
+
+                                  3/25
+                                  ----
+trap.c
+       - change free_trap_strings to not call free_trap_string for signals
+         that are being ignored, like reset_or_restore_signal_handlers.
+         Fixes bug reported by Satoshi Takahashi <blue3waters@gmail.com>
+
+                                  3/26
+                                  ----
+lib/readline/rltypedefs.h
+       - remove old Function/VFunction/CPFunction/CPPFunction typedefs as
+         suggested by Tom Tromey <tromey@redhat.com>
+
+lib/readline/rlstdc.h
+       - move defines for USE_VARARGS/PREFER_STDARG/PREFER_VARARGS from
+         config.h.in to here because declaration of rl_message in
+         readline.h uses the defines.  This makes it hard for another packages
+         to use after the header files are installed, since config.h is not
+         one of the installed files.  Suggested by Tom Tromey
+         <tromey@redhat.com>
+
+                                  3/27
+                                  ----
+print_cmd.c
+       - change indirection_string from a static buffer to a dynamic one
+         managed by indirection_level_string(), so we don't end up truncating
+         PS4.  Suggested by Dennis Williamson <dennistwilliamson@gmail.com>
+
+lib/readline/shell.c
+       - change sh_set_lines_and_columns to use static buffers instead of
+         allocating the buffers to pass to setenv/putenv
+
+lib/readline/terminal.c
+       - change _rl_get_screen_size to not call sh_set_lines_and_columns if
+         ignore_env == 0
+       - _rl_sigwinch_resize_terminal: new function to just retrieve terminal
+         size, ignoring environment
+
+lib/readline/rlprivate.h
+       - new external declaration for _rl_sigwinch_resize_terminal() (currently
+         unused)
+
+lib/readline/signals.c
+       - rl_sigwinch_handler: set _rl_caught_signal to SIGWINCH
+       - rl_sigwinch_handler: don't immediately call rl_resize_terminal; just
+         leave _rl_caught_signal set for RL_CHECK_SIGNALS to handle
+       - _rl_signal_handler: call rl_resize_terminal if sig == SIGWINCH.
+         Should fix hang when sending multiple repeated SIGWINCH reported by
+         Henning Bekel <h.bekel@googlemail.com>
+
+                                  3/29
+                                  ----
+lib/sh/snprintf.c
+       - include math.h for any defines for isinf/isnan
+       - use code from gnulib documentation to implement isinf/isnan if they
+         are not defined
+
+configure.in
+       - don't check for isinf or isnan; c99 says they're macros anyway
+
+config.h.in
+       - remove defines for ISINF_IN_LIBC and ISNAN_IN_LIBC, no longer used
+         by snprintf.c
+
+                                   4/2
+                                   ---
+braces.c
+       - brace_gobbler: fix to understand double-quoted command substitution,
+         since the shell understands unquoted comsubs.  Fixes bug reported
+         by Michael Whitten <mfwitten@gmail.com>
+
+lib/readline/display.c
+       - include <pc.h> on MDOS
+       - get and set screen size using DJGPP-specific calls on MSDOS
+       - move cursor up clear screen using DJGPP-specific calls
+       - don't call tputs on DJGPP; there is no good terminfo support
+
+lib/readline/terminal.c
+       - include <pc.h> on MDOS
+       - get and set screen size using DJGPP-specific calls on MSDOS
+       - use DJGPP-specific initialization on MSDOS, zeroing all the
+         _rl_term_* variables
+       - don't call tputs on DJGPP; there is no good terminfo support
+         DJGPP support from Eli Zaretskii  <eliz@gnu.org>
+
+                                   4/6
+                                   ---
+
+config-top.h
+       - change DEFAULT_PATH_VALUE to something more useful and modern
+
+                                   4/8
+                                   ---
+tests/printf2.sub
+       - make sure LC_ALL and LC_CTYPE are set so LANG assignment takes effect.
+         Reported by Cedric Arbogast <arbogast.cedric@gmail.com>
+
+                                  4/11
+                                  ----
+include/chartypes.h
+       - fix a couple of dicey defines (though ones that don't cause any
+         compiler warnings) in IN_CTYPE_DOMAIN
+
+doc/{bashref.texi,bash.1}
+       - add note referring to duplicating file descriptors in sections
+         describing redirecting stdout and stderr and appending to stdout
+         and stderr.  Suggested by Matthew Dinger <mdinger.bugzilla@gmail.com>
+
+pcomplete.c
+       - it_init_helptopics: new function to support completing on help topics,
+         not just builtins
+       - it_helptopics: new programmable completion list of help topics
+       - build list of helptopic completions in gen_action_completions on
+         demand
+
+pcomplete.h
+       - new extern declaration for it_helptopics
+
+builtins/complete.def
+       - the `helptopic' action now maps to CA_HELPTOPIC intead of CA_BUILTIN,
+         since there are more help topics than just builtins.  Suggested by
+         Clark Wang <dearvoid@gmail.com>
+
+                                  4/12
+                                  ----
+print_cmd.c
+       - fix print_arith_for_command to add a call to PRINT_DEFERRED_HEREDOCS
+         before ending the body of the command, so heredocs get attached to
+         the right command instead of to the loop.  From gentoo bug 363371
+         http://bugs.gentoo.org/show_bug.cgi?id=363371
+
+execute_cmd.c
+       - change coproc_pidchk to unset the appropriate shell variables when
+         the (currently single) known coproc pid terminates
+       - cleanup and new functions to fully support multiple coprocesses when
+         and if I decide to go there
+
+                                  4/13
+                                  ----
+print_cmd.c
+       - fix print_group_command to add a call to PRINT_DEFERRED_HEREDOCS
+         after call to make_command_string_internal before printing closing
+         `}'
+       - fix make_command_string_internal to add a call to
+         PRINT_DEFERRED_HEREDOCS after recursive call to
+         make_command_string_internal in case cm_subshell before printing
+         closing `)'
+
+                                  4/14
+                                  ----
+print_cmd.c
+       - change overlapping strcpy in named_function_string to memmove
+
+sig.h
+       - UNBLOCK_SIGNAL: convenience define, same as UNBLOCK_CHILD, just
+         restores an old signal mask
+
+trap.c
+       - set_signal: instead of setting the signal handler to SIG_IGN while
+         installing the new trap handler, block the signal and unblock it
+         after the new handler is installed.  Fixes bug reported by Roman
+         Rakus <rrakus@redhat.com>
+
+                                  4/15
+                                  ----
+doc/{bash.1,bashref.texi}
+       - make it clear that enabling monitor mode means that all jobs run in
+         separate process groups
+
+                                  4/18
+                                  ----
+builtins/fc.def
+       - update fix of 4/15/2010 to not take saved_command_line_count into
+         account when stepping down the history list to make sure that
+         last_hist indexes something that is valid.  Fixes bug reported by
+         <piuma@piumalab.org>
+
+                                  4/19
+                                  ----
+builtins/fc.def
+       - fc_gethnum: make sure the calculation to decide the last history
+         entry is exactly the same as fc_builtin.  Fixes bug uncovered by
+         fix of 4/18 to stop seg fault
+
+                                  4/22
+                                  ----
+lib/readline/terminal.c
+       - change _rl_enable_meta_key to set a flag indicating that it sent the
+         enable-meta sequence
+       - _rl_disable_meta_key: new function to turn off meta mode after we
+         turned it on with _rl_enable_meta_key
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_disable_meta_key
+
+configure.in
+       - if not cross-compiling, set CFLAGS_FOR_BUILD from any CFLAGS inherited
+         from the environment.  Fixes HP/UX build problem reported by
+         "Daniel Richard G." <skunk@iSKUNK.ORG>
+
+                                  4/26
+                                  ----
+config-top.h
+       - define MULTIPLE_COPROCS to 0 so the code is still disabled but easy
+         to enable via configure option or editing this file
+
+                                  4/29
+                                  ----
+lib/sh/eaccess.c
+       - freebsd provides faccessat, with the same misfeature as their eaccess
+         and access implementations (X_OK returns true for uid==0 regardless
+         of the actual file permissions), so reorganize code to check the
+         file permissions as with eaccess.  Report and fix from Johan Hattne
+         <johan.hattne@utsouthwestern.edu>
+
+                                   5/2
+                                   ---
+doc/{bash.1,bashref.texi}
+       - add forward reference to `Pattern Matching' from `Pathname
+         Expansion', suggested by Greg Wooledge <wooledg@eeg.ccf.org>
+
+                                   5/5
+                                   ---
+pcomplib.c
+       - the bash_completion project now distributes over 200 completions
+         for various programs, with no end in sight, so increase the value
+         of COMPLETE_HASH_BUCKETS from 32 to 128
+
+pathexp.c
+       - quote_string_for_globbing: make sure CTLESC quoting CTLESC is
+         translated into \<CTLESC> even if the flags include QGLOB_REGEXP.
+         We don't want to process the second CTLESC as a quote character.
+         Fixes bug reported by Shawn Bohrer <sbohrer@rgmadvisors.com>
+
+                                   5/6
+                                   ---
+builtins/printf.def
+       - change PRETURN to not call fflush if ferror(stdout) is true
+       - if a call to one of the stdio functions or printstr leaves
+         ferror(stdout) true, and PRETURN is going to be called, let PRETURN
+         print the error message rather than doubling up the messages.  Fixes
+         problem reported by Roman Rakus <rrakus@redhat.com>
+
+                                   5/9
+                                   ---
+doc/{bash.1,bashref.texi}
+       - add note to the effect that lists inside compound command can be
+         terminated by newlines as well as semicolons.  Suggested by
+         Roman Byshko <rbyshko@gmail.com>
+
+                                  5/10
+                                  ----
+subst.c
+       - remove_quoted_nulls: fix problem that caused it to skip over the
+         character after a CTLNUL, which had the effect of skipping every
+         other of a series of CTLNULs.  Fixes bug reported by
+         Marten Wikstrom <marten.wikstrom@keystream.se>
+
+                                  5/11
+                                  ----
+subst.c
+       - extract_process_subst: add SX_COMMAND flag to call to
+         extract_delimited_string, since we're expanding the same sort of
+         command as command substitution.  Fixes bug reported in Ubuntu
+         bug 779848
+
+                                  5/12
+                                  ----
+configure.in
+       - set the prefer_shared and prefer_static variables appropriately
+         depending on the value of $opt_static_link
+
+aclocal.m4
+       - AC_LIB_LINKFLAGS_BODY: change to not prefer shared versions of the
+         libraries it's searching for if the prefer_shared variable is "no".
+         Fixes problem reported by Cedric Arbogast <arbogast.cedric@gmail.com>
+
+                                  5/13
+                                  ----
+lib/readline/readline.c
+       - _rl_internal_teardown: add call to _rl_disable_meta_key to make the
+         meta key active only for the duration of the call to readline()
+       - _rl_internal_setup: move call to _rl_enable_meta_key here from
+         readline_initialize_everything so the meta key is active only for
+         the duration of the call to readline().  Suggestion from Miroslav
+         Lichvar <mlichvar@redhat.com>
+
+builtins/help.def
+       - help_builtin: change strncmp to strcmp so that `help read' no longer
+         matches `readonly'.  Suggested by Clark Wang <dearvoid@gmail.com>
+
+config.h.in
+       - add define for GLIBC21, checked using jm_GLIBC21 as part of the tests
+         for libintl
+
+lib/malloc/malloc.c
+       - internal_free: don't use the cached value of memtop when deciding
+         whether or not to adjust the break and give memory back to the kernel
+         when using the GNU C library, since glibc uses sbrk for its own
+         internal purposes.  From Debian bug 614815, reported by Samuel
+         Thibault <samuel.thibault@gnu.org>
+
+aclocal.m4
+       - BASH_STRUCT_WEXITSTATUS_OFFSET: change AC_RUN_IFELSE to AC_TRY_RUN
+         to avoid warning about not using AC_LANG_SOURCE
+
+                                  5/14
+                                  ----
+bashline.[ch]
+       - two new functions, bashline_set_event_hook and bashline_reset_event_hook,
+         to set rl_event_hook to bash_event_hook and back to NULL, respectively
+       - don't set rl_event_hook unconditionally
+
+sig.c
+       - termsig_sighandler: if the shell is currently interactive and
+         readline is active, call bashline_set_event_hook to cause
+         termsig_handler to be called via bash_event_hook when the shell
+         returns from the signal handler
+
+                                  5/15
+                                  ----
+lib/readline/display.c
+       - _rl_col_width: Mac OS X has a bug in wcwidth: it does not return 0
+         for UTF-8 combining characters.  Added workaround dependent on
+         MACOSX.  Fixes problem pointed out by Thomas De Contes
+         <d.l.tDecontes@free.fr>
+
+                                  5/16
+                                  ----
+lib/readline/rlmbutil.h
+       - WCWIDTH: wrapper for wcwidth that returns 0 for Unicode combining
+         characters on systems where wcwidth is broken (e.g., Mac OS X).
+
+lib/readline/{complete,display,mbutil}.c
+       - use WCWIDTH instead of wcwidth
+
+                                  5/17
+                                  ----
+lib/readline/display.c
+       - update_line: after computing ofd and nfd, see whether the next
+         character in ofd is a zero-width combining character.  If it is,
+         back ofd and nfd up one, so the base characters no longer compare
+         as equivalent.  Fixes problem reported by Keith Winstein
+         <keithw@mit.edu>
+
+lib/readline/nls.c
+       - _rl_utf8locale: new flag variable, set to non-zero if the current
+         locale is UTF-8
+       - utf8locale(): new function, returns 1 if the passed lspec (or the
+         current locale) indicates that the locale is UTF-8.  Called from
+         _rl_init_eightbit
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_utf8locale
+
+locale.c
+       - locale_utf8locale: new flag variable, set to non-zero if the current
+         locale is UTF-8 (currently unused)
+       - locale_isutf8(): new function, returns 1 if the passed lspec (or the
+         current locale) indicates that the locale is UTF-8.  Should be called
+         whenever the locale or LC_CTYPE value is modified
+
+aclocal.m4
+       - BASH_WCWIDTH_BROKEN: new test for whether or not wcwidth returns
+         zero-width characters like unicode combining characters as having
+         display length 1; define WCWIDTH_BROKEN in this case
+
+config.h.in
+       - WCWIDTH_BROKEN: new define
+
+lib/readline/rlmbutil.h
+       - change WCWIDTH macro to use _rl_utf8locale and the full range of
+         Unicode combining characters (U+0300-U+036F)
+
+                                  5/19
+                                  ----
+lib/readline/rlprivate.h
+       - _rl_search_context: new member, prevc, will hold character read
+         prior to lastc
+
+lib/readline/isearch.c
+       - _rl_isearch_dispatch: if the character causes us to index into
+         another keymap, save that character in cxt->prevc
+       - _rl_isearch_dispatch: if we index into another keymap, but don't
+         find a function that's special to i-search, and the character that
+         caused us to index into that keymap would have terminated the
+         search, push back cxt->prevc and cxt->lastc to make it appear as
+         if `prevc' terminated the search, and execute lastc as a command.
+         We have to push prevc back so we index into the same keymap before
+         we read lastc.  Fixes bug report from Davor Cubranic
+         <cubranic@stat.ubc.ca>
+
+                                  5/20
+                                  ----
+expr.c
+       - expr_bind_variable: pay attention to the return value from
+         bind_variable and check whether or not we should error out due to
+         a readonly or noassign variable.  Fixes bug reported by Eric
+         Blake <eblake@redhat.com>
+
+                                  5/26
+                                  ----
+
+lib/readline/search.c
+       - include histlib.h for ANCHORED_SEARCH defines
+       - rl_history_search_flags: new variable, holds ANCHORED_SEARCH flag for
+         the duration of a history search
+       - rl_history_search_reinit: takes a new flags variable, defines whether
+         or not the search is anchored; assigned to rl_history_search_flags
+       - rl_history_serarch_reinit: if ANCHORED_SEARCH flag passed, add ^ to
+         beginning of search string; otherwise search string is unmodified
+       - rl_history_search_internal: set rl_point appropriately based on
+         whether or not rl_history_search_flags includes ANCHORED_SEARCH
+       - rl_history_substr_search_forward: new function, for non-anchored
+         substring search forward through history for string of characters
+         preceding rl_point
+       - rl_history_substr_search_backward: new function, for non-anchored
+         substring search backward through history for string of characters
+         preceding rl_point.  Original code from Niraj Kulkarni
+         <kulkarniniraj14@gmail.com>
+
+lib/readline/readline.h
+       - extern declarations for rl_history_substr_search_{for,back}ward
+
+lib/readline/funmap.c
+       - history-substring-search-forward: new bindable command, invokes
+         rl_history_substr_search_forward
+       - history-substring-search-backward: new bindable command, invokes
+         rl_history_substr_search_backward
+
+lib/readline/doc/{rluser.texi,readline.3}
+       - document history-substring-search-forward and
+         history-substring-search-backward
+
+                                  5/27
+                                  ----
+{nojobs,jobs}.c
+       - add support for DONT_REPORT_SIGTERM so that the shell doesn't print
+         a message when a job exits due to SIGTERM since that's the default
+         signal sent by the kill builtin.  Suggested by Marc Herbert
+         <mark.herbert@gmail.com>
+
+config-top.h
+       - DONT_REPORT_SIGTERM: new user-modifiable setting.  Commented out
+         by default
+
+                                  5/28
+                                  ----
+lib/readline/bind.c
+       - _rl_skip_to_delim: skip to a closing double quote or other delimiter,
+         allowing backslash to quote any character, including the delimiter
+       - rl_parse_and_bind: call _rl_skip_to_delim instead of using inline
+         code
+       - rl_parse_and_bind: allow quoted strings as the values of string
+         variables.  Variable values without double quotes have trailing
+         whitespace removed (which still allows embedded whitespace, for
+         better or worse).  Fixes problem with string variables not matching
+         in `set' command if values happen to have trailing spaces or tabs
+         (debian bash bug #602762), but introduces slight incompatibility.
+
+                                  5/29
+                                  ----
+doc/{bash.1,bashref.texi}
+       - clarify unset description to specify that without options, a
+         variable, then a shell function if there is no variable by that
+         name, is unset.  Fixes discrepancy reported by Mu Qiao
+         <qiaomuf@gentoo.org>
+
+                                  6/4
+                                  ----
+doc/{bash.1,bashref.texi}
+       - clarify description of LINES and COLUMNS (and checkwinsize shopt
+         option) to make it clear that only interactive shells set a
+         handler for SIGWINCH and update LINES and COLUMNS.  Original
+         report submitted by Jonathan Nieder <jrnieder@gmail.com>
+
+arrayfunc.c
+       - expand_compound_array_assignment: defer expansion of words between
+         parens when performing compound assignmnt to an associative array
+         variable
+       - assign_compound_array_list: perform the same expansions when doing
+         a compound array assignment to an associative array variable as
+         when doing a straight array index assignment.  The idea is that
+               foo=( [ind1]=bar [ind2]=quux)
+         is the same as
+               foo[ind1]=bar ; foo[ind2]=quux
+
+         This fixes problems with double-expansion and quote removal being
+         performed on the array indices
+
+                                  6/13
+                                  ----
+doc/{bash.1,bashref.texi}
+       - Add a little text to make it clear that the locale determines how
+         range expressions in glob patterns are handled.
+
+
+                                  6/21
+                                  ----
+builtins/read.def
+       - display a message and return error status if -a is used with an
+         existing associative array.  Fixes bug reported by Curtis Doty
+         <curtis@greenkey.net>
+
+                                  6/24
+                                  ----
+{jobs,nojobs}.c
+       - non-interactive shells now react to the setting of checkwinsize
+         and set LINES and COLUMNS after a foreground job exits.  From a
+         suggestion by Leslie Rhorer <lrhorer@satx.rr.com>
+
+doc/{bash.1,bashref.texi}
+       - checkwinsize: remove language saying that only interactive shells
+         check the window size after each command
+
+lib/readline/histfile.c
+       - history_backupfile: new file, creates a backup history file name
+         given a filename (appending `-')
+       - history_do_write: when overwriting the history file, back it up
+         before writing.  Restore backup file on a write error.  Suggested
+         by chkno@chkno.net
+
+bashline.c
+       - find_cmd_name: two new arguments, return the start and end of the
+         actual text string used to find the command name, without taking
+         whitespace into account
+       - attempt_shell_completion: small changes to make sure that completion
+         attempted at the beginning of a non-empty line does not find a
+         programmable completion, even if the command name starts at point
+       - attempt_shell_completion: small change to make sure that completion
+         does not find a progcomp when in whitespace before the command
+         name
+       - attempt_shell_completion: small change to make sure that completion
+         does not find a progcomp when point is at the first character of a
+         command name, even when there is leading whitespace (similar to
+         above).  Fixes problems noted by Ville Skytta <ville.skytta@iki.fi>
+
+subst.c
+       - brace_expand_word_list: since the individual strings in the strvec
+         returned by brace_expand are already allocated, don't copy them to
+         newly-allocated memory when building the WORD_LIST, just use them
+         intact
+
+locale.c
+       - locale_mb_cur_max: cache value of MB_CUR_MAX when we set or change
+         the locale to avoid a function call every time we need to read it
+
+shell.h
+       - new struct to save shell_input_line and associated variables:
+         shell_input_line_state_t
+       - add members of sh_parser_state_t to save and restore token and the
+         size of the token buffer
+
+parse.y
+       - {save,restore}_input_line_state: new functions to save and restore
+         shell_input_line and associated variables
+       - {save,restore}_parser_state: add code to save and restore the token
+         and token buffer size
+       - xparse_dolparen: call save_ and restore_input_line_state to avoid
+         problems with overwriting shell_input_line when we recursively
+         call the parser to parse a command substitution.  Fixes bug
+         reported by Rui Santos <rsantos@grupopie.com>
+
+include/shmbutil.h
+       - use locale_mb_cur_max instead of MB_CUR_MAX in ADVANCE_CHAR and
+         similar macros
+
+lib/glob/smatch.c
+       - rangecmp,rangecmp_wc: change to take an additional argument, which
+         forces the use of strcoll/wscoll when non-zero.  If it's 0, a new
+         variable `glob_asciirange' controls whether or not we use strcoll/
+         wscoll.  If glob_asciirange is non-zero, we use straight
+         C-locale-like ordering. Suggested by  Aharon Robbins
+         <arnold@skeeve.com>
+
+                                  6/30
+                                  ----
+execute_cmd.c
+       - execute_pipeline: make sure the lastpipe code is protected by
+         #ifdef JOB_CONTROL.  Fixes problem reported by Thomas Cort
+         <tcort@minix3.org>
+
+                                   7/2
+                                   ---
+lib/readline/complete.c
+       - EXPERIMENTAL: remove setting of _rl_interrupt_immediately around
+         completion functions that touch the file system.  Idea from Jan
+         Kratochvil <jan.ktratochvil@redhat.com> and the GDB development
+         team
+
+lib/readline/signals.c
+       - rl_signal_handler: if we're in callback mode, don't interrupt
+         immediately on a SIGWINCH
+
+                                   7/3
+                                   ---
+bashline.c
+       - set_directory_hook: and its siblings are a new set of functions to
+         set, save, and restore the appropriate directory completion hook
+       - change callers to use {set,save,restore}_directory_hook instead of
+         manipulating rl_directory_rewrite_hook directly
+       - dircomplete_expand: new variable, defaults to 0, if non-zero causes
+         directory names to be word-expanded during word and filename
+         completion
+       - change {set,save,restore}_directory_hook to look at dircomplete_expand
+         and change rl_directory_completion_hook or rl_directory_rewrite_hook
+         appropriately
+
+bashline.h
+       - extern declaration for set_directory_hook so shopt code can use it
+
+                                   7/6
+                                   ---
+builtins/shopt.def
+       - globasciiranges: new settable shopt option, makes glob ranges act
+         as if in the C locale (so b no longer comes between A and B).
+         Suggested by Aharon Robbins <arnold@skeeve.com>
+
+                                   7/7
+                                   ---
+doc/{bash.1,bashref.texi}
+       - document new `globasciiranges' shopt option
+
+                                   7/8
+                                   ---
+builtins/shopt.def
+       - direxpand: new settable option, makes filename completion expand
+         variables in directory names like bash-4.1 did.
+       - shopt_set_complete_direxpand: new function, does the work for the
+         above by calling set_directory_hook
+
+doc/{bash.1,bashref.texi}
+       - document new `direxpand' shopt option
+
+                                  7/15
+                                  ----
+lib/readline/isearch.c
+       - _rl_isearch_dispatch: when adding character to search string, use
+         cxt->lastc (which we use in the switch statement) instead of c,
+         since lastc can be modified earlier in the function
+
+                                  7/18
+                                  ----
+lib/readline/rlprivate.h
+       - _rl_search_context: add another member to save previous value of
+         (multibyte) lastc: pmb is to mb as prevc is to lastc
+
+lib/readline/isearch.c:
+       - _rl_isearch_dispatch: if a key sequence indexes into a new keymap,
+         but doesn't find any bound function (k[ind].function == 0) or is
+         bound to self-insert (k[ind].function == rl_insert), back up and
+         insert the previous character (the one that caused the index into a
+         new keymap) and arrange things so the current character is the next
+         one read, so both of them end up in the search string.  Fixes bug
+         reported by Clark Wang <dearvoid@gmail.com>
+       - _rl_isearch_dispatch: a couple of efficiency improvements when adding
+         characters to the isearch string
+
+                                  7/24
+                                  ----
+lib/readline/isearch.c
+       - _rl_isearch_dispatch: save and restore cxt->mb and cxt->pmb
+         appropriately when in a multibyte locale
+
+doc/{bash.1,bashref.texi}
+       - correct description of {x}>file (and other redirection operators
+         that allocate a file descriptor) to note the the fd range is
+         greater than or equal to 10.  Fixes problem reported by
+         Christian Ullrich 
+
+lib/readline/signals.c
+       - rl_signal_handler: don't interrupt immediately if in callback mode
+
+lib/readline/callback.c
+       - rl_callback_read_char: install signal handlers only when readline
+         has control in callback mode, so readline's signal handlers aren't
+         called when the application is active (e.g., between the calls to
+         rl_callback_handler_install and rl_callback_read_char).  If the
+         readline signal handlers only set a flag, which the application
+         doesn't know about, the signals will effectively be ignored until
+         the next time the application calls into the readline callback
+         interface.  Fixes problem of calling unsafe functions from signal
+         handlers when in callback mode reported by Jan Kratochvil
+         <jan.kratochvil@redhat.com>
+
+execute_cmd.c
+       - fix_assignment_words: when in Posix mode, the `command' builtin
+         doesn't change whether or not the command name it protects is an
+         assignment builtin.  One or more instances of `command'
+         preceding `export', for instance, doesn't make `export' treat its
+         assignment statement arguments differently.  Posix interpretation
+         #351
+
+doc/{bash.1,bashref.texi}
+       - document new Posix-mode behavior of `command' when preceding builtins
+         that take assignment statements as arguments
+
+builtins/printf.def
+       - printstr: if fieldwidth or precision are < 0 or > INT_MAX when
+         supplied explicitly (since we take care of the `-' separately),
+         clamp at INT_MAX like when using getint().  Fixes issue reported
+         by Ralph Coredroy <ralph@inputplus.co.uk>
+
+                                  7/25
+                                  ----
+lib/readline/chardefs.h
+       - isxdigit: don't define if compiling with c++; declared as a c++
+         template function.  Fixes bug reported by Miroslav Lichvar
+         <mlichvar@redhat.com>
+
+builtins/printf.def
+       - getint: if garglist == 0, return whatever getintmax returns (0).
+         Fixes bug reported  by Ralph Coredroy <ralph@inputplus.co.uk>
+
+                                  7/28
+                                  ----
+doc/{bash.1,bashref.texi}
+       - minor changes to the descriptions of the cd and pushd builtins
+
+lib/sh/zread.c
+       - zsyncfd: change variable holding return value from lseek to
+         off_t.  Bug report and fix from Gregory Margo <gmargo@pacbell.net>
+
+                                   8/1
+                                   ---
+expr.c
+       - don't check for division by 0 when in a context where no evaluation
+         is taking place.  Fixes bug reported by dnade.ext@orange-ftgroup.com
+
+                                   8/6
+                                   ---
+execute_cmd.c
+       - execute_command_internal: the parent branch of the subshell code
+         (where the child calls execute_in_subshell) should not close all
+         open FIFOs with unlink_fifo_list if it's part of a shell function
+         that's still executing.  Fixes bug reported by Maarten Billemont
+         <lhunath@lyndir.com>
+
+                                   8/9
+                                   ---
+builtins/common.c
+       - get_exitstat: return EX_BADUSAGE (2) on a non-numeric argument
+
+builtins/return.def
+       - return_builtin: just call get_exitstat to get the return status,
+         let it handle proper parsing and handling of arguments.  Fixes
+         issue most recently raised by Linda Walsh <bash@tlinx.org>.
+         Reverses change from 9/11/2008 (see above)
+
+                                  8/16
+                                  ----
+doc/{bash.1,bashref.texi}
+       - clean up `set -e' language to make it clearer that any failure of
+         a compound command will cause the shell to exit, not just subshells
+         and brace commands
+
+                                  8/17
+                                  ----
+configure.in
+       - make the various XXX_FOR_BUILD variables `precious' to autoconf to
+         avoid stale data
+       - change how CC_FOR_BUILD is initialized when cross-compiling and not,
+         but do not change behavior
+       - initialize CFLAGS_FOR_BUILD to -g when cross-compiling
+       - initialize LIBS_FOR_BUILD to $(LIBS) when not cross-compiling, empty
+         when cross-compiling
+       - create AUTO_CFLAGS variable to hold basic CFLAGS defaults; used when
+         CFLAGS not inherited from environment (like effect of old
+         auto_cflags variable)
+       - substitute LIBS_FOR_BUILD into output Makefiles
+         [changes inspired by bug report from Nathan Phillip Brink
+         <ohnobinki@ohnopublishing.net> -- gentoo bug 378941]
+
+builtins/Makefile.in   
+       - substitute LIBS_FOR_BUILD from configure, not strictly initialized
+         to $(LIBS)
+
+                                  8/27
+                                  ----
+doc/{bash.1,bashref.texi}
+       - minor changes to the here string description to clarify the
+         expansions performed on the word
+
+support/shobj-conf
+       - handle compilation on Lion (Mac OS X 10.7/darwin11) with changes
+         to darwin stanzas.  Fixes readline bug reported by Vincent
+         Sheffer <vince.sheffer@apisphere.com>
+
+lib/sh/strtrans.c
+       - ansic_wshouldquote: check a string with multi-byte characters for
+         characters that needs to be backslash-octal escaped for $'...'
+       - ansic_shouldquote: if is_basic fails for one character, let
+         ansic_wshouldquote examine the rest of the string and return what
+         it returns.  From a patch sent by Roman Rakus <rrakus@redhat.com>
+
+                                  8/30
+                                  ----
+lib/sh/strtrans.c
+       - ansic_quote: changes to quote (or not) multibyte characters.  New
+         code converts them to wide characters and uses iswprint to check
+         valid wide chars.  From a patch sent by Roman Rakus
+         <rrakus@redhat.com>
+
+                                   9/7
+                                   ---
+lib/sh/shquote.c
+       - sh_backslash_quote: change to be table-driven so we can use a
+         different table if we want to
+       - sh_backslash_quote: takes a second char table[256] argument;
+
+externs.h
+       - sh_backslash_quote: add second argument to function prototype
+
+bashline.c,braces.c,parse.y,builtins/printf.def
+       - change callers of sh_backslash_quote to add second argument
+
+bashline.c
+       - filename_bstab: table of characters to pass to sh_backslash_quote;
+         characters with value 1 will be backslash-quoted
+       - set_filename_bstab: turn on characters in filename backslash-quote
+         table according to passed string argument
+       - call set_filename_bstab every time rl_filename_quote_characters is
+         assigned a value
+       - bash_quote_filename: call sh_backslash_quote with filename_bstab
+         as second argument.  This allows other characters in filenames to
+         be quoted without quoting, for instance, a dollar sign in a shell
+         variable reference
+
+                                   9/8
+                                   ---
+bashline.c
+       - complete_fullquote: new variable, controls table passed to
+         sh_backslash_quote.  If non-zero (the default), the standard set
+         of shell metacharacters -- as in bash versions up to and including
+         bash-4.2 -- gets backslash-quoted by the completion code.  If zero,
+         sh_backslash_quote gets the table with the characters in the
+         variable reference removed, which means they are removed from the
+         set of characters to be quoted in filenames
+
+                                  9/10
+                                  ----
+bashline.c
+       - bash_filename_stat_hook: new function, designed to expand variable
+         references in filenames before readline passes them to stat(2)
+         to determine whether or not they are a directory
+
+                                  9/15
+                                  ----
+builtins/declare.def
+       - if assign_array_element fails due to a bad (or empty) subscript, mark
+         it as an assignment error and don't attempt any further processing
+         of that declaration.  Fixes segfault bug reported by Diego Augusto
+         Molina <diegoaugustomolina@gmail.com>
+
+                                  9/19
+                                  ----
+expr.c
+       - exppower: replace the simple exponentiation algorithm with an
+         implementation of exponentiation by squaring.  Inspired by report
+         from Nicolas ARGYROU <nargy@yahoo.com>
+
+bashline.c
+       - bash_quote_filename: check for rtext being non-null before
+         dereferencing it
+       - set_saved_history: operate_and_get_next assumes that the previous
+         line was added to the history, even when the history is stifled and
+         at the max number of entries.  If it wasn't, make sure the history
+         number is incremented properly.  Partial fix for bug reported by
+         gregrwm <backuppc-users@whitleymott.net>
+
+doc/{bash.1,bashref.texi},lib/readline/doc/{hsuser,rluser}.texi
+       - minor editorial changes inspired by suggestions from
+         Roger Zauner <rogerx.oss@gmail.com>
+
+                                  9/20
+                                  ----
+lib/intl/localealias.c
+       - read_alias_file: close resource leak (fp) when returning on error
+
+                                  9/22
+                                  ----
+execute_command.c
+       - execute_intern_function: implement Posix interpretation 383 by making
+         it an error to define a function with the same name as a special
+         builtin when in Posix mode.
+         http://austingroupbugs.net/view.php?id=383#c692
+
+                                  9/25
+                                  ----
+doc/{bash.1,bashref.texi}
+       - formatting and some content changes from Benno Schulenberg
+         <bensberg@justemail.net>
+       - document new posix-mode behavior from interp 383 change of 9/22
+
+                                  9/30
+                                  ----
+execute_cmd.c
+       - shell_execve: add strerror to error message about executable file
+         that shell can't execute as a shell script.  From suggestion by
+         daysleeper <daysleeper@centrum.cz>
+
+                                  10/1
+                                  ----
+bashhist.c
+       - maybe_add_history: act as if literal_history is set when parser_state
+         includes PST_HEREDOC, so we save the bodies of here-documents just
+         as they were entered.  Fixes bug reported by Jonathan Wakely
+         <bugs@kayari.org>
+       - bash_add_history: make sure that the second and subsequent lines of
+         a here document don't have extra newlines or other delimiting
+         chars added, since they have the trailing newline preserved, when
+         `lithist' is set and history_delimiting_chars isn't called
+
+execute_cmd.c
+       - execute_command_internal: avoid fd exhaustion caused by using
+         process substitution in loops inside shell functions by using
+         copy_fifo_list and close_new_fifos ().  Fixes debian bash bug
+         642504
+
+lib/readline/complete.c
+       - new variable, rl_filename_stat_hook, used by append_to_match.  If
+         filename completion is desired, and rl_filename_stat_hook points
+         to a function, call that function to expand the filename in an
+         application-specific way before calling stat.
+
+bashline.c
+       - bash_default_completion: if variable completion returns a single
+         match, use bash_filename_stat_hook and file_isdir to determine
+         whether or not the variable name expands to a directory.  If it
+         does, set the filename_append_character to `/'.  This is not
+         perfect, so we will see how it works out.  Adds functionality
+         requested by Peter Toft <pto@linuxbog.dk> and Patrick Pfeifer
+         <patrick@pfeifer.de>
+       - rl_filename_stat_hook: assigned bash_filename_stat_hook, so things
+         like $HOME/Downloads (after completion) have a slash appended.
+         In general, this causes the stat hook to be called whenever
+         filename completion is appended.  Adds functionality requested by
+         Patrick Pfeifer <patrick@pfeifer.de>
+
+lib/readline/readline.h
+       - new extern declaration for rl_filename_stat_hook
+
+lib/readline/doc/rltech.texi
+       - rl_directory_rewrite_hook: now documented
+       - rl_filename_stat_hook: document
+
+pcomplete.c
+       - gen_action_completions: in the CA_DIRECTORY case, turn off
+         rl_filename_completion_desired if it was off before we called
+         rl_filename_completion_function and we didn't get any matches.
+         Having it on causes readline to quote the matches as if they
+         were filenames.  Adds functionality requested by many,
+         including Clark Wang <dearvoid@gmail.com>
+
+assoc.[ch]
+       - assoc_replace: new function, takes the same arguments as
+         assoc_insert, but returns the old data instead of freeing it
+       - assoc_insert: if the object returned by hash_insert doesn't have
+         the same value for its key as the key passed as an argument, we
+         are overwriting an existing value.  In this case, we can free the
+         key.  Fixes bug reported by David Parks <davidparks21@yahoo.com>
+
+                                  10/5
+                                  ----
+print_cmd.c
+       - indirection_level_string: small change to only re-enable `x'
+         option after calling decode_prompt_string if it was on before.  In
+         normal mode, it will be, but John Reiser <jreiser@bitwagon.com>
+         has a novel use for that code in conjunction with a pre-loaded
+         shared library that traces system call usage in shell scripts
+
+                                  10/10
+                                  -----
+Makefile.in
+       - Fix from Mike Frysinger <vapier@gentoo.org> to avoid trying to
+         build y.tab.c and y.tab.h with two separate runs of yacc if
+         parse.y changes.  Problem with parallel makes
+       - Fix from Mike Frysinger <vapier@gentoo.org> to avoid subdirectory
+         builds each trying to make version.h (and all its dependencies)
+
+lib/sh/Makefile.in
+       - remove some dependencies on version.h where it doesn't make sense
+
+variables.c
+       - initialize_shell_variables: while reading the environment, a shell
+         running in posix mode now checks for SHELLOPTS being readonly (it
+         gets set early on in main()) before trying to assign to it.  It
+         saves an error message and the variable gets parsed as it should.
+         Fixes bug reported by Len Giambrone <Len.Giambrone@intersystems.com>
+
+                                  10/14
+                                  -----
+doc/{bash.1,bashref.texi}
+       - add to the "duplicating file descriptors" description that >&word
+         doesn't redirect stdout and stderr if word expands to `-'
+       - add to the "appending standard output and standard error"
+         description a note that >&word, where word is a number or `-',
+         causes other redirection operators to apply for sh and Posix
+         compatibility reasons.  Suggested by Greg Wooledge
+         <wooledg@eeg.ccf.org>
+
+                                  10/15
+                                  -----
+pcomplete.c
+       - change pcomp_filename_completion_function to only run the filename
+         dequoting function in the cases (as best as it can figure) where
+         readline won't do it via rl_filename_completion_function.  Based
+         on reports from <lolilolicon@gmail.com>
+
+                                  10/19
+                                  -----
+bashline.c
+       - attempt_shell_completion: add call to set_directory_hook() to make
+         sure the rewrite functions are correct.  It's cheap and doesn't
+         hurt
+       - command_word_completion_function: if completing a command name that
+         starts with `.' or `..', temporarily suppress the effects of the
+         `direxpand' option and restore the correct value after calling
+         rl_filename_completion_function.  If it's enabled, the directory
+         name will be rewritten and no longer match `./' or `../'.  Fixes
+         problem reported by Michael Kalisz <michael@kalisz.homelinux.net>
+
+                                  10/22
+                                  -----
+builtins/history.def
+       - push_history: make sure remember_on_history is enabled before we
+         try to delete the last history entry -- the `history -s' command
+         might not have been saved.  Fixes bug reported by
+         lester@vmw-les.eng.vmware.com
+
+lib/readline/complete.c
+       - rl_callback_read_char: add calls to a macro CALLBACK_READ_RETURN
+         instead of straight return; add same call at end of function.
+         Placeholder for future work in deinstalling signal handlers when
+         readline is not active
+
+                                  10/25
+                                  -----
+expr.c
+       - exp2: catch arithmetic overflow when val1 == INTMAX_MIN and val2 == -1
+         for DIV and MOD and avoid SIGFPE.  Bug report and pointer to fix
+         from Jaak Ristioja <jaak.ristioja@cyber.ee>
+       - expassign: same changes for arithmetic overflow for DIV and MOD
+
+                                  10/28
+                                  -----
+subst.c
+       - parameter_brace_expand: allow pattern substitution when there is an
+         expansion of the form ${var/} as a no-op: replacing nothing with
+         nothing
+       - parameter_brace_patsub: don't need to check for PATSUB being NULL;
+         it never is
+
+flags.c
+       - if STRICT_POSIX is defined, initialize history_expansion to 0, since
+         history expansion (and its treatment of ! within double quotes) is
+         not a conforming posix environment.  From austin-group issue 500
+
+lib/readline/histexpand.c
+       - history_expand: when processing a string within double quotes
+         (DQUOTE == 1), make the closing double quote inhibit history
+         expansion, as if the word were outside double quotes.  In effect,
+         we assume that the double quote is followed by a character in
+         history_no_expand_chars.  tcsh and csh seem to do this.  This
+         answers a persistent complaint about history expansion
+
+                                  10/29
+                                  -----
+make_cmd.c
+       - make_arith_for_command: use skip_to_delim to find the next `;'
+         when breaking the string between the double parens into three
+         separate components instead of a simple character loop.  Fixes
+         bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  11/2
+                                  ----
+Makefile.in
+       - make libbuiltins.a depend on builtext.h to serialize its creation
+         and avoid conflict between multiple invocations of mkbuiltins.
+         Fix from Mike Frysinger <vapier@gentoo.org>
+
+                                  11/5
+                                  ----
+findcmd.c
+       - user_command_matches: if stat(".", ...) returns -1, set st_dev
+         and st_ino fields in dotinfo to 0 to avoid same_file matches
+       - find_user_command_in_path: check stat(2) return the same way
+
+lib/glob/glob.c
+       - glob_vector: don't call strlen(pat) without checking pat == 0
+       - glob_dir_to_array: make sure to free `result' and all allocated
+         members before returning error due to malloc failure
+       - glob_vector: make sure to free `nextname' and `npat' on errors
+         (mostly when setting lose = 1)
+       - glob_vector: if flags & GX_MATCHDIRS but not GX_ALLDIRS, make
+         sure we free `subdir'
+       - glob_filename: when expanding ** (GX_ALLDIRS), make sure we
+         free temp_results (return value from glob_vector)
+
+lib/glob/xmbsrtowcs.c
+       - xdupmbstowcs: fix call to realloc to use sizeof (char *) instead
+         of sizeof (char **) when assigning idxtmp
+
+execute_cmd.c
+       - print_index_and_element: return 0 right away if L == 0
+       - is_dirname: fix memory leak by freeing `temp'
+       - time_command: don't try to deref NULL `command' when assigning
+         to `posix_time'
+       - shell_execve: null-terminate `sample' after READ_SAMPLE_BUF so it's
+         terminated for functions that expect that
+
+builtins/read.def
+       - read_builtin: don't call bind_read_variable with a potentially-null
+         string
+
+pcomplete.c
+       - gen_command_matches: don't call dispose_word_desc with a NULL arg
+       - gen_compspec_completions: fix memory leak by freeing `ret' before
+         calling gen_action_completions (tcs, ...).  happens when
+         performing directory completion as default and no completions
+         have been generated
+       - gen_progcomp_completions: make sure to set foundp to 0 whenever
+         returning NULL
+       - it_init_aliases: fix memory leak by freeing alias_list before
+         returning
+
+bashline.c
+       - command_word_completion_function: don't call restore_tilde with a
+         NULL directory_part argument
+       - bash_directory_expansion: bugfix: don't throw away results of
+         rl_directory_rewrite_hook if it's set and returns non-zero
+       - bind_keyseq_to_unix_command: free `kseq' before returning error
+
+arrayfunc.c
+       - assign_array_element_internal: make sure `akey' is freed if non-null
+         before returning error
+       - assign_compound_array_list: free `akey' before returning error
+       - array_value_internal: free `akey' before returning error
+       - unbind_array_element: free `akey' before returning error
+
+subst.c
+       - array_length_reference: free `akey' before returning error in case
+         of expand_assignment_string_to_string error
+       - array_length_reference: free `akey' after call to assoc_reference
+       - skip_to_delim: if skipping process and command substitution, free
+         return value from extract_process_subst
+       - parameter_brace_substring: free `val' (vtype == VT_VARIABLE) before
+         returning if verify_substring_values fails
+       - parameter_brace_expand: remove two duplicate lines that allocate
+         ret in parameter_brace_substring case
+       - parameter_brace_expand: convert `free (name); name = xmalloc (...)'
+         to use `xrealloc (name, ...)'
+       - parameter_brace_expand: free `name' before returning when handling
+         ${!PREFIX*} expansion
+       - split_at_delims: fix memory leak by freeing `d2' before returning
+
+redir.c
+       - redirection_error: free `filename' if the redirection operator is
+         REDIR_VARASSIGN by assigning allocname
+
+eval.c
+       - send_pwd_to_eterm: fix memory leak by freeing value returned by
+         get_working_directory()
+
+builtins/cd.def
+       - change_to_directory: fix memory leak by freeing return value from
+         resetpwd()
+       - cd_builtin: fix memory leak by freeing value returned by dirspell()
+       - cd_builtin: fix memory leak by freeing `directory' if appropriate
+         before overwriting with return value from resetpwd()
+
+builtins/type.def
+       - describe_command: free `full_path' before overwriting it with return
+         value from sh_makepath
+
+builtins/complete.def
+       - compgen_builtin: fix memory leak by calling strlist_dispose (sl)
+         before overwriting sl with return value from completions_to_stringlist
+
+builtins/hash.def
+       - list_hashed_filename_targets: fix memory leak by freeing `target'
+
+make_cmd.c
+       - make_arith_for_command: free `init', `test', and `step' before
+         returning error on parse error
+
+jobs.c
+       - initialize_job_control: don't call move_to_high_fd if shell_tty == -1
+
+general.c
+       - check_dev_tty: don't call close with an fd < 0
+       - legal_number: deal with NULL `string' argument, return invalid
+
+lib/sh/fmtulong.c
+       - fmtulong: if the `base' argument is invalid, make sure we index
+         buf by `len-1' at maximum
+
+print_cmd.c
+       - print_deferred_heredocs: don't try to dereference a NULL `cstring'
+       - cprintf: make sure to call va_end (args)
+
+variables.c
+       - push_dollar_vars: fix call to xrealloc to use sizeof (WORD_LIST *)
+         instead of sizeof (WORD_LIST **)
+
+lib/sh/zmapfd.c
+       - zmapfd: if read returns error, free result and return -1 immediately
+         instead of trying to reallocate it
+
+                                  11/6
+                                  ----
+execute_cmd.c
+       - cpl_reap: rewrote to avoid using pointer after freeing it; now builds
+         new coproc list on the fly while traversing the old one and sets the
+         right values for coproc_list when done
+
+                                  11/12
+                                  -----
+builtins/set.def
+       - if neither -f nor -v supplied, don't allow a readonly function to
+         be implicitly unset.  Fixes bug reported by Jens Schmidt
+         <jens.schmidt35@arcor.de>
+
+lib/readline/callback.c
+       - change CALLBACK_READ_RETURN to clear signal handlers before returning
+         from rl_callback_read_char so readline's signal handlers aren't
+         installed when readline doesn't have control.  Idea from Jan
+         Kratochvil <jan.ktratochvil@redhat.com> and the GDB development
+         team
+
+pcomplete.h
+       - COPT_NOQUOTE: new complete/compgen option value
+
+builtins/complete.def
+       - noquote: new complete/compgen option; will be used to disable
+         filename completion quoting
+
+pcomplete.c
+       - pcomp_set_readline_variables: pay attention to COPT_NOQUOTE; turns
+         of rl_filename_quoting_desired if set; turns it on if unset (value
+         is inverted, since default is on)
+
+doc/bash.1,lib/readline/doc/rluser.texi
+       - document new -o noquote option to complete/compgen/compopt
+
+pathexp.c
+       - quote_string_for_globbing: if QGLOB_REGEXP, make sure characters
+         between brackets in an ERE bracket expression are not inappropriately
+         quoted with backslashes.  This is a pretty substantial change,
+         should be stressed when opening bash up for alpha and beta tests.
+         Fixes bug pointed out by Stephane Chazleas
+         <stephane_chazelas@yahoo.fr>
+
+doc/{bash.1,bashref.texi}
+       - document that regexp matches can be inconsistent when quoting
+         characters in bracket expressions, since usual quoting characters
+         lose their meaning within brackets
+       - note that regular expression matching when the pattern is stored
+         in a shell variable which is quoted for expansion causes string
+         matching
+
+redir.h
+       - RX_SAVEFD: new flag value; notes that a redirection denotes an
+         fd used to save another even if it's not >= SHELL_FD_BASE
+
+redir.c
+       - do_redirection_internal: when deciding whether or not to reset the
+         close-on-exec flag on a restored file descriptor, trust the value
+         of redirect->flags & RX_SAVCLEXEC even if the fd is < SHELL_FD_BASE
+         if the RX_SAVEFD flag is set
+       - add_undo_redirect: set the RX_SAVEFD flag if the file descriptor
+         limit is such that the shell can't duplicate to a file descriptor
+         >= 10.  Fixes a limitation that tripped a coreutils test reported
+         by Paul Eggert <eggert@cs.ucla.edu>
+
+                                  11/19
+                                  -----
+doc/{bash.1,bashref.texi},lib/readline/doc/hsuser.texi
+       - make it clear that bash runs HISTFILESIZE=$HISTSIZE after reading
+         the startup files
+       - make it clear that bash runs HISTSIZE=500 after reading the
+         startup files
+       - make it clear that setting HISTSIZE=0 causes commands to not be
+         saved in the history list
+       - make it clear that setting HISTFILESIZE=0 causes the history file
+         to be truncated to zero size
+
+variables.c
+       - sv_histsize: change so setting HISTSIZE to a value less than 0
+         causes the history to be `unstifled'
+       - sv_histsize: change so setting HISTFILESIZE to a value less than 0
+         results in no file truncation
+       - make it clear that numeric values less than 0 for HISTFILESIZE or
+         HISTSIZE inhibit the usual functions
+
+                                  11/23
+                                  -----
+parse.y
+       - save_input_line_state: add missing `return ls' at the end, since the
+         function is supposed to return its argument.  Pointed out by
+         Andreas Schwab <schwab@linux-m68k.org>
+
+builtins/read.def
+       - skip over NUL bytes in input, as most modern shells seem to.  Bug
+         report by Matthew Story <matt@tablethotels.com>
+
+lib/readline/vi_mode.c
+       - rl_vi_replace: set _rl_vi_last_key_before_insert to invoking key
+
+                                  11/25
+                                  -----
+builtins/read.def
+       - read_builtin: if xrealloc returns same pointer as first argument,
+         don't bother with the remove_unwind_protect/add_unwind_protect pair
+       - read_builtin: set a flag (`reading') around calls to zread/zreadc
+         and readline()
+       - sigalrm: change to set flag (`sigalrm_seen') and only longjmp if
+         currently in read(2) (reading != 0)
+       - CHECK_ALRM: new macro, checks sigalrm_seen and longjmps if non-zero,
+         behavior of old SIGALRM catching function
+       - read_builtin: call CHECK_ALRM in appropriate places while reading
+         line of input.  Fixes bug reported by Pierre Gaston
+         <pierre.gaston@gmail.com>
+
+lib/readline/vi_mode.c
+       - rl_vi_replace: initialize characters before printing characters in
+         vi_replace_keymap to their default values in vi_insertion_keymap,
+         since we're supposed to be in insert mode replacing characters
+       - rl_vi_replace: call rl_vi_start_inserting to set last command to
+         `R' for undo
+       - rl_vi_replace: set _rl_vi_last_key_before_insert to `R' for future
+         use by _rl_vi_done_inserting
+       - vi_save_insert_buffer: new function, broke out code that copies text
+         into vi_insert_buffer from _rl_vi_save_insert
+       - _rl_vi_save_replace: new function, saves text modified by
+         rl_vi_replace (using current point and vi_replace_count to figure
+         it out) to vi_replace_buffer
+       - _rl_vi_save_insert: call vi_save_insert_buffer
+       - _rl_vi_done_inserting: if _rl_vi_last_key_before_insert == 'R', call
+         _rl_vi_save_replace to save text modified in replace mode (uses
+         vi_save_insert_buffer)
+       - _rl_vi_replace_insert: new function, replaces the number of chars
+         in vi_insert_buffer after rl_point with contents ov vi_insert_buffer
+       - rl_vi_redo: call _rl_vi_replace_insert if last command == 'R' and
+         there's something in vi_insert_buffer.  Fixes bug with `.' not
+         redoing the most recent `R' command, reported by Geoff Clare
+         <g.clare@opengroup.org> in readline area on savannah
+
+                                  11/26
+                                  -----
+lib/readline/rlprivate.h
+       - RL_SIG_RECEIVED(): evaluate to non-zero if there is a pending signal
+         to be handled
+       - RL_SIGINT_RECEIVED(): evaluate to non-zero if there is a pending
+         SIGINT to be handled
+
+lib/readline/complete.c
+       - remove all mention of _rl_interrupt_immediately
+       - rl_completion_matches: check RL_SIG_RECEIVED after each call to
+         the entry function, call RL_CHECK_SIGNALS if true to handle the
+         signal
+       - rl_completion_matches: if RL_SIG_RECEIVED evaluates to true, free
+         and zero out the match_list this function allocated
+       - rl_completion_matches: if the completion entry function is
+         rl_filename_completion_function, free the contents of match_list,
+         because that function does not keep state and will not free the
+         entries; avoids possible memory leak pointed out by
+         Garrett Cooper <yanegomi@gmail.com>
+       - gen_completion_matches: if RL_SIG_RECEIVED evalutes to true after
+         calling rl_attempted_completion_function, free the returned match
+         list and handle the signal with RL_CHECK_SIGNALS; avoids
+         possible memory leak pointed out by Garrett Cooper
+         <yanegomi@gmail.com>
+       - gen_completion_matches: if RL_SIG_RECEIVED evaluates to true after
+         calling rl_completion_matches, free the returned match list and
+         handle the signal with RL_CHECK_SIGNALS
+
+lib/readline/util.c
+       - rl_settracefp: new utility function to set the tracing FILE *
+
+lib/readline/signals.c
+       - _rl_sigcleanup: pointer to a function that will be called with the
+         signal and a void * argument from _rl_handle_signal
+       - _rl_sigcleanarg: void * that the rest of the code can set to have
+         passed to the signal cleanup function
+       - _rl_handle_signal: if _rl_sigcleanup set, call as
+               (*_rl_sigcleanup) (sig, _rl_sigcleanarg)
+
+lib/readline/rlprivate.h
+       - extern declarations for _rl_sigcleanup and _rl_sigcleanarg
+
+lib/readline/complete.c
+       - _rl_complete_sigcleanup: signal cleanup function for completion code;
+         calls _rl_free_match_list on _rl_sigcleanarg if signal == SIGINT
+       - rl_complete_internal: before calling display_matches if what_to_do
+         == `?', set _rl_sigcleanup to _rl_complete_sigcleanup so the match
+         list gets freed on SIGINT; avoids possible memory leak pointed out
+         by Garrett Cooper <yanegomi@gmail.com>
+       - rl_complete_internal: in default switch case, call _rl_free_match_list
+         before returning to avoid memory leak
+
+doc/bashref.texi
+       - start at a set of examples for the =~ regular expression matching
+         operator, touching on keeping the pattern in a shell variable and
+         quoting portions of the pattern to remove their special meaning
+
+                                  12/1
+                                  ----
+lib/glob/gmisc.c
+       - extglob_pattern: new function, returns 1 if pattern passed as an
+         argument looks like an extended globbing pattern
+
+lib/glob/glob.c
+       - skipname: return 0 immediately if extglob_pattern returns non-zero,
+         let the extended globbing code do the right thing with skipping
+         names beginning with a `.'
+       - mbskipname: return 0 immediately if extglob_pattern returns non-zero,
+         let the extended globbing code do the right thing with skipping
+         names beginning with a `.'.  Fixes bug reported by Yongzhi Pan
+         <panyongzhi@gmail.com>
+
+                                  12/2
+                                  ----
+lib/glob/smatch.c
+       - patscan, patscan_wc: no longer static so other parts of the glob
+         library can use them, renamed to glob_patscan, glob_patscan_wc
+
+lib/glob/glob.c
+       - extern declarations for glob_patscan, glob_patscan_wc
+       - wchkname: new function, does skipname on wchar_t pattern and dname,
+         old body of mbskipname after converting to wide chars
+       - extglob_skipname: new function, checks all subpatterns in an extglob
+         pattern to determine whether or not a filename should be skipped.
+         Calls skipname for each subpattern.  Dname is only skipped if all
+         subpatterns indicate it should be.  Better fix for bug reported by
+         Yongzhi Pan <panyongzhi@gmail.com>
+       - wextglob_skipname: wide-char version of extglob_skipname, calls
+         wchkname instead of calling back into mbskipname for each
+         subpattern to avoid problems with char/wchar_t mismatch
+       - skipname: call extglob_skipname if extglob_pattern returns non-zero
+       - mbskipname: call wextglob_skipname if extglob_pattern returns non-zero
+       - mbskipname: short-circuit immediately if no multibyte chars in
+         pattern or filename
+
+execute_cmd.c
+       - execute_cond_node: added parens to patmatch assignment statement to
+         make intent clearer
+
+                                  12/3
+                                  ----
+configure.in,config.h.in
+       - check for imaxdiv, define HAVE_IMAXDIV if present
+
+expr.c
+       - expassign, exp2: use imaxdiv if available.  Doesn't help with checks
+         for overflow from 10/25
+
+                                  12/6
+                                  ----
+lib/readline/complete.c
+       - compute_lcd_of_matches: if we're ignoring case in the matches, only
+         use what the user typed as the lcd if it matches the first match
+         (after sorting) up to the length of what was typed (if what the
+         user typed is longer than the shortest of the possible matches, use
+         the shortest common length of the matches instead).  If it doesn't
+         match, use the first of the list of matches, as if case were not
+         being ignored.  Fixes bug reported by Clark Wang
+         <dearvoid@gmail.com>
+
+                                  12/7
+                                  ----
+builtins/cd.def
+       - cd_builtin: add code to return error in case cd has more than one
+         non-option argument, conditional on CD_COMPLAINS define (which is
+         not defined anywhere)
+
+doc/{bash.1,bashref.texi}
+       - note that additional arguments to cd following the directory name
+         are ignored.  Suggested by Vaclav Hanzl <hanzl@noel.feld.cvut.cz>
+
+                                  12/10
+                                  -----
+lib/readline/input.c
+       - rl_read_key: don't need to increment key sequence length here; doing
+         it leads to an off-by-one error
+
+lib/readline/macro.c
+       - rl_end_kbd_macro: after off-by-one error with rl_key_sequence_length
+         fixed, can decrement current_macro_index by rl_key_sequence_length
+         (length of key sequence that closes keyboard macro)
+
+lib/readline/readline.c
+       - _rl_dispatch_subseq: fix extra increment of rl_key_sequence_length
+         when ESC maps to a new keymap and we're converting meta characters
+         to ESC+key
+       - _rl_dispatch_subseq: better increment of rl_key_sequence_length
+         before we dispatch to a function in the ISFUNC case (where the
+         second increment above should have happened)
+       - rl_executing_keyseq: the full key sequence that ended up executing
+         a readline command.  Available to the calling application, maintained
+         by _rl_dispatch_subseq, indexed by rl_key_sequence_length
+       - rl_executing_key: the key that was bound to the currently-executing
+         readline command.  Same as the `key' argument to the function
+
+lib/readline/readline.h
+       - rl_executing_keyseq: extern declaration
+       - rl_executing_key: extern declaration
+       - rl_key_sequence_length: declaration moved here from rlprivate.h,
+         now part of public interface
+
+lib/readline/rlprivate.h
+       - new extern declaration for _rl_executing_keyseq_size, buffer size
+         for rl_executing_keyseq
+
+lib/readline/doc/rltech.texi
+       - documented new variables: rl_executing_key, rl_executing_keyseq,
+         rl_key_sequence_length
+
+                                  12/13
+                                  -----
+bashline.c
+       - bash_execute_unix_command: replace ad-hoc code that searches
+         cmd_xmap for correct command with call to rl_function_of_keyseq
+         using rl_executing_keyseq; now supports key sequences longer
+         than two characters.  Fixes bug reported by Michael Kazior
+         <kazikcz@gmail.com>
+
+                                  12/15
+                                  -----
+make_cmd.c
+       - make_function_def: don't null out source_file before calling
+         make_command so it can be used later on when the function definition
+         is executed
+
+execute_cmd.c
+       - execute_intern_function: second argument is now FUNCTION_DEF *
+         instead of COMMAND *
+       - execute_command_internal: call execute_intern_function with the
+         new second argument (the entire FUNCTION_DEF instead of just the
+         command member)
+       - execute_intern_function: if DEBUGGER is defined, call
+         bind_function_def before calling bind_function, just like
+         make_function_def does (might be able to take out the call in
+         make_function_def depending on what the debugger does with it).
+         Fixes bug reported by <dethrophes@motd005>
+
+expr.c
+       - more minor changes to cases of INTMAX_MIN % -1 and INTMAX_MIN / 1;
+         fix typos and logic errors
+
+                                  12/16
+                                  -----
+bashline.c
+       - find_cmd_start: change flags to remove SD_NOSKIPCMD so it skips over
+         command substitutions and doesn't treat them as command separators
+       - attempt_shell_completion: instead of taking first return from
+         find_cmd_name as command name to use for programmable completion,
+         use loop to skip over assignment statements.  Fixes problem reported
+         by Raphael Droz <raphael.droz+floss@gmail.com>
+       - attempt_shell_completion: if we don't find a command name but the
+         command line is non-empty, assume the other words are all assignment
+         statements and flag that point is in a command position so we can
+         do command name completion
+       - attempt_shell_completion: if the word being completed is the first
+         word following a series of assignment statements, and the
+         command line is non-empty, flag that point is in a command position
+         so we can do command name completion
+
+lib/readline/history.c
+       - history_get_time: atol -> strtol
+
+                                  12/18
+                                  -----
+parse.y
+       - parser_in_command_position: external interface to the
+         command_token_position macro for use by other parts of the shell,
+         like the completion mechanism
+
+externs.h
+       - extern declaration for parser_in_command_position
+
+                                  12/19
+                                  -----
+
+builtins/read.def
+       - read_builtin: make sure all calls to bind_read_variable are passed
+         a non-null string.  Fixes bug reported by Dan Douglas
+         <ormaaj@gmail.com>
+
+bashline.c
+       - attempt_shell_completion: mark that we're in a command position if
+         we're at the start of the line and the parser is ready to accept
+         a reserved word or command name.  Feature most recently suggested
+         by Peng Yu <pengyu.ut@gmail.com>
+
+                                  12/21
+                                  -----
+lib/readline/bind.c
+       - _rl_escchar: return the character that would be backslash-escaped
+         to denote the control character passed as an argument ('\n' -> 'n')
+       - _rl_isescape: return 1 if character passed is one that has a
+         backslash escape
+       - _rl_untranslate_macro_value: new second argument: use_escapes, if
+         non-zero translate to backslash escapes where possible instead of
+         using straight \C-x for control character `x'.  Change callers
+       - _rl_untranslate_macro_value: now global
+
+lib/readline/rlprivate.h
+       - _rl_untranslate_macro_value: extern declaration
+
+lib/readline/{macro.c,readline.h}
+       - rl_print_last_kbd_macro: new bindable function, inspired by patch
+         from Mitchel Humpherys
+
+lib/readline/funmap.c
+       - print-last-kbd-macro: new bindable command, bound to
+         rl_print_last_kbd_macro
+
+lib/readline/doc/{rluser.texi,readline.3},doc/bash.1
+       - print-last-kbd-macro: document.
+
+lib/readline/text.c
+       - _rl_insert_next: if we're defining a macro, make sure the key gets
+         added to the macro text (should really audit calls to rl_read_key()
+         and make sure the right thing is happening for all of them)
+
+bashline.[ch]
+       - print_unix_command_map: new function, prints all bound commands in
+         cmd_xmap using rl_macro_dumper in a reusable format
+
+builtins/bind.def
+       - new -X option: print all keysequences bound to Unix commands using
+         print_unix_command_map.  Feature suggested by Dennis Williamson
+         (2/2011)
+
+doc/{bash.1,bashref.texi}
+       - document new `bind -X' option
+
+                                  12/24
+                                  -----
+
+doc/{bash.1,bashref.texi}
+       - add a couple of sentences to the description of the case modification
+         operators making it clearer that each character of parameter is
+         tested against the pattern, and that the pattern should only attempt
+         to match a single character.  Suggested by Bill Gradwohl
+         <bill@ycc.com>
+
+                                  12/28
+                                  -----
+shell.c
+       - init_noninteractive: instead of calling set_job_control(0) to
+         unconditionally turn off job control, turn on job control if
+         forced_interactive or jobs_m_flag is set
+       - shell_initialize: call initialize_job_control with jobs_m_flag as
+         argument so `bash -m script' enables job control while running the
+         script
+
+jobs.c
+       - initialize_job_control: if the `force' argument is non-zero, turn on
+         job control even if the shell is not currently interactive
+         (interactive == 0)
+
+                                  12/29
+                                  -----
+
+flags.h
+       - new extern declaration for jobs_m_flag
+
+builtins/{cd,set}.def,doc/{bash.1,bashref.texi}
+       - added text clarifying the descriptions of cd -L and -P, suggested by
+         Padraig Brady <p@draigbrady.com>
+       - slight change to the description of `set -P' about resolving symbolic
+         links
+
+lib/readline/doc/rluser.texi
+       - Added an example to the programmable completion section: _comp_cd,
+         a completion function for cd, with additional verbiage.  Text
+         includes a reference to the bash_completion project
+
+                                1/1/2012
+                                --------
+jobs.c
+       - set_job_status_and_cleanup: note that a job is stopped due to
+         SIGTSTP (any_tstped) if job_control is set; there's no need to
+         test interactive
+
+                                   1/5
+                                   ---
+quit.h
+       - LASTSIG(): new macro, expands to signal number of last terminating
+         signal received (terminating_signal or SIGINT)
+
+trap.c
+       - first_pending_trap: returns lowest signal number with a trap pending
+       - trapped_signal_received: set to the last trapped signal the shell
+         received in trap_handler(); reset to 0 in run_pending_traps
+
+builtins/read.def
+       - read_builtin: changes to posix-mode (posixly_correct != 0) to make
+         `read' interruptible by a trapped signal.  After the trap runs,
+         read returns 128+sig and does not assign the partially-read line
+         to the named variable(s).  From an austin-group discussion started
+         by David Korn
+
+                                  1/11
+                                  ----
+doc/{bash.1,bashref.texi}
+       - slight changes to the descriptions of the compat32 and compat40 shell
+         options to clarify their meaning
+
+                                  1/12
+                                  ----
+lib/readline/{colors.[ch],parse-colors.[ch]}
+       - new files, part of color infrastructure support
+
+Makefile.in,lib/readline/Makefile.in
+       - arrange to have colors.o and parse-colors.o added to readline
+         library
+
+{configure,config.h}.in
+       - check for stdbool.h, define HAVE_STDBOOL_H if found
+
+                                  1/14
+                                  ----
+lib/readline/bind.c
+       - colored_stats: new bindable variable, enables using colors to
+         indicate file type when listing completions
+
+lib/readline/complete.c
+       - _rl_colored_stats: new variable, controlled by colored-stats bindable
+         variable
+       - colored_stat_start, colored_stat_end: new functions to set and reset
+         the terminal color appropriately depending on the type of the
+         filename to be printed
+       - print_filename: changes to print colors if `colored-stats' variable
+         set.  Changes contributed by Raphael Droz
+         <raphael.droz+floss@gmail.com>
+
+lib/readline/readline.c
+       - rl_initialize_everything: add call to _rl_parse_colors to parse
+         color values out of $LS_COLORS.  May have to add to rl_initialize
+         to make more dynamic if LS_COLORS changes (which doesn't happen
+         very often, if at all)
+
+lib/readline/rlprivate.h
+       - _rl_colored_stats: new extern declaration
+
+lib/readline/doc/{readline.3,rluser.texi},doc/bash.1
+       - colored-stats: document new bindable readline variable
+
+lib/readline/colors.c
+       - _rl_print_color_indicator: call rl_filename_stat_hook before calling
+         lstat/stat so we can get color indicators for stuff like
+         $HOME/Applications
+
+lib/readline/complete.c
+       - stat_char: call rl_filename_stat_hook before calling lstat/stat
+
+findcmd.[ch],execute_cmd.c
+       - search_for_command: now takes a second `flags' argument; changed
+         header function prototype and callers
+       - search_for_command: if (flags & 1), put the command found in $PATH
+         into the command hash table (previous default behavior)
+
+execute_cmd.c
+       - is_dirname: call search_for_command with flags argument of 0 so it
+         doesn't try to put something in the command hash table
+
+bashline.c
+       - bash_command_name_stat_hook: a hook function for readline's
+         filename_stat_hook that does $PATH searching the same way that
+         execute_cmd.c:execute_disk_command() does it, and rewrites the
+         passed filename if found.  Does not put names into command hash
+         table.  This allows command name completion to take advantage
+         of `visible-stats' and `colored-stats' settings.
+       - executable_completion: new function, calls the directory completion
+         hook to expand the filename before calling executable_file or
+         executable_or_directory; change command_word_completion_function to
+         call executable_completion.  This allows $HOME/bin/[TAB] to do
+         command completion and display alternatives
+
+                                  1/17
+                                  ----
+pcomplete.c
+       - gen_command_matches: now takes a new second argument: the command
+         name as deciphered by the programmable completion code and used
+         to look up the compspec; changed callers (gen_compspec_completions)
+       - gen_shell_function_matches: now takes a new second argument: the
+         command that originally caused the completion function to be
+         invoked; changed callers (gen_compspec_completions))
+       - build_arg_list: now takes a new second argument: the command name
+         corresponding to the current compspec; changed callers
+         (gen_command_matches, gen_shell_function_matches)
+       - build_arg_list: now uses `cmd' argument to create $1 passed to
+         invoked command or shell function
+       - gen_compspec_completions: if we skipped a null command at the
+         beginning of the line (e.g., for completing `>'), add a new word for
+         it at the beginning of the word list and increment nw and cw
+         appropriately.  This is all a partial fix for the shortcoming
+         pointed out by Sung Pae <sungpae@gmail.com>
+
+                                  1/18
+                                  ----
+
+{configure,config.h}.in
+       - new check: check for AUDIT_USER_TTY defined in <linux/audit.h>,
+         define HAVE_DECL_AUDIT_USER_TTY if both are found
+
+lib/readline/rlconf.h
+       - ENABLE_TTY_AUDIT_SUPPORT: new define, allows use of the Linux kernel
+         tty auditing system if it's available and enabled
+
+lib/readline/util.c
+       - _rl_audit_tty: new function, send a string to the kernel tty audit
+         system
+
+lib/readline/rlprivate.h
+       - _rl_audit_tty: new extern declaration
+
+lib/readline/readline.c
+       - readline: call _rl_audit_tty with line to be returned before returning
+         it if the Linux tty audit system is available and it's been enabled
+         in rlconf.h  Original patch from Miroslav Trmac; recent request
+         from Miroslav Lichvar <mlichvar@redhat.com>
+
+                                  1/21
+                                  ----
+
+lib/readline/readline.c:
+       - _rl_dispatch_subseq: add an inter-character timeout for multi-char
+         key sequences.  Suggested by <rogerx.oss@gmail.com>.  Still needs
+         work to make a user-settable variable
+
+parse.y
+       - shell_getc: make code that uses the pop_alias dependent on ALIAS
+         define
+
+variables.h
+       - sv_tz: extern define should only depend on HAVE_TZSET
+
+expr.c
+       - expr_streval: if ARRAY_VARS is not defined, set lvalue->ind to -1;
+         move assignment to `ind' inside define
+       - expr_bind_array_element: declaration and uses need to be #ifdef
+         ARRAY_VARS
+
+arrayfunc.h
+       - AV_ALLOWALL, AV_QUOTED, AV_USEIND: define to 0 if ARRAY_VARS not
+         defined; used in subst.c unconditionally
+
+sig.h
+       - make the signal blocking functions not dependent on JOB_CONTROL
+
+sig.c
+       - sigprocmask: make the replacement definition not dependent on
+         JOB_CONTROL
+
+trap.c
+       - use BLOCK_SIGNAL/UNBLOCK_SIGNAL instead of code dependent on
+         HAVE_POSIX_SIGNALS and BSD signals
+
+                                  1/24
+                                  ----
+
+print_cmd.c
+       - print_redirection_list: change the conditions under which
+         r_duplicating_output_word is mapped to r_err_and_out to more or
+         less match those used in redir.c.  Fixes bug pointed out by
+         Dan Douglas <ormaaj@gmail.com>
+
+
+                                  1/29
+                                  ----
+lib/readline/signals.c
+       - _rl_block_sigwinch,_rl_release_sigwinch: don't compile in bodies
+         unless SIGWINCH is defined.  Fixes bug reported by Pierre Muller
+         <pierre.muller@ics-cnrs.unistra.fr>
+
+doc/{bash.1,bashref.texi}
+       - small modifications to the introduction to the REDIRECTION section
+         to describe how redirections can modify file handles
+       - small modification to the section describing base#n to make it
+         clearer that n can be denoted using non-numerics.  From a posting
+         by Linda Walsh <bash@tlinx.org>
+
+                                   2/2
+                                   ---
+builtins/printf.def
+       - printf_builtin: make sure vbuf is intialized and non-null when -v
+         is supplied, since other parts of the code assume that it's not
+         null (e.g., bind_printf_variable()).  Fixes bug reported by Jim
+         Avera <james_avera@yahoo.com>
+
+                                   2/4
+                                   ---
+lib/readline/undo.c
+       - _rl_free_undo_list: new function, old body of rl_free_undo_list,
+         frees undo entries in UNDO_LIST * passed as argument
+       - rl_free_undo_list: call _rl_free_undo_list
+
+lib/readline/rlprivate.h
+       - _rl_free_undo_list: new extern declaration
+       - _rl_keyseq_timeout: new extern declaration (see below)
+
+lib/readline/misc.c
+       - rl_clear_history: new function.  Clears the history list and frees
+         all associated data similar to history.c:clear_history(), but
+         takes rl_undo_list into account and frees and UNDO_LISTs saved as
+         `data' members of a history list entry
+
+lib/readline/doc/rltech.texi
+       - rl_clear_history: documented
+
+lib/readline/readline.c
+       - _rl_keyseq_timeout: new variable to hold intra-key timeout value
+         from 1/21 fix; specified in milliseconds.  Default value is 500
+       - _rl_dispatch_subseq: change to use _rl_keyseq_timeout as intra-key
+         timeout if it's greater than 0; no timeout if <= 0
+       - _rl_dispatch_subseq: don't check for queued keyboard input if we have
+         pushed or pending input, or if we're reading input from a macro
+
+lib/readline/bind.c
+       - keyseq-timeout: new bindable variable, shadows _rl_keyseq_timeout
+       - string_varlist: add keyseq-timeout
+       - sv_seqtimeout: new function to modify value of _rl_keyseq_timeout;
+         clamps negative values at 0 for now
+       - _rl_get_string_variable_value: return value for keyseq-timeout
+
+doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
+       - keyseq-timeout: documented
+
+lib/readline/isearch.c
+       - _rl_isearch_dispatch: modification to fix from 7/18 to not use
+         cxt->keymap and cxt->okeymap, since by the time this code is
+         executed, they are equal.  Use `f' to check for rl_insert or
+         unbound func
+       - _rl_isearch_dispatch: if we're switching keymaps, not in
+         callback mode, and don't have pending or pushed input, use
+         _rl_input_queued to resolve a potentially ambiguous key sequence.
+         Suggested by Roger Zauner <rogerx.oss@gmail.com>
+       - _rl_isearch_dispatch: if we have changed keymaps and resolved to
+         an editing function (not self-insert), make sure we stuff the
+         right characters back onto the input after changing the keymap
+         back so the right editing function is executed after the search
+         is terminated.  Rest of fix for bug reported by Roger Zauner
+         <rogerx.oss@gmail.com>
+
+                                   2/5
+                                   ---
+builtins/gen-helpfiles.c
+       - new file: reads struct builtin and writes the long docs to files
+         in the `helpdirs' subdirectory.  The filename is given in the
+         previously-unused `handle' member of the struct builtin.  Links
+         with `tmpbuiltins.o', which is created by Makefile to have the
+         right long documentation.  When not cross-compiling, gets the
+         right #defines based on configuration options from config.h instead
+         of trying to parse conditional parts of def files.  Fixes
+         shortcoming pointed out by Andreas Schwab <schwab@linux-m68k.org>
+
+builtins/Makefile.in
+       - tmpbuiltins.c: new generated file, created to enable creation of
+         separate helpfiles based on correct #defines instead of trying to
+         parse conditional parts of def files
+       - gen-helpfiles: new program to generate helpfiles, links with
+         tmpbuiltins.o
+       - HELPFILES_TARGET: new target, substituted by configure to `helpdoc'
+         if separate helpfiles requested
+       - targets: new target, libbuiltins.a and $(HELPFILES_TARGET)
+       - CREATED_OBJECTS: new variable, holds created object files for
+         make clean; changed make clean to remove created objects
+       - helpdoc: changed to call gen-helpfiles instead of mkbuiltins
+
+Makefile.in
+       - when building libbuiltins.a, recursively call make with `targets'
+         argument to make sure separate helpfiles get built
+
+configure.in
+       - substitute `helpdoc' as value of HELPFILES_TARGET if
+         --enable-separate-helpfiles supplied as configure argument
+
+builtins/mkbuiltins.c
+       - `-nofunctions': new argument, causes mkbuiltins to not write value
+         for function implementing a particular builtin to struct builtin
+         and to write document file name to `handle' member of struct builtin
+       - no longer writes separate helpfiles; that is left to gen-helpfiles
+
+                                   2/8
+                                   ---
+subst.c
+       - make sure last_command_exit_value is set to a non-zero value before
+         any calls to report_error, since `-e' set will short-circuit
+         report_error.  Fixes bug reported by Ewan Mellor
+         <Ewan.Mellor@eu.citrix.com>
+
+variables.c
+       - make_local_array_variable: added second argument; if non-zero,
+         function will return an existing local associative array variable
+         instead of insisting on an indexed array
+
+variable.h,subst.c
+       - make_local_array_variable: changed prototype and caller
+
+builtins/declare.def
+       - declare_internal: add second arg to call to make_local_array_variable;
+         making_array_special, which indicates we're processing an
+         assignment like declare a[b]=c.  Fixes seg fault resulting from
+         a being an already-declared local associative array variable in a
+         function.  Ubuntu bash bug 928900.
+
+                                  2/14
+                                  ----
+
+execute_cmd.c
+       - execute_command_internal: if redirections into or out of a loop fail,
+         don't try to free ofifo_list unless saved_fifo is non-zero.  It's
+         only valid if saved_fifo is set
+
+                                  2/15
+                                  ----
+{arrayfunc,braces,variables}.c
+       - last_command_exit_value: make sure it's set before any calls to
+         report_error, since -e will cause that to exit the shell
+
+builtins/common.c
+       - get_job_by_name: call internal_error instead of report_error so this
+         doesn't exit the shell
+
+                                  2/18
+                                  ----
+builtins/evalstring.c
+       - parse_and_execute: make sure the file descriptor to be redirected to
+         is 1 before calling cat_file.  One fix for bug reported by Dan Douglas
+         <ormaaj@gmail.com>
+
+parse.y
+       - read_token_word: don't return NUMBER if a string of all digits
+         resolves to a number that overflows the bounds of an intmax_t.
+         Other fix for bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  2/19
+                                  ----
+lib/sh/strtrans.c
+       - ansicstr: use 0x7f as the boundary for characters that translate
+         directly from ASCII to unicode (\u and \U escapes) instead of
+         UCHAR_MAX, since everything >= 0x80 requires more than one byte.
+         Bug and fix from John Kearney <dethrophes@web.de>
+
+builtins/printf.def
+       - tescape: ditto for printf \u and \U escape sequences
+
+                                  2/20
+                                  ----
+lib/sh/unicode.c
+       - u32toutf8: fix to handle encodings up to six bytes long correctly
+         (though technically UTF-8 only has characters up to 4 bytes long).
+         Report and fix from John Kearney <dethrophes@web.de>
+       - u32toutf8: first argument is now an unsigned 32-bit quantity,
+         changed callers (u32cconv) to pass c instead of wc
+       - u32reset: new function, resets local static state to uninitialized
+         (locale information, currently)
+
+locale.c
+       - call u32reset whenever LC_CTYPE/LC_ALL/LANG is changed to reset the
+         cached locale information used by u32cconv.  From a report from
+         John Kearney <dethrophes@web.de>
+
+                                  2/21
+                                  ----
+doc/{bash,builtins}.1
+       - minor changes from Bjarni Ingi Gislason <bjarniig@rhi.hi.is>
+
+lib/sh/unicode.c
+       - u32cconv: only assume you can directly call wctomb on the passed
+         value if __STDC_ISO_10646__ is defined and the value is <=
+         0x7fffffff
+       - stub_charset: return locale as default instead of "ASCII", let
+         rest of code decide what to do with it
+
+lib/readline/parens.c
+       - _rl_enable_paren_matching: make paren matching work in vi insert
+         mode.  Bug report from <derflob@derflob.de>
+
+                                  2/22
+                                  ----
+lib/sh/shquote.c
+       - sh_backslash_quote: quote tilde in places where it would be
+         expanded.  From a report from John Kearney <dethrophes@web.de>
+
+                                  2/23
+                                  ----
+execute_cmd.c
+       - execute_pipeline: wrap the discard_unwind_frame call in #ifdef
+         JOB_CONTROL, since the frame is only created if JOB_CONTROL is
+         defined.  Bug and fix from Doug Kehn <rdkehn@yahoo.com>
+
+                                  2/25
+                                  ----
+error.c
+       - report_error: make sure last_command_exit_value is non-zero before
+         we call exit_shell, since the exit trap may reference it.  Call
+         exit_shell with last_command_exit_value to allow exit statuses
+         other than 1
+
+unicode.c
+       - stub_charset: use local static buffer to hold charset, don't change
+         value returned by get_locale_var.  Based on idea and code from
+         John Kearney <dethrophes@web.de>
+       - u32toutf16: function to convert unsigned 32-bit value (unicode) to
+         UTF-16.  From John Kearney <dethrophes@web.de>
+       - u32cconv: call u32toutf16 if __STDC_ISO_10646__ defined and wchar_t
+         is two bytes, send result to wcstombs, return if not encoding error.
+         From John Kearney <dethrophes@web.de>
+       - u32cconv: return UTF-8 conversion if iconv conversion to local
+         charset is unsupported
+
+                                   3/2
+                                   ---
+lib/readline/complete.c
+       - print_filename: if there is no directory hook, but there is a stat
+         hook, and we want to append a slash to directories, call the stat
+         hook before calling path_isdir on the expanded directory name.
+         Report and pointer to fix from Steve Rago <sar@nec-labs.com>
+
+                                   3/3
+                                   ---
+builtins/evalstring.c
+       - parse_and_execute: fix to change of 2/18: make sure the file
+         descriptor being redirected to is 0 before calling cat_file when
+         we see something like $(< file).  Real fix for bug reported by
+         Dan Douglas <ormaaj@gmail.com>
+
+subst.c
+       - parameter_brace_patsub: run the replacement string through quote
+         removal even if the expansion is within double quotes, because
+         the parser and string extract functions treat the quotes and
+         backslashes as special.  If they're treated as special, quote
+         removal should remove them (this is the Posix position and
+         compatible with ksh93).  THIS IS NOT BACKWARDS COMPATIBLE.
+
+                                   3/4
+                                   ---
+lib/readline/complete.c
+       - rl_menu_complete: fix to make show-all-if-ambiguous and
+         menu-complete-display-prefix work together if both are set.  Fix
+         from Sami Pietila <sami.pietila@gmail.com>
+
+                                   3/5
+                                   ---
+bashline.c
+       - dircomplete_expand_relpath: new variable, if non-zero, means that
+         `shopt -s direxpand' should expand relative pathnames.  Zero by
+         default, not user-settable yet
+       - bash_directory_completion_hook: if we have a relative pathname that
+         isn't changed by canonicalization or spell checking after being
+         appended to $PWD, then don't change what the user typed.  Controlled
+         by dircomplete_expand_relpath
+
+                                   3/7
+                                   ---
+m4/timespec.m4
+       - new macros, cribbed from gnulib and coreutils: find out whether we
+         have `struct timespec' and what file includes it
+
+m4/stat-time.m4
+       - new macros, cribbed from gnulib and coreutils: find out whether the
+         mtime/atime/ctime/etctime fields of struct stat are of type
+         struct timespec, and what the name is
+
+include/stat-time.h
+       - new file, cribbed from gnulib, with additions from coreutils: include
+         the right file to get the struct timespec define, or provide our own
+         replacement.  Provides a bunch of inline functions to turn the
+         appropriate members of struct stat into `struct timespec' values,
+         zeroing out the tv_nsec field if necessary
+
+test.c
+       - include "stat-time.h" for the nanosecond timestamp resolution stuff
+       - stat_mtime: new function, returns struct stat and the mod time
+         normalized into a `struct timespec' for the filename passed as the
+         first argument
+       - filecomp: call stat_mtime instead of sh_stat for each filename
+         argument to get the mtime as a struct timespec
+       - filecomp: call timespec_cmp instead of using a straight arithmetic
+         comparison for the -nt and -ot operators, using timespec returned by
+         stat_mtime.  Added functionality requested by by Werner Fink
+         <werner@suse.de> for systems that can support it
+
+                                  3/10
+                                  ----
+include/posixdir.h
+       - REAL_DIR_ENTRY: remove dependency on _POSIX_SOURCE, only use feature
+         test macros to decide whether dirent.d_ino is present and usable;
+         define D_INO_AVAILABLE.  Report and fix from Fabrizion Gennari
+         <fabrizio.ge@tiscali.it>
+       - D_FILENO_AVAILABLE: define if we can use dirent.d_fileno
+
+lib/sh/getcwd.c
+       - use D_FILENO_AVAILABLE to decide whether or not to compile in
+         _path_checkino and whether or not to call it.  Report and initial
+         fix from Fabrizion Gennari <fabrizio.ge@tiscali.it>
+
+lib/readline/signals.c
+       - make sure all occurrences of SIGWINCH are protected by #ifdef
+
+sig.c
+       - make sure all occurrences of SIGCHLD are protected by #ifdef
+
+nojobs.c
+       - make sure SA_RESTART is defined to 0 if the OS doesn't define it
+
+version.c
+       - show_shell_version: don't use string literals in printf, use %s.
+         Has added benefit of removing newline from string to be translated
+
+trap.c
+       - queue_sigchld_trap: new function, increments the number of pending
+         SIGCHLD signals by the argument, which is by convention the number
+         of children reaped in a call to waitchld()
+
+trap.h
+       - queue_sigchld_trap: new extern declaration
+
+jobs.c
+       - waitchld: if called from the SIGCHLD signal handler (sigchld > 0),
+         then call queue_sigchld_trap to avoid running the trap in a signal
+         handler context.  Report and original fix from Siddhesh Poyarekar
+         <siddhesh@redhat.com>
+
+lib/sh/unicode.c
+       - u32tocesc: take an unsigned 32-bit quantity and encode it using
+         ISO C99 string notation (\u/\U)
+       - u32cconv: call u32tocesc as a fallback instead of u32cchar
+       - u32cconv: call u32tocesc if iconv cannot convert the character.
+         Maybe do the same thing if iconv_open fails
+       - u32reset: call iconv_close on localconv if u32init == 1
+
+                                  3/11
+                                  ----
+config-top.h
+       - CHECKWINSIZE_DEFAULT: new define, set to initial value of
+         check_window_size (shopt checkwinsize): 0 for off, 1 for on.
+         Default is 0
+
+{jobs,nojobs}.c
+       - check_window_size: default initial value to CHECKWINSIZE_DEFAULT
+
+                                  3/13
+                                  ----
+doc/bashref.texi
+       - change text referring to the copying restrictions to that
+         recommended by the FSF (no Front-Cover Texts and no Back-Cover
+         Texts)
+
+lib/readline/doc/{history,rlman,rluserman}.texi
+       - change text referring to the copying restrictions to that
+         recommended by the FSF (no Front-Cover Texts and no Back-Cover
+         Texts)
+
+                                  3/15
+                                  ----
+array.c
+       - LASTREF_START: new macro to set the starting position for an array
+         traversal to `lastref' if that's valid, and to the start of the array
+         if not.  Used in array_reference, array_insert, array_remove
+       - array_remove: try to be a little smarter with lastref instead of
+         unconditionally invalidating it
+
+                                  3/16
+                                  ----
+array.c
+       - array_insert: fix memory leak by deleting element to be added in the
+         case of an error
+
+                                  3/18
+                                  ----
+lib/sh/mbschr.c
+       - mbschr: don't call mbrlen unless is_basic is false; devolves to a
+         straight character-by-character run through the string
+
+                                  3/19
+                                  ----
+stringlib.c
+       - substring: use memcpy instead of strncpy, since we know the length
+         and are going to add our own NUL terminator
+
+                                  3/20
+                                  ----
+subst.c
+       - parameter_brace_expand_rhs: if expand_string_for_rhs returns a quoted
+         null string (a list with one element for which
+         QUOTED_NULL(list->word->word) returns true), return the quoted null
+         and set the flags in the returned word to indicate it.  Fixes bug
+         reported by Mark Edgar <medgar123@gmail.com>
+
+lib/sh/tmpfile.c
+       - use random(3) instead of get_random_number to avoid perturbing the
+         random sequence you get using $RANDOM.  Bug report and fix from
+         Jurij Mihelic <jurij.mihelic@fri.uni-lj.si>
+
+                                  3/21
+                                  ----
+config-top.h
+       - OPTIMIZE_SEQUENTIAL_ARRAY_ASSIGNMENT: define to 1 to optimize
+         sequential indexed array assignment patterns.  Defined to 1 by
+         default
+
+array.c
+       - array_insert: if OPTIMIZE_SEQUENTIAL_ARRAY_ASSIGNMENT is defined,
+         start the search at lastref (see change from 3/15)
+
+                                  3/27
+                                  ----
+print_cmd.c
+       - debug_print_word_list: new debugging function, prints a word list
+         preceded by an optional string and using a caller-specified
+         separator
+
+                                   4/1
+                                   ---
+command.h
+       - W_ASSNGLOBAL: new flag, set to indicate declare -g
+
+execute_cmd.c
+       - fix_assignment_words: note that we have a -g argument to an assignment
+         builtin and set the W_ASSNGLOBAL flag in the variable word
+
+subst.c
+       - dump_word_flags: print out W_ASSNGLOBAL if present
+       - do_assignment_internal: only set ASS_MKLOCAL if W_ASSIGNARG is set
+         and W_ASSNGLOBAL is not.  Don't want to create a local variable even
+         if variable_context is non-zero if ASSNGLOBAL is set.  Fixes bug
+         reported by Bill Gradwohl <bill@ycc.com>
+
+                                   4/7
+                                   ---
+lib/readline/readline.c
+       - _rl_dispatch_subseq: make the `keyseq-timeout' variable apply to
+         ESC processing when in vi mode.  After hitting ESC, readline will
+         wait up to _rl_keyseq_timeout*1000 microseconds (if set) for
+         additional input before dispatching on the ESC and switching to
+         command/movement mode.  Completes timeout work suggested by
+         <rogerx.oss@gmail.com>; this prompted by report from Barry Downes
+         <barry.downes@gmail.com>
+
+lib/sh/shmbchar.c
+       - sh_mbsnlen: new function, returns the number of (possibly multibyte)
+         characters in a passed string with a passed length, examining at most
+         maxlen (third argument) bytes
+
+externs.h
+       - sh_mbsnlen: extern declaration for new function
+
+shell.c
+       - exit_shell: call maybe_save_shell_history if remember_on_history is
+         set, not just in interactive shells.  That means the history is
+         saved if history is enabled, regardless of whether or not the shell
+         is interactive
+
+doc/{bash.1,bashref.texi}
+       - TMOUT: fix description to make it explicit that TMOUT is the timeout
+         period for a complete line of input, not just any input.  Fixes
+         problem reported in Ubuntu bug 957303:
+         https://bugs.launchpad.net/ubuntu/+source/bash/+bug/957303
+       - HISTFILE: document change to write history list to history file in
+         any shell with history enabled, not just interactive shells.  This
+         seems to be more logical behavior.  Suggested by Greg Wooledge
+         <wooledg@eeg.ccf.org>
+
+                                  4/12
+                                  ----
+lib/readline/colors.h
+       - only include stdbool.h if HAVE_STDBOOL_H is defined
+       - if HAVE_STDBOOL_H is not defined, provide enough definition for the
+         library to use `bool', `true', and `false'
+
+lib/readline/parse-colors.[ch]
+       - don't try to include <stdbool.h> at all; rely on colors.h to do it
+
+lib/sh/snprintf.c
+       - vsnprintf_internal: only treat '0' as a flag to indicate zero padding
+         if `.' hasn't been encountered ((flags&PF_DOT) == 0); otherwise treat
+         it as the first digit of a precision specifier.  Fixes bug reported
+         by Petr Sumbera <petr.sumbera@sun.com>
+
+                                  4/15
+                                  ----
+lib/sh/snprintf.c
+       - vsnprintf_internal: if the '0' and '-' flags both occur, the '0'
+         flag is ignored -- Posix.  Start of a series of fixes based on
+         tests and patches from Petr Sumbera <petr.sumbera@sun.com>
+       - PUT_PLUS: make sure PF_PLUS flag is specified before putting the `+'
+       - vsnprintf_internal: when '+' is read as a flag, don't set right-
+         justify flag if the LADJUST (`-') flag has already been supplied
+       - floating: make sure to output space padding before the `+', zero
+         padding after
+       - exponent: make sure to output space padding before the `+', zero
+         padding after
+       - exponent: only subtract one from the width for the decimal point
+         if we're really going to print one
+       - floating: use presence of PF_PLUS flag to decide whether to account
+         for the `+' in the padded field width.  Ditto for exponent()
+
+                                  4/16
+                                  ----
+lib/sh/snprintf.c
+       - vsnprint_internal: only reduce precision by 1 when processing the `g'
+         format if it's > 0.  A precision of 0 should stay 0; otherwise it
+         gets set to -1 (NOT_FOUND) and converted to the default
+       - number, lnumber: if an explicit precision is supplied, turn off the
+         zero-padding flag and set the pad character back to space
+       - number, lnumber: only account for a `+' when performing the field
+         width calculation if the coversion is base 10; we don't add a `+'
+         for other bases
+
+                                  4/18
+                                  ----
+tests/printf3.sub
+       - try using "perl -e 'print time'" to get the current time in seconds
+         since the epoch if "date +%s" is not available (solaris 8-10)
+
+                                  4/19
+                                  ----
+tests/run-printf
+       - use cat -v instead of relying on diff -a being available to convert
+         control characters to ascii and avoid the dreaded "Binary files
+         /tmp/xx and printf.right differ"
+
+                                  4/20
+                                  ----
+lib/sh/strftime.c
+       - incoporated new version from Aharon Robbins <arnold@skeeve.com>
+
+                                  4/22
+                                  ----
+doc/{bash.1,bashref.texi}
+       - slight change to the description of /dev/tcp and /dev/udp
+
+subst.c
+       - match_wpattern: logic fix to the calculation of `simple' (was |=,
+         needs to be &=).  Bug report from Mike Frysinger <vapier@gentoo.org>,
+         fix from Andreas Schwab <schwab@linux-m68k.org>
+
+bashline.c
+       - bash_filename_stat_hook: add code from bash_directory_completion_hook
+         that performs pathname canonicalization in the same way that cd and
+         other builtins will do
+
+                                  4/25
+                                  ----
+execute_cmd.c
+       - execute_pipeline: change the call to move_to_high_fd to make it use
+         getdtablesize() and to not stomp on existing open file descriptors,
+         like the fd the shell is using to read a script.  Bug report from
+         Greg Wooledge <wooledg@eeg.ccf.org>
+
+                                   5/6
+                                   ---
+subst.c
+       - expand_word_internal: case '$': after calling param_expand and
+         setting had_quoted_null, set TEMP to null.  The code that builds the
+         returned string at the end of the function will take care of making
+         and returning a quoted null string if there's nothing else in
+         ISTRING.  If there is, the quoted null should just go away.  Part of
+         fix for bug reported by Ruediger Kuhlmann <RKuhlmann@orga-systems.com>
+       - expand_word_internal: when processing ISTRING to build return value,
+         only set W_HASQUOTEDNULL in the returned word flags if the word is
+         a quoted null string AND had_quoted_null is set.  Rest of fix
+
+                                   5/9
+                                   ---
+variables.c
+       - bind_variable_internal: if we get an array variable here (implicit
+         assignment to index 0), call make_array_variable_value, which
+         dummies up a fake SHELL_VAR * from array[0].  This matters when
+         we're appending and have to use the current value
+       - bind_variable_internal: after computing the new value, treat assoc
+         variables with higher precedence than simple array variables; it
+         might be that a variable has both attributes set
+
+arrayfunc.c
+       - bind_array_var_internal: break code out that handles creating the
+         new value to be assigned to an array variable index into a new
+         function, make_array_variable_value.  This handles creating a
+         dummy SHELL_VAR * for implicit array[0] assignment.  Fixes bug
+         reported by Dan Douglas <ormaaj@gmail.com>
+
+arrayfunc.h
+       - make_array_variable_value: new extern declaration
+
+                                  5/19
+                                  ----
+variables.c
+       - bind_int_variable: if an assignment statement like x=y comes in
+         from the expression evaluator, and x is an array, handle it like
+         x[0]=y.  Fixes bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  5/24
+                                  ----
+
+braces.c
+       - mkseq: handle possible overflow and break the sequence generating
+         loop if it occurs.  Fixes OpenSUSE bug 763591:
+         https://bugzilla.novell.com/show_bug.cgi?id=763591
+
+                                  5/25
+                                  ----
+Makefile.in
+       - LDFLAGS_FOR_BUILD: add to compilation recipes for build tools
+         buildversion, mksignames, mksyntax
+       - LDFLAGS_FOR_BUILD: add to compilation recipes for test tools
+         recho, zecho, printenv, xcase
+
+builtins/Makefile.in
+       - LDFLAGS_FOR_BUILD: add to compilation recipes for build tools
+         gen-helpfiles, psize.aux
+
+variables.c
+       - bind_int_variable: if LHS is a simple variable name without an array
+         reference, but resolves to an array variable, call
+         bind_array_variable with index 0 to make x=1 equivalent to x[0]=1.
+         Fixes bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  5/27
+                                  ----
+subst.c
+       - expand_word_internal: make sure has_dollar_at doesn't get reset before
+         recursive calls to param_expand or expand_word_internal, since it has
+         to save state of what came before.  Use temp variable and make sure
+         has_dollar_at is incremented if recursive call processes "$@".
+         Fixes bug reported by gregrwm <backuppc-users@whitleymott.net> and
+         supplemented by Dan Douglas <ormaaj@gmail.com>
+
+doc/{bash.1,bashref.texi}
+       - changes to the description of substring expansion inspired by
+         suggestions from Bill Gradwohl <bill@ycc.com>
+
+doc/bashref.texi
+       - added substring expansion examples inspired by suggestions from
+         Bill Gradwohl <bill@ycc.com>
+
+variables.c
+       - find_shell_variable: search for a variable in the list of shell
+         contexts, ignore the temporary environment
+       - find_variable_tempenv: search for a variable in the list of shell
+         contexts, force search of the temporary environment
+       - find_variable_notempenv: search for a variable in the list of shell
+         contexts, don't force search of the temporary environment
+
+variables.h
+       - find_shell_variable: extern declaration
+       - find_variable_tempenv: extern declaration
+       - find_variable_notempenv: extern declaration
+
+arrayfunc.c
+       - bind_array_variable: call find_shell_variable instead of calling
+         var_lookup directly
+
+findcmd.c
+       - search_for_command: call find_variable_tempenv instead of
+         find_variable_internal directly
+       - _find_user_command_internal: call find_variable_tempenv instead of
+         find_variable_internal directly
+
+builtins/setattr.def
+       - set_var_attribute: call find_variable_notempenv instead of
+         find_variable_internal directly
+       - show_name_attributes:  call find_variable_tempenv instead of
+         find_variable_internal directly
+
+                                   6/1
+                                   ---
+sig.c
+       - termsig_handler: don't try to save the shell history on a terminating
+         signal any more, since it just causes too many problems on Linux
+         systems using glibc and glibc malloc
+
+lib/readline/vi_mode.c
+       - rl_vi_change_to: change to correctly redo `cc', since `c' is not a vi
+         motion character.  From Red Hat bug 813289
+       - rl_vi_delete_to: change to correctly redo `dd', since `d' is not a vi
+         motion character
+       - rl_vi_yank_to: change to correctly redo `yy', since `y' is not a vi
+         motion character
+
+                                   6/4
+                                   ---
+lib/sh/mktime.c
+       - current versions of VMS do not need to include <stddef.h>.  Fix from
+         John E. Malmberg <wb8tyw@qsl.net>
+
+                                   6/5
+                                   ---
+lib/sh/eaccess.c
+       - sh_stat: instead of using a static buffer to do the DEV_FD_PREFIX
+         translation, use a dynamically-allocated buffer that we keep
+         resizing.  Fixes potential security hole reported by David Leverton
+         <levertond@googlemail.com>
+
+                                   6/5
+                                   ---
+braces.c
+       - expand_seqterm: check errno == ERANGE after calling strtoimax for
+         rhs and incr.  Part of a set of fixes from Scott McMillan
+         <scotty.mcmillan@gmail.com>
+       - expand_seqterm: incr now of type `intmax_t', which changes
+         arguments to mkseq
+       - mkseq: a better fix for detecting overflow and underflow since it's
+         undefined in C and compilers `optimize' out overflow checks.  Uses
+         ADDOVERFLOW and SUBOVERFLOW macros
+       - mkseq: use sh_imaxabs (new macro) instead of abs() for intmax_t
+         variables
+       - mkseq: don't allow incr to be converted to -INTMAX_MIN
+       - mkseq: make sure that strvec_create isn't called with a size argument
+         greater than INT_MAX, since it only takes an int
+
+                                   6/6
+                                   ---
+braces.c
+       - mkseq: try and be smarter about not overallocating elements in
+         the return array if the increment is not 1 or -1
+
+                                   6/7
+                                   ---
+parse.y
+       - history_delimiting_chars: if the parser says we're in the middle of
+         a compound assignment (PST_COMPASSIGN), just return a space to avoid
+         adding a stray semicolon to the history entry.  Fixes bug reported
+         by "Davide Brini" <dave_br@gmx.com>
+
+                                   6/8
+                                   ---
+bashline.c
+       - bash_directory_completion_hook: don't attempt spelling correction
+         on the directory name unless the direxpand option is set and we are
+         going to replace the directory name with the corrected one in the
+         readline line.  Suggested by Linda Walsh <bash@tlinx.org>
+
+lib/sh/shquote.c
+       - sh_backslash_quote: now takes a third argument: flags.  If non-zero,
+         tildes are not backslash-escaped.  Have to handle both printf %q,
+         where they should be escaped, and filename completion, where they
+         should not when used as usernames
+
+externs.h
+       - sh_backslash_quote: declaration now takes a third argument
+
+builtins/printf.def
+       - printf_builtin: call sh_backslash_quote with 1 as third argument
+         so tildes get escaped
+
+{bashline,bracecomp}.c
+       - call sh_backslash_quote with 0 as third argument so tildes are not
+         escaped in completed words
+
+doc/bash.1
+       - add `coproc' to the list of reserved words.  From a report by
+         Jens Schweikhardt <schweikh@schweikhardt.net>
+
+                                  6/10
+                                  ----
+execute_cmd.c
+       - line_number_for_err_trap: now global, so parse_and_execute can save
+         and restore it with unwind-protect
+
+builtins/evalstring.c
+       - parse_prologue: save and restore line_number_for_err_trap along
+         with line_number
+       - restore_lastcom: new function, unwind-protect to restore
+         the_printed_command_except_trap
+       - parse_prologue: use restore_lastcom to save and restore the value
+         of the_printed_command_except_trap around calls to parse_and_execute
+         (eval/source/.)
+
+                                  6/15
+                                  ----
+lib/readline/complete.c
+       - complete_fncmp: change filename comparison code to understand
+         multibyte characters, even when doing case-sensitive or case-mapping
+         comparisons.  Fixes problem reported by Nikolay Shirokovskiy
+         <nshyrokovskiy@gmail.com>
+
+                                  6/20
+                                  ----
+builtins/mapfile.def
+       - mapfile: move the line count increment and check for having read
+         the specified number of lines to the end of the loop to avoid
+         reading an additional line with zgetline.  Fixes bug reported by
+         Dan Douglas <ormaaj@gmail.com>
+
+                                  6/21
+                                  ----
+
+execute_cmd.c
+       - execute_pipeline: make sure `lastpipe_flag' is initialized to 0 on
+         all systems, since it's tested later in the function.  Fixes bug
+         reported by John E. Malmberg <wb8tyw@qsl.net>
+
+                                  6/22
+                                  ----
+mailcheck.c
+       - file_mod_date_changed: return 0 right away if mailstat() does not
+         return success.  Fixes bug with using uninitialized values reported
+         by szymon.kalasz@uj.edu.pl
+
+builtins/set.def
+       - the `monitor' option is not available when the shell is compiled
+         without job control, since the underlying `m' flag is not available
+
+nojobs.c
+       - job_control: now declared as int variable, initialized to 0, never
+         modified
+
+jobs.h
+       - job_control: extern declaration no longer dependent on JOB_CONTROL
+
+execute_cmd.c
+       - execute_pipeline: made necessary changes so `lastpipe' shell option
+         is now available in all shells, even those compiled without
+         JOB_CONTROL defined
+
+                                  6/23
+                                  ----
+lib/glob/glob.c
+       - glob_filename: check for interrupts before returning if glob_vector
+         returns NULL or an error.  Bug reported by Serge van den Boom
+         <svdb@stack.nl>, fix from Andreas Schwab <schwab@linux-m68k.org>
+       - call run_pending_traps after each call to QUIT or test of
+         interrupt_state, like we do in mainline shell code
+       - glob_vector: don't call QUIT; in `if (lose)' code block; just free
+         memory, return NULL, and let callers deal with interrupt_state or
+         other signals and traps
+
+                                  6/25
+                                  ----
+lib/readline/input.c
+       - rl_read_key: restructure the loop that calls the event hook a little,
+         so that the hook is called only after rl_gather_tyi returns no input,
+         and any pending input is returned first.  This results in better
+         efficiency for processing pending input without calling the hook
+         on every input character as bash-4.1 did.  From a report from
+         Max Horn <max@quendi.de>
+
+                                  6/26
+                                  ----
+trap.c
+       - signal_is_pending: return TRUE if SIG argument has been received and
+         a trap is waiting to execute
+
+trap.h
+       - signal_is_pending: extern declaration
+
+lib/glob/glob.c
+       - glob_vector: check for pending SIGINT trap each time through the loop,
+         just like we check for interrupt_state or terminating_signal, and
+         set `lose = 1' so we clean up after ourselves and interrupt the
+         operation before running the trap.  This may require a change later,
+         maybe call run_pending_traps and do that if run_pending_traps returns?
+
+variables.c
+       - sv_histtimefmt: set history_comment_character to default (`#') if
+         it's 0 when we're turning on history timestamps.  The history code
+         uses the history comment character to prefix timestamps, and
+         leaving it at 0 effectively removes them from the history.  From a
+         report to help-bash by Dennis Williamson <dennistwilliamson@gmail.com>
+
+                                  6/27
+                                  ----
+lib/readline/signals.c
+       - rl_maybe_restore_sighandler: new function, sets handler for SIG to
+         HANDLER->sa_handler only if it's not SIG_IGN.  Needs to be called
+         on same signals set using rl_maybe_set_sighandler, which does not
+         override an existing SIG_IGN handler (SIGALRM is ok since it does
+         the check inline; doesn't mess with SIGWINCH)
+
+                                  6/30
+                                  ----
+variables.h
+       - additional defines for the new `nameref' variable attribute
+         (att_nameref): nameref_p, nameref_cell, var_setref
+
+variables.c
+       - find_variable_nameref: resolve SHELL_VAR V through chain of namerefs
+       - find_variable_last_nameref: resolve variable NAME until last in a
+         chain of possibly more than one nameref starting at shell_variables
+       - find_global_variable_last_nameref: resolve variable NAME until last
+         in a chain of possibly more than one nameref starting at
+         global_variables
+       - find_nameref_at_context: resolve SHELL_VAR V through chain of namerefs        
+         in a specific variable context (usually a local variable hash table)
+       - find_variable_nameref_context: resolve SHELL_VAR V through chain of
+         namerefs following a chain of varible contexts
+       - find_variable_last_nameref_context: resolve SHELL_VAR V as in
+         find_variable_last_context, but return the final nameref instead of
+         what the final nameref resolves to
+       - find_variable_tempenv, find_variable_notempenv, find_global_variable,
+         find_shell_variable, find_variable: modified to follow namerefs
+       - find_global_variable_noref: look up a global variable without following
+         any namerefs
+       - find_variable_noref: look up a shell variable without following any
+         namerefs
+       - bind_variable_internal: modify to follow a chain of namerefs in the
+         global variables table; change to handle assignments to a nameref by
+         following nameref chain
+       - bind_variable: modify to follow chain of namerefs when binding to a
+         local variable
+       - unbind_variable: changes to unset nameref variables (unsets both
+         nameref and variable it resolves to)
+
+subst.c
+       - parameter_brace_expand_word: change to handle expanding nameref whose
+         value is x[n]
+       - parameter_brace_expand_indir: change to expand in ksh93-compatible
+         way if variable to be indirected is nameref and a simple (non-array)
+         expansion
+       - param_expand: change to expand $foo where foo is a nameref whose value
+         is x[n]
+
+execute_cmd.c
+       - execute_for_command: changes to implement ksh93 semantics when index
+         variable is a nameref
+
+builtins/setattr.def
+       - show_var_attributes: change to add `n' to flags list if att_nameref
+         is set
+
+builtins/set.def
+       - unset_builtin: changes to error messages to follow nameref variables
+
+builtins/declare.def
+       - document new -n option
+       - declare_internal: new `-n' and `+n' options
+       - declare_internal: handle declare -n var[=value] and
+         declare +n var[=value] for existing and non-existant variables.
+         Enforce restriction that nameref variables cannot be arrays.
+         Implement semi-peculiar ksh93 semantics for typeset +n ref=value
+
+                                   7/5
+                                   ---
+variables.c
+       - unbind_variable: unset whatever a nameref resolves to, leaving the
+         nameref variable itself alone
+       - unbind_nameref: new function, unsets a nameref variable, not the
+         variable it references
+
+variables.h
+       - unbind_nameref: extern declaration
+
+builtins/set.def
+       - unset_builtin: modify to add -n option, which calls unbind_nameref
+         leaving unbind_variable for the usual case.  This required slight
+         changes and additions to the test suite
+
+doc/{bash.1,bashref.texi}
+       - document namerefs and typeset/declare/local/unset -n
+
+                                  7/13
+                                  ----
+lib/sh/casemod.c
+       - include shmbchar.h for is_basic and supporting pieces
+       - sh_casemod: use _to_wupper and _to_wlower to convert wide character
+         case instead of TOUPPER and TOLOWER.  Fixes bug reported by
+         Dennis Williamson <dennistwilliamson@gmail.com>, fix from
+         Andreas Schwab <schwab@linux-m68k.org>
+       - cval: short-circuit and return ascii value if is_basic tests true
+       - sh_casemod: short-circuit and use non-multibyte case modification
+         and toggling code if is_basic tests true
+
+lib/readline/signals.c
+       - _rl_{block,release}_sigint: remove the code that actually blocks and
+         releases the signals, since we defer signal handling until calls to
+         RL_CHECK_SIGNALS()
+
+lib/readline/{callback,readline,util}.c
+       - if HAVE_POSIX_SIGSETJMP is defined, use sigsetjmp/siglongjmp without
+         saving and restoring the signal mask instead of setjmp/longjmp
+
+lib/readline/rltty.c
+       - prepare_terminal_settings: don't mess with IXOFF setting if
+         USE_XON_XOFF defined
+
+doc/{bash.1,bashref.texi}
+       - add some text to the description of set -e clarifying its effect
+         on shell functions and shell function execution.  Suggested by
+         Rainer Blome <rainer.blome@gmx.de>
+
+bashline.c
+       - edit_and_execute_command: increment current_command_line_count before
+         adding partial line to command history (for command-oriented-history
+         because of rl_newline at beginning of function), then reset it to 0
+         before adding the dummy history entry to make sure the dummy entry
+         doesn't get added to previous incomplete command.  Partial fix for
+         problem reported by Peng Yu <pengyu.ut@gmail.com>
+
+                                  7/24
+                                  ----
+configure.in
+       - interix: define RECYCLES_PIDS.  Based on a report from Michael
+         Haubenwallner <michael.haubenwallner@salomon.at>
+
+                                  7/26
+                                  ----
+jobs.c
+       - make_child: call bgp_delete on the newly-created pid unconditionally.
+         Some systems reuse pids before cycling through an entire set of
+         CHILD_MAX/_SC_CHILD_MAX unique pids.  This is no longer dependent
+         on RECYCLES_PIDS.  Based on a report from Michael Haubenwallner
+         <michael.haubenwallner@salomon.at>
+
+support/shobj-conf
+       - Mac OS X: drop MACOSX_DEPLOYMENT_TARGET=10.3 from the LDFLAGS. We
+         can finally kill Panther
+
+                                  7/28
+                                  ----
+subst.c
+       - command_substitute: make sure last_made_pid gets reset if make_child
+         fails
+
+execute_cmd.c
+       - execute_command_internal: case cm_simple: decide whether or not to
+         wait_for a child if already_making_children is non-zero, indicates
+         that there is an unwaited-for child.  More of fix for bug report
+         from Michael Haubenwallner <michael.haubenwallner@salomon.at>
+
+jobs.c
+       - make_child: call delete_old_job (new_pid) unconditionally, don't
+         bother to check whether or not pid wrap occurred.  Rest of fix for
+         bug report from Michael Haubenwallner
+         <michael.haubenwallner@salomon.at>
+
+                                  7/29
+                                  ----
+shell.c
+       - subshell_exit: new function, exits the shell (via call to sh_exit())
+         after calling any defined exit trap
+
+externs.h
+       - subshell_exit: new extern declaration
+
+execute_cmd.c
+       - execute_command_internal: make sure to call subshell_exit for
+         {} group commands executed asynchronously (&).  Part of fix for
+         EXIT trap bug reported by Maarten Billemont <lhunath@lyndir.com>
+
+sig.c
+       - reset_terminating_signals: make sure to set termsigs_initialized back
+         to 0, so a subsequent call to initialize_terminating_signals works
+         right.  Rest of fix for bug reported by Maarten Billemont
+         <lhunath@lyndir.com>
+
+{execute_cmd,general,jobs,mailcheck,mksyntax,test}.c
+builtins/{cd,fc,pushd,ulimit}.def
+lib/malloc/getpagesize.h
+lib/sh/{clktck,fpurge,inet_aton,mailstat,oslib,pathcanon,pathphys,spell,strerror}.c
+       - make inclusion of <sys/param.h> dependent on HAVE_SYS_PARAM_H
+         consistently
+
+                                   8/6
+                                   ---
+lib/readline/histexpand.c
+       - history_expand_internal: now takes an additional argument saying
+         whether the history expansion occurs within a quoted string, set to
+         the open quote character
+       - history_expand_internal: use new argument instead of checking prev
+         char and initializing quoted_search_delimiter, pass qc directly to
+         get_history_event, where it allows a matching quote to terminate a
+         string defining an event
+       - history_expand: change single-quote handling code so that if
+         history_quotes_inhibit_expansion is 0, single quotes are treated
+         like double quotes
+       - history_expand: change call to history_expand_internal to pass new
+         argument of `"' if double-quoted string, `'' if single-quoted string;
+         this lets history_expand decide what is a quoted string and what
+         is not
+
+                                   8/7
+                                   ---
+configure.in
+       - AC_CANONICAL_BUILD: invoke for later use
+
+lib/readline/macro.c
+       - _rl_prev_macro_key: new function, inverse of _rl_next_macro_key:
+         backs up the index into the current macro by 1
+
+lib/readline/rlprivate.h
+       - _rl_prev_macro_key: extern declaration
+
+
+lib/readline/readline.c
+       - _rl_dispatch_subseq, _rl_subseq_result: don't call _rl_unget_char
+         if we're currently reading from a macro; call _rl_prev_macro_key
+         instead.  Fixes bug reported by Clark Wang <clark.wang@oracle.com>
+
+                                  8/13
+                                  ----
+builtins/evalstring.c
+       - evalstring(): new function, wrapper around parse_and_execute.
+         make sure we handle cases where parse_and_execute can call `return'
+         and short-circuit without cleaning up properly.  We call
+         parse_and_execute_cleanup() then jump to the previous-saved return
+         location
+
+builtins/common.h
+       - extern declaration for evalstring()
+
+builtins/eval.def
+       - eval_builtin: make sure we handle `eval " ... return"' in contexts
+         where `return' is valid by calling evalstring().  Fixes bug with
+         `eval return' in sourced files reported by Clark Wang
+         <dearvoid@gmail.com>
+
+trap.c
+       - run_pending_traps: call evalstring instead of parse_and_execute.
+         XXX - still needs to handle saving and restoring token state in the
+         presence of `return'; could use unwind_protects for that
+
+builtins/mapfile.def
+       - run_callback: call evalstring instead of parse_and_execute
+
+                                  8/15
+                                  ----
+bashline.c
+       - bash_filename_stat_hook: make sure we don't free local_dirname
+         before using it to canonicalize any expanded filename.  Make sure
+         it always points to *dirname and only free it if we're replacing
+         it.
+
+lib/readline/complete.c
+       - append_to_match: make sure we call rl_filename_stat_hook with
+         newly-allocated memory to avoid problems with freeing it twice
+
+                                  8/17
+                                  ----
+variables.c,config-top.h
+       - if ARRAY_EXPORT is defined to 1 when variables.c is compiled, the
+         code that allows indexed arrays to be exported is enabled and
+         included
+
+                                  8/19
+                                  ----
+shell.c
+       - call start_debugger from main() only if dollar_vars[1] != 0 (close
+         enough to a non-interactive shell, since we can be interactive with
+         -i while running a shell script).  Fixes oddity reported by
+         Techlive Zheng <techlivezheng@gmail.com>
+
+                                  8/20
+                                  ----
+arrayfunc.c
+       - quote_array_assignment_chars: don't bother quoting if the word has
+         not been marked as an assignment (W_ASSIGNMENT)
+       - quote_array_assignment_chars: turn on W_NOGLOB in the word flags
+         so assignment statements don't undergo globbing.  Partial fix for
+         problems reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  8/21
+                                  ----
+command.h
+       - W_NOBRACE: new word flag that means to inhibit brace expansion
+
+subst.c
+       - brace_expand_word_list: suppress brace expansion for words with
+         W_NOBRACE flag
+
+                                  8/22
+                                  ----
+builtins/read.def
+       - read_builtin: don't call dequote_string on what we've read, even if
+         we saw an escape character, unless (input_string && *input_string).
+         We may have escaped an IFS whitespace character.  Fixes seg fault
+         reported by <armandsl@gmail.com>
+
+execute_cmd.c
+       - execute_command_internal: set the_printed_command_except trap when
+         about to execute a ( ... ) user subshell.  For now, set it only if
+         ERR is trapped; can relax that later.  Fixes bug reported by
+         Mike Frysinger <vapier@gentoo.org>
+
+                                  8/23
+                                  ----
+jobs.c
+       - remove references to first_pid and pid_wrap, since we're not using
+         them for anything anymore
+
+                                  8/24
+                                  ----
+subst.c
+       - changes for W_NOBRACE everywhere appropriate: so it can be displayed
+         for debugging, and passed out of expand_word_internal
+
+doc/{bash.1,bashref.texi}
+       - small changes to make it clearer that the = and == operators are
+         equivalent, and will cause pattern matching when used with [[.
+         From a question from Michal Soltys <soltys@ziu.info>
+
+doc/bashref.texi
+       - some small formatting changes from Karl Berry <karl@freefriends.org>
+
+                                  8/27
+                                  ----
+lib/readline/doc/{history,rlman,rluserman}.texi
+       - some small formatting changes from Karl Berry <karl@freefriends.org>
+
+arrayfunc.c
+       - assign_array_element_internal, assign_compound_array_list,
+         unbind_array_element, array_value_internal: changes to make
+         assignment statements to negative indices (a[-1]=2) and unsetting
+         array elements using negative indices (unset 'a[-1]') work.
+         From suggestions by Dennis Williamson <dennistwilliamson@gmail.com>
+         and Chris F. A. Johnson <chris@cfajohnson.com>
+
+subst.c
+       - array_length_reference: changes to make length references to array
+         elements using negative indices (${#a[-1]}) work
+
+                                  8/28
+                                  ----
+doc/{bash.1,bashref.texi}
+       - document new treatment of negative indices to indexed arrays when
+         assigning, referencing, calculating length, and unsetting
+
+                                  8/29
+                                  ----
+shell.c
+       - show_shell_usage: add -l to list of shell invocation options (short
+         for --login).  From Red Hat bug 852469
+
+configure.ac
+       - renamed from configure.in, as latest autoconf versions want.  Patches
+         Stefano Lattarini <stefano.lattarini@gmail.com>
+
+MANIFEST,Makefile.in,doc/bashref.texi,support/mkconffiles
+       - configure.in -> configure.ac
+
+                                   9/1
+                                   ---
+
+parse.y
+       - read_token_word: allow words like {array[ind]} to be valid redirection
+         words for constructs like {x}<file
+
+redir.c
+       - redir_varassign: bind_var_to_int already handles array assignments,
+         so don't need to do anything more for things like {a[i]}<file
+       - redir_varvalue: changes to allow references to {a[i]} when
+         performing redirections using valid_array_reference and
+         get_array_value.  Adds functionality requested most recently by
+         <unknown@vmw-les.eng.vmware.com>
+
+lib/readline/display.c
+       - update_line: if the first difference between the old and new lines
+         is completely before any invisible characters in the prompt, we
+         should not adjust _rl_last_c_pos, since it's before any invisible
+         characters.  Fixed in two places
+       - prompt_modechar: return a character indicating the editing mode:
+         emacs (@), vi command (:), or vi insert (+)
+       - _rl_reset_prompt: new function, just calls rl_expand_prompt.  Will be
+         inlined, placeholder for more changes
+       - expand_prompt: if show-mode-in-prompt is enabled, add a character to
+         the front of the prompt indicating the editing mode, adjusting the
+         various variables as appropriate to keep track of the number of
+         visible characters and number of screen positions
+
+lib/readline/bind.c
+       - show-mode-in-prompt: new bindable boolean variable, shadowed by
+         _rl_show_mode_in_prompt variable
+       - hack_special_boolean_var: call _rl_reset_prompt when toggling or
+         setting show-mode-in-prompt
+
+lib/readline/readline.c
+       - readline_internal_setup: make sure the correct vi mode keymap is set
+         before expanding the prompt string for the first time
+
+lib/readline/misc.c
+       - rl_emacs_editing_mode: make sure to call _rl_reset_prompt if we're
+         showing the editing mode in the prompt
+
+lib/readline/rlprivate.h
+       - _rl_reset_prompt, _rl_show_mode_in_prompt: extern declarations
+
+lib/readline/vi_mode.c
+       - rl_vi_insertion_mode: call _rl_reset_prompt
+       - rl_vi_movement_mode: call _rl_reset_prompt.  Finishes changes for
+         showing mode in prompt string, originally requested by Miroslav
+         Koskar <mkoskar@gmail.com> and most recently by Jordan Michael
+         Ziegler <jziegler@bnl.gov>
+
+doc/bash.1,lib/readline/doc/{readline.3,rluser.texi}
+       - document new show-mode-in-prompt variable, off by default
+
+                                   9/3
+                                   ---
+
+jobs.c
+       - set_childmax: new function, external mechanism for other parts of
+         the shell to set js.c_childmax, the number of saved exited child
+         statuses to remember
+jobs.h
+       - set_childmax: extern declaration
+
+variables.c
+       - CHILD_MAX: new special variable, with sv_childmax function to
+         run when it changes.  Setting CHILD_MAX to a value greater than
+         zero but less than some maximum (currently 8192) sets the number of
+         exited child statuses to remember.  set_childmax (jobs.c) ensures
+         that the number does not drop below the posix-mandated minimum
+         (CHILD_MAX)
+
+doc/{bash.1,bashref.texi}
+       - CHILD_MAX: document new meaning and action when variable is set
+
+                                   9/5
+                                   ---
+redir.c
+       - redir_varassign: call stupidly_hack_special_variables after
+         assigning fd number to specified variable, so we can use constructs
+         like {BASH_XTRACEFD}>foo.  Suggested by Pierre Gaston
+         <pierre.gaston@gmail.com>
+
+                                   9/8
+                                   ---
+expr.c
+       - readtok: invalidate previous contents of `curlval' before freeing
+         and reallocating tokstr (which, chances are, will get the same
+         pointer as before and render curlval inconsistent).  Fixes other
+         bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                   9/9
+                                   ---
+lib/readline/complete.c
+       - rl_username_completion_function: protect call to setpwent() with
+         #ifdef (HAVE_GETPWENT)/#endif.  Fixes bug reported by
+         Gerd Hofmann <gerd.hofmann.nbg@googlemail.com>
+
+lib/readline/display.c
+       - rl_message: second and subsequent calls to rl_message can result in
+         local_prompt being overwritten with new values (e.g., from the
+         successive calls displaying the incremental search string).  Need
+         to free before overwriting if it's not the same as the value saved
+         in saved_local_prompt.  Fixes memory leak reported by
+         Wouter Vermaelen <vermaelen.wouter@gmail.com>
+
+lib/readline/{terminal.c,rlprivate.h}
+       - move CUSTOM_REDISPLAY_FUNC and CUSTOM_INPUT_FUNC defines from
+         terminal.c to rlprivate.h so other files can use them
+
+expr.c
+       - expr_streval: if noeval is non-zero, just return 0 right away,
+         short-circuiting evaluation completely.  readtok will leave curtok
+         set correctly without re-entering the evaluator at all.  Rest of
+         fix for bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  9/11
+                                  ----
+
+parse.y
+       - parse_comsub: make sure the `reserved word ok in this context' flag
+         is preserved after we read `do' followed by whitespace.  Fixes bug
+         reported by Benoit Vaugon <benoit.vaugon@gmail.com>
+
+                                  9/13
+                                  ----
+configure.ac,config.h.in
+       - enable-direxpand-default: new configure option, turns the `direxpand'
+         shell option on by default
+
+bashline.c
+       - dircomplete_expand, dircomplete_expand_relpath: initialize to 1 if
+         DIRCOMPLETE_EXPAND_DEFAULT is defined and non-zero
+
+doc/bashref.texi
+       - enable-direxpand-default: document new configure option
+
+                                  9/14
+                                  ----
+shell.c
+       - --protected: make option valid only when wordexp is compiled into
+         the shell.  Fix from Roman Rakus <rrakus@redhat.com>
+
+configure.ac
+       - HP NonStop (*-nsk*): compile --without-bash-malloc. Change from
+         Joachim Schmitz <jojo@schmitz-digital.de>
+
+                                  9/16
+                                  ----
+subst.c,execute_cmd.c,lib/glob/sm_loop.c,lib/sh/shquote.c
+       - minor code cleanups from Joachim Schmitz <jojo@schmitz-digital.de>
+
+lib/readline/colors.h
+       - workaround for HP NonStop compiler issue with <stdbool.h> from
+         Joachim Schmitz <jojo@schmitz-digital.de>
+
+                                  9/17
+                                  ----
+builtins/printf.def
+       - printf_builtin: handle localtime returning NULL, as can happen when
+         encountering overflow.  Bug report and initial fix from
+         Eduardo A. Bustamante López <dualbus@gmail.com>
+
+doc/{bash.1,bashref.texi}
+       - emphasize that brace expansion using character ranges ({a..c}) acts
+         as if the C locale were in use.  Prompted by message from
+         Marcel Giannelia <info@skeena.net>
+
+                                  9/20
+                                  ----
+lib/sh/wcsnwidth.c
+       - wcsnwidth: new function, variant of wcwidth, returns the number of
+         wide characters from a string that will be displayed to not exceed
+         a specified max column position
+
+                                  9/21
+                                  ----
+builtins/help.def
+       - show_builtin_command_help: break code that displays the short-doc
+         for each builtin in two columns into a new function: dispcolumn
+       - wdispcolumn: multibyte-char version of dispcolumn; uses wide
+         chars and printf "%ls" format.  Fixes problem reported by
+         Nguyá»n Thái Ngá»c Duy <pclouds@gmail.com>
+
+                                  9/22
+                                  ----
+execute_cmd.c
+       - execute_disk_command: before running the command-not-found hook,
+         call kill_current_pipeline() to make sure we don't add processes
+         to an existing pipeline or wait for processes erroneously
+
+                                  9/23
+                                  ----
+lib/readline/input.c
+       - rl_input_available_hook: new hook function, called from
+         _rl_input_available (or _rl_input_queued) to return whether or not
+         input is available wherever the input source is
+
+lib/readline/doc/rltech.texi
+       - rl_input_available_hook: document
+
+                                  9/27
+                                  ----
+lib/glob/sm_loop.c:
+       - GMATCH: after one or more `*', an instance of ?(x) can match zero or
+         1 times (unlike ?, which has to match one character).  The old code
+         failed if it didn't match at least once.  Fixes `a*?(x)' bug.
+       - GMATCH: if we hit the end of the search string, but not the end of
+         the pattern, and the rest of the pattern is something that can
+         match the NUL at the end of the search string, we should successfully
+         match.  Fixes `a*!(x)' bug reported by <hans1worst@gmail.com>
+
+                                  10/2
+                                  ----
+command.h
+       - add c_lock member to coproc structure for future use to tell who is
+         manipulating it
+
+execute_cmd.c
+       - execute_coproc: block SIGCHLD while parent is forking coproc
+         process and adding pid to sh_coproc struct to avoid race condition
+         where child is reaped before the pid is assigned and the coproc is
+         never marked as having died.  Fixes race condition identified by
+         Davide Baldini <baldiniebaldini@gmail.com>
+       - add assignments to c_lock member of struct coproc in various
+         functions that manipulate it; was used to identify race condition
+       - coproc_pidchk: don't call coproc_dispose to avoid using malloc and
+         other functions in a signal handler context
+       - coproc_dispose: call BLOCK_SIGNAL/UNBLOCK_SIGNAL for SIGCHLD while
+         manipulating the sh_coproc struct
+
+                                  10/6
+                                  ----
+lib/readline/complete.c
+       - rl_display_match_list: if printing completions horizontally, don't
+         bother with spacing calculations if limit == 1, which means we are
+         printing one completion per line no matter what.  Fixes bug
+         reported by David Kaasen <kaasen@nvg.ntnu.no>
+
+                                  10/7
+                                  ----
+builtins/declare.def
+       - declare_internal: add error checking for nameref attribute and
+         variable assignments: self-references, attempts to make an array
+         variable a nameref
+
+subst.c
+       - parameter_brace_expand: handle parameter_brace_expand_word returning
+         &expand_param_fatal or &expand_param_error and return the appropriate
+         error value
+       - parameter_brace_expand_word: if a nameref variable's value is not a
+         valid identifier, return an error
+       - param_expand: if a nameref variable's value is not a valid identifier,
+         return an error
+
+test.c
+       - unary_operator: add new -R variable, returns true if variable is set
+         and has the nameref attribute. From ksh93
+
+builtins/test.def
+       - add -R to description of conditional commands for help test
+
+doc/{bash.1,bashref.texi}
+       - document new -R unary conditional operator
+
+                                  10/13
+                                  -----
+trap.c
+       - check_signals_and_traps: new function, convenience function for the
+         rest of the shell to check for pending terminating and interrupt
+         signals, and to check for and process any pending traps
+       - any_signals_trapped: new function, returns non-zero if any signals
+         are trapped and -1 if not
+
+trap.h
+       - extern declaration for check_signals_and_traps
+
+bashline.c
+       - bashline_reset: make sure we reset the event hook
+       - bash_event_hook: call check_signals_and_traps instead of just
+         checking for terminating signals so we can run pending traps and
+         react to interrupts, and reset the event hook when we're done
+
+
+                                  10/14
+                                  -----
+trap.c
+       - trap_handler: if executing in a readline signal handler context,
+         call bashline_set_event_hook to install bash_event_hook to process
+         the signal (if bash cares about it)
+
+sig.c
+       - sigint_sighandler: call bashline_set_event_hook to set the event
+         hook if we're executing in a readline signal handler context
+
+lib/readline/input.c
+       - rl_getc: call RL_CHECK_SIGNALS if read returns -1/EINTR and the caught
+         signal is SIGINT or SIGQUIT rather than waiting until the next time
+         around the loop
+       - rl_getc: call rl_event_hook after calling RL_CHECK_SIGNALS to allow
+         an application signal handler to set the event hook in its own
+         signal handler (e.g., like bash trap_handler or sigint_sighandler)
+
+
+parse.y
+       - yy_readline_get: don't set interrupt_immediately before we call
+         readline().  Inspired by report from lanshun zhou
+         <zls.sogou@gmail.com>
+
+input.c
+       - getc_with_restart: add call to run_pending_traps after call to
+         CHECK_TERMSIG
+
+lib/sh/zread.c
+       - zread: call check_signals_and_traps if read() returns -1/EINTR
+         instead of just ignoring the EINTR and deferring handling any
+         signal that generated it
+
+builtins/mapfile.def
+       - mapfile: don't set interrupt_immediately before calling zgetline()
+         (which uses zread internally)
+
+builtins/read.def
+       - read_builtin: don't set interrupt_immediately before calling zread
+         (moved code around so that it was only being set right around calls
+         to zread to avoid signal handler conflicts).  Inspired by report
+         from lanshun zhou <zls.sogou@gmail.com>
+       - edit_line: don't set interrupt_immediately around call to readline()
+       - include shmbutil.h
+       - read_builtin: don't call read_mbchar unless is_basic(c) returns
+         false for the character we just read
+
+                                  10/15
+                                  -----
+sig.c
+       - throw_to_top_level: if interrupt_state is non-zero, make sure that
+         last_command_exit_value reflects 128+SIGINT if it's not already
+         greater than 128
+
+                                  10/20
+                                  -----
+builtins/wait.def
+       - WAIT_RETURN: set wait_signal_received back to 0 for the potential
+         next call to wait
+
+quit.h
+       - CHECK_WAIT_INTR: macro to check whether trap_handler handled a
+         signal and set wait_signal_received; longjmp to wait_intr_buf in
+         that case
+
+jobs.c
+       - wait_for, waitchld: call CHECK_WAIT_INTR at the same places we call
+         CHECK_TERMSIG to check for terminating signals
+       - wait_sigint_handler: don't longjmp out of the wait builtin unless
+         interrupt_immediately is set; otherwise just SIGRETURN from the
+         handler
+       - wait_sigint_handler: if interrupt_immediately not set, but we are
+         executing in the wait builtin and SIGINT is not trapped, treat it
+         as a `normally received' SIGINT: restore the signal handler and
+         send SIGINT to ourselves
+       - waitchld: when in posix mode and running SIGCHLD traps, don't longjmp
+         to wait_intr_buf (and let wait be interrupted) if we're running from
+         a signal handler.  Wait for CHECK_WAIT_INTR to do the longjmp.
+         run_pending_traps will run the SIGCHLD trap later
+
+nojobs.c
+       - reap_zombie_children, wait_for_single_pid, wait_for: call
+         CHECK_WAIT_INTR where we call CHECK_TERMSIG
+       - wait_sigint_handler: don't longjmp out of the wait builtin unless
+         interrupt_immediately is set; otherwise just SIGRETURN from the
+         handler
+
+trap.c
+       - trap_handler: make sure wait_signal_received is set if the wait
+         builtin is executing, and only longjmp if interrupt_immediately is
+         set.  This whole set of fixes was prompted by report from
+         lanshun zhou <zls.sogou@gmail.com>
+
+                                  10/24
+                                  -----
+lib/glob/glob.c
+       - glob_filename: only check directory_name for globbing chars if
+         it's of non-zero length
+
+lib/sh/strchrnul.c
+       - new simpler implementation
+
+subst.c
+       - command_substitute: call set_shellopts after turning off errexit
+         in subshells so it's reflected in $SHELLOPTS
+
+                                  11/7
+                                  ----
+builtins/evalstring.c
+       - parse_and_execute: treat ERREXIT case like reader_loop does: set
+         variable_context to 0 before longjmping back to top_level. Don't
+         run the unwind-protect context to avoid side effects from popping
+         function contexts.  Part of fix for problem reported by Nikolai
+         Kondrashov <nikolai.kondrashov@redhat.com>
+
+execute_cmd.c
+       - execute_simple_command: call unlink_fifo_list only if this is the
+         last element of a pipeline (or not in a pipeline), rather than for
+         every child.  Fixes difference in behavior between /dev/fd and
+         FIFOs reported by Zev Weiss <zev@bewilderbeest.net>
+       - execute_null_command: do the same thing in the parent branch after
+         make_child
+
+                                  11/14
+                                  -----
+subst.c
+       - parameter_brace_expand: a variable is null if it's special ($@, $*),
+         the expansion occurs within double quotes, and the expansion turns
+         into a quoted null.  Fixes debian bug 692447 reported by
+         Matrosov Dmitriy <sgf.dma@gmail.com>
+
+jobs.c
+       - run_sigchld_trap: make sure `running_trap' sentinel is set
+         appropriately
+       - waitchld: only run the sigchld trap if we're not in a signal
+         handler, not running a trap, and executing the wait builtin.
+         Otherwise, queue for later handling.  We still run one instance
+         of the trap handler per exited child.  Bulk of fix for bug
+         reported by Elliott Forney <idfah@cs.colostate.edu>
+
+trap.c
+       - queue_sigchld_trap: set catch_flag so run_pending_traps notices,
+         and set trapped_signal_received for completeness.  Rest of fix
+         for bug reported by Elliott Forney <idfah@cs.colostate.edu>
+
+lib/malloc/malloc.c
+       - block_signals: renamed to _malloc_block_signals, made public
+       - unblock_signals: renamed to _malloc_unblock_signals, made public
+
+lib/malloc/imalloc.h
+       - extern declarations for _malloc_{un,}block_signals
+
+lib/malloc/table.c
+       - mregister_alloc, mregister_free: block signals around table
+         manipulation
+
+                                  11/15
+                                  -----
+trap.c
+       - run_pending_traps: set SIG_INPROGRESS flag around calls to
+         run_sigchld_handler so other parts of the shell know that the
+         SIGCHLD trap handler is executing
+       - run_pending_traps: if we get a situation where we are looking at
+         running a SIGCHLD trap but the trap string is IMPOSSIBLE_TRAP_HANDLER
+         and the SIG_INPROGRESS flag is set, just skip it.  This is possible
+         if run_pending_traps is called from a SIGCHLD trap handler run by
+         run_sigchld_trap
+
+doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
+       - corrected description of the effect of `set history-size 0'.  Report
+         from Vesa-Matti J Kari <vmkari@cc.helsinki.fi>
+
+include/stdc.h
+       - CPP_STRING: new define, replaces __STRING
+
+lib/malloc/{malloc.c,imalloc.h}
+       - replace __STRING with CPP_STRING
+
+                                  11/16
+                                  -----
+lib/readline/bind.c
+       - sv_histsize: if argument evaluates to a value < 0, unstifle the
+         history
+
+                                  11/22
+                                  -----
+redir.c
+       - do_redirection_internal: if we have REDIR_VARASSIGN set in the
+         redirection flags and we set up `redirector' using fcntl or dup2,
+         don't add a redirect to make sure it stays open.  Let the
+         script programmer manage the file handle.  Fixes bug reported by
+         Sam Liddicott <sam@liddicott.com>
+
+                                  11/24
+                                  -----
+jobs.c
+       - wait_for_any_job: new function, waits for an unspecified background
+         job to exit and returns its exit status.  Returns -1 on no background
+         jobs or no children or other errors.  Calls wait_for with new
+         sentinel value ANY_PID
+       - wait_for: changes to handle argument of ANY_PID: don't look up or
+         try to modify the child struct, only go through the wait loop once.
+         Return -1 if waitpid returns no children
+
+jobs.h
+       - ANY_PID: new define
+
+builtins/wait.def
+       - new option: -n. Means to wait for the next job and return its exit
+         status.  Returns 127 if there are no background jobs (or no
+         children).  Feature most recently requested by Elliott Forney
+         <idfah@cs.colostate.edu>
+
+doc/{bash.1,bashref.texi}
+       - document new `wait -n' option
+
+execute_cmd.c
+       - execute_command_internal: save make_command_string () result in a
+         temp variable before calling savestring() on it; avoids evaluating
+         make_command_string() result twice.  Fix from John E. Malmberg
+         <wb8tyw@qsl.net>
+
+                                  11/28
+                                  -----
+
+builtins/declare.def
+       - declare_internal: if an array variable is declared using `declare -a'
+         or `declare -A', but not assigned a value, set the `invisible'
+         attribute so the variable does not show up as set.  Fix for bug
+         about variable initialization reported by Tim Friske <me@timfriske.com>
+
+builtins/{mapfile,read}.def
+       - after calling find_or_make_array_variable, make sure the invisible
+         flag is turned off, in case the variable was declared previously
+         using `declare -a' or `declare -A'.  Side effect of above change to
+         declare_internal
+
+subst.c
+       - shell_expand_word_list: handle the W_ASSNGLOBAL flag and put -g into
+         the list of options passed to make_internal_declare as appropriate.
+         Fix for bug reported by Tim Friske <me@timfriske.com>
+
+                                  11/30
+                                  -----
+test.c
+       - unary_op: make sure -v and -n check that the variable is not marked
+         as invisible before calling var_isset.  Fix for bug reported by Tim
+         Friske <me@timfriske.com>
+
+                                  12/2
+                                  ----
+subst.c
+       - process_substitute: turn off the `expanding_redir' flag, which
+         controls whether or not variables.c:find_variable_internal uses the
+         temporary environment to find variables.  We want to use the
+         temp environment, since we don't have to worry about order of
+         evaluation in a subshell.  Fixes bug reported by Andrey Borzenkov
+         <arvidjaar@gmail.com>
+
+                                  12/4
+                                  ----
+lib/glob/glob.c
+       - glob_filename: changes to avoid null filenames and multiple entries
+         returned for patterns like **/** (globstar enabled).  Fixes bug
+         reported by Ulf Magnusson <ulfalizer@gmail.com>
+
+                                  12/10
+                                  -----
+lib/glob/glob.c
+       - glob_filename: finish up a series of changes to make globstar-style   
+         globbing more efficient, avoid more duplicate filenames, and be more
+         compatible with other shells that implement it
+               o collapse a sequence of **/**/** to one **
+               o note when the directory name is all ** or ends in ** so we
+                 can treat it specially when the filename is **
+         All inspired by report from Andrey Borzenkov <arvidjaar@gmail.com>
+
+lib/sh/zread.c
+       - zreadn: new function, like zread, but takes an additional argument
+         saying how many bytes to read into the local buffer.  Can be used to
+         implement `read -N' without so many one-byte calls to zreadc.  Code
+         from Mike Frysinger <vapier@gentoo.org>
+
+                                  12/12
+                                  -----
+lib/glob/sm_loop.c
+       - PATSCAN (glob_patscan): if passed string already points to end of
+         pattern, return NULL immediately.  Fixes problem with
+         extglob_skipname reported by Raphaël Droz <raphael.droz@gmail.com>
+
+                                  12/13
+                                  -----
+execute_cmd.c
+       - execute_coproc: handle the command's exit status being inverted
+         (an oversight).  Fixes bug reported by DJ Mills
+         <danielmills1@gmail.com> and Andreas Schwab <schwab@linux-m68k.org>
+
+                                  12/14
+                                  -----
+lib/readline/readline.c
+       - bind_arrow_keys_internal: add MINGW key bindings for Home, End,
+         Delete, and Insert keys.  Fix from Pierre Muller
+         <pierre.muller@ics-cnrs.unistra.fr>
+
+builtins/printf.def
+       - printf_builtin: '%()T' conversion: if there is no argument supplied,
+         behave as if -1 had been supplied (current time).  ksh93-like feature
+         suggested by Clark Wang <dearvoid@gmail.com>
+
+doc/{bash.1,bashref.texi}
+       - document new printf %()T default argument behavior
+
+                                  12/15
+                                  -----
+lib/readline/display.c
+       - displaying_prompt_first_line: new variable, indicates whether or
+         not the first line of output is displaying the prompt.  Always true
+         in normal mode, sometimes false in horizontal scrolling mode
+       - rl_redisplay: set displaying_prompt_first_line to true unless we
+         are in horizontal mode; set to false in horizontal mode if the left
+         margin of the displayed line is greater than the end of the prompt
+         string
+       - rl_redisplay: when in horizontal scroll mode, don't adjust
+         _rl_last_c_pos by the wrap offset unless the line is displaying
+         a prompt containing invisible chars
+       - update line: don't adjust _rl_last_c_pos by the wrap offset unless
+         the line is displaying a prompt containing invisible chars
+       - update_line: if shrinking the line by reducing the number of
+         displayed characters, but we have already moved the cursor to the
+         beginning of the line where the first difference starts, don't
+         try to delete characters
+
+builtins/read.def
+       - unbuffered_read: set to 2 if invoked as `read -N'
+       - if unbuffered_read is set to 2, compute the number of chars we
+         need to read and read that many with zreadn.  Posix mode still
+         uses zreadintr.  Code from Mike Frysinger <vapier@gentoo.org>
+
+doc/{bash.1,bashref.texi}
+       - read: make it clear that if read times out, it saves any input
+         read to that point into the variable arguments.  Report from
+         Fiedler Roman <Roman.Fiedler@ait.ac.at>
+
+subst.c
+       - command_substitute: change direct assignment of exit_immediately_on_error
+         to use change_flag ('e', FLAG_OFF) instead
+
+flags.c
+       - use errexit_flag as the variable modified by changes to the -e
+         option, reflect those changes to exit_immediately_on_error
+
+execute_cmd.c
+       - execute_builtin: new global variable, builtin_ignoring_errexit, set
+         to 0 by default and set to 1 if eval/source/command executing in a
+         context where -e should be ignored
+       - execute_builtin: set exit_immediately_on_error to errextit_flag
+         after executing eval/source/command in a context where -e should
+         be ignored
+
+flags.c
+       - if builtin_ignoring_errexit is set, changes to errexit_flag are
+         not reflected in the setting of exit_immediately_on_error.  Fixes
+         bug reported by Robert Schiele <rschiele@gmail.com>
+
+                                  12/23
+                                  -----
+include/posixjmp.h
+       - setjmp_nosigs: new define, call setjmp in such a way that it will
+         not manipulate the signal mask
+
+{expr,test,trap}.c
+       - setjmp_nosigs: call instead of setjmp; don't need to manipulate
+         signal mask
+
+builtins/read.def
+       - read_builtin: setjmp_nosigs: call instead of setjmp; don't need
+         to manipulate signal mask
+
+builtins/evalstring.c:
+       - parse_and_execute: setjmp_nosigs: call instead of setjmp; don't need
+         to manipulate signal mask
+       - parse_string: setjmp_nosigs: call instead of setjmp; don't need
+         to manipulate signal mask
+       - parse_and_execute: save and restore the signal mask if we get a
+         longjmp that doesn't cause us to return or exit (case DISCARD)
+
+                                  12/24
+                                  -----
+general.c
+       - bash_tilde_expand: only set interrupt_immediately if there are no
+         signals trapped; we want to jump to top level if interrupted but
+         not run any trap commands
+
+                                  12/25
+                                  -----
+jobs.c
+       - run_sigchld_trap: no longer set interrupt_immediately before calling
+         parse_and_execute, even if this is no longer run in a signal handler
+         context
+
+input.c
+       - getc_with_restart: add call to QUIT instead of CHECK_TERMSIG
+
+parse.y
+       - yy_stream_get: now that getc_with_restart calls QUIT, don't need to
+         set interrupt_immediately (already had call to run_pending_traps)
+
+execute_cmd.c
+       - execute_subshell_builtin_or_function,execute_function,execute_in_subshell:
+         setjmp_nosigs: call instead of setjmp when saving return_catch; don't
+         need to manipulate signal mask
+       - execute_subshell_builtin_or_function,execute_in_subshell:
+         setjmp_nosigs: call instead of setjmp where appropriate when saving
+         top_level; don't need to manipulate signal mask if we're going to
+         exit right away
+
+subst.c
+       - command_substitute: setjmp_nosigs: call instead of setjmp when saving
+         return_catch; don't need to manipulate signal mask
+       - command_substitute: setjmp_nosigs: call instead of setjmp where
+         appropriate when saving top_level; don't need to manipulate signal
+         mask if we're going to exit right away
+
+trap.c
+       - run_exit_trap: setjmp_nosigs: call instead of setjmp when saving
+         return_catch; don't need to manipulate signal mask
+       - run_exit_trap: setjmp_nosigs: call instead of setjmp where
+         appropriate when saving top_level; don't need to manipulate signal
+         mask if we're going to exit right away
+       - _run_trap_internal: setjmp_nosigs: call instead of setjmp when saving
+         return_catch; don't need to manipulate signal mask
+
+builtins/evalfile.c
+       - _evalfile: setjmp_nosigs: call instead of setjmp when saving
+         return_catch; don't need to manipulate signal mask
+
+builtins/evalstring.c
+       - evalstring: setjmp_nosigs: call instead of setjmp when saving
+         return_catch; don't need to manipulate signal mask
+
+shell.c
+       - main: setjmp_nosigs: call instead of setjmp where appropriate when
+         saving top_level; don't need to manipulate signal mask if we're
+         going to exit right away
+       - run_one_command: setjmp_nosigs: call instead of setjmp where
+         appropriate when saving top_level; don't need to manipulate signal
+         mask if we're going to exit right away
+       - run_wordexp: setjmp_nosigs: call instead of setjmp where
+         appropriate when saving top_level; don't need to manipulate signal
+         mask if we're going to exit right away
+
+eval.c
+       - reader_loop: save and restore the signal mask if we get a longjmp
+         that doesn't cause us to return or exit (case DISCARD)
+
+                                  12/26
+                                  -----
+parse.y
+       - shell_input_line_{index,size,len}: now of type size_t; in some cases
+         the unsigned property makes a difference
+       - STRING_SAVER: saved_line_{size,index} now of type size_t
+       - shell_getc: don't allow shell_input_line to grow larger than SIZE_MAX;
+         lines longer than that are truncated until read sees a newline;
+         addresses theoretical buffer overflow described by Paul Eggert
+         <eggert@cs.ucla.edu>
+       - set_line_mbstate: size_t changes like shell_getc
+       - shell_getc: if shell_input_line is larger than 32K, free it and
+         start over to avoid large memory allocations sticking around
+
+variables.c
+       - bind_global_variable: new function, binds value to a variable in
+         the global shell_variables table
+
+variables.h
+       - bind_global_variable: new extern declaration
+
+builtins/declare.def
+       - declare_internal: if -g given with name=value, but variable is not
+         found in the global variable table, make sure to call
+         bind_global_variable so the variable is created and modified at
+         global scope.  Fixes a bug where declare -g x=y could modify `x'
+         at a previous function scope
+
+command.h
+       - W_ASSIGNARRAY: new word flag, compound indexed array assignment
+
+subst.h
+       - ASS_MKGLOBAL: new assignment flag, forcing global assignment even in
+         a function context, used by declare -g
+
+execute_cmd.c
+       - fix_assignment_words: set W_ASSIGNARRAY flag if -a option given to
+         declaration builtin
+
+subst.c
+       - do_assignment_internal: explicitly handle case where we are
+         executing in a function and we want to create a global array or
+         assoc variable
+       - shell_expand_word_list: call make_internal_declare if -a option
+         given to declaration builtin (W_ASSIGNARRAY); handle -g option with
+         it (W_ASSNGLOBAL).  Fixes inconsistency noticed by Vicente Couce
+         Diaz <vituko@gmail.com>, where declare -ag foo=(bar) could modify
+         array variable foo at previous function scope, not global scope
+
+                                  12/27
+                                  -----
+bashline.c
+       - Minix needs the third argument to tputs to be a void funtion taking
+         an int argument, not an int-returning function.  Fix from
+         John E. Malmberg <wb8tyw@qsl.net> as part of VMS bash port
+
+                                  12/29
+                                  -----
+configure.ac,version.c,patchlevel.h
+       - bash-4.3-devel: new version, new shell compatibility level (43)
+
+subst.c
+       - parameter_brace_patsub: put the bash-4.2 code back in from the
+         change of 3/3 that runs the replacement string through quote
+         removal, make it dependent on shell_compatibility_level <= 42
+
+builtins/shopt.def
+       - compat42: new shopt option
+       - set_compatibility_level: change logic to set and unset various
+         compat variables and shell_compatibility_level
+
+COMPAT
+       - new documentation for bash-4.3 compatibility changes
+
+doc/{bash.1,bashref.texi}
+       - compat42: document new shopt option
+
+builtins/shopt.def
+       - set_compatibility_opts: new function, sets the various shopt
+         compat variables based on the value of shell_compatibility_level
+
+builtins/common.h
+       - set_compatibility_opts: new extern declaration
+
+variables.c
+       - BASH_COMPAT: new special variable; sets the shell compatibility
+         level.  Accepts values in decimal (4.2) or integer (42) form;
+         Unsetting variable, setting it to empty string, or setting it to
+         out-of-range value sets the shell's compatibility level to the
+         default for the current version.  Valid values are 3.1/31 through
+         the current version
+       - sv_shcompat: new function implementing logic for BASH_COMPAT
+
+variables.h
+       - sv_shcompat: new extern declaration
+
+doc/{bash.1,bashref.texi}
+       - BASH_COMPAT: description of new variable
+
+lib/readline/complete.c
+       - _rl_colored_stats: default back to 0 for 4.3 release branch
+
+                                1/5/2013
+                                --------
+quit.h
+       - remove spurious call to itrace in CHECK_WAIT_INTR
+
+bashline.c
+       - bash_event_hook: if we're going to jump to top_level, make sure we
+         clean up after readline() by calling rl_cleanup_after_signal().
+         Fixes bug reported against devel branch by Raphaël Droz
+         <raphael.droz@gmail.com>
+       - bash_event_hook: reset the event hook before checking for signals
+         or traps in case we longjmp
+
+doc/{bash.1,bashref.texi}
+       - small additions to the set -e section to make it more clear that
+         contexts where -e is ignored extend to compound commands as well
+         as shell functions
+
+lib/readline/readline.h
+       - rl_signal_event_hook: new extern declaration
+
+lib/readline/input.c
+       - rl_signal_event_hook: new variable, hook function to call when a
+         function (currently just read(2)) is interrupted by a signal and
+         not restarted
+       - rl_getc: call rl_signal_event_hook instead of rl_event_hook
+
+lib/readline/doc/rltech.texi
+       - rl_signal_event_hook: document new function
+
+bashline.c
+       - changes to set rl_signal_event_hook instead of rl_event_hook
+
+lib/readline/readline.h
+       - change readline version numbers to 6.3
+
+                                   1/6
+                                   ---
+doc/{bash.1,bashref.texi}
+       - a couple of changes to the descriptions of the ERR trap and its
+         effects based on a message from Rob Nagler <nagler@bivio.biz>
+
+                                   1/9
+                                   ---
+expr.c
+       - expassign: invalidate curlval before freeing and NULLing tokstr to
+         avoid aliasing issues.  Fixes bug reported by Eduardo A. Bustamante
+         López<dualbus@gmail.com>  and Dan Douglas <ormaaj@gmail.com>
+
+braces.c
+       - array_concat: don't be so aggressive in trying to short-circuit. We
+         can only short-circuit if we have a single-element array where the
+         element is an empty string (array[0] == "" array[1] = 0x0).  Existing
+         practice requires us to replicate arrays and prefix or append empty
+         strings.  Fixes bug reported by Eduardo A. Bustamante López
+         <dualbus@gmail.com>
+
+                                  1/11
+                                  ----
+execute_cmd.c
+       - execute_builtin: since mapfile uses evalstring() to run its callbacks
+         internally, just like eval, so it needs to handle the case where the
+         temp environment given to mapfile persists throughout the entire
+         set of callback commands.  This might be a problem with trap also, but
+         trap isn't run in the same way.  Fixes bug reported by Dan Douglas
+         <ormaaj@gmail.com>
+
+                                  1/13
+                                  ----
+redir.c
+       - redirection_error: before expanding the redirection word (if
+         expandable_redirection_filename returns true), disable command
+         substitution during expansion.  Fixes bug reported by Dan Douglas
+         <ormaaj@gmail.com>
+
+subst.c
+       - expand_word_internal: case '\\': if the next character is an IFS
+         character, and the expansion occurs within double quotes, and the
+         character is not one for which backslash retains its meaning, add
+         the (escaped) '\' and the (escaped) character.  Fixes bug reported
+         by Dan Douglas <ormaaj@gmail.com>
+
+                                  1/15
+                                  ----
+builtins/cd.def
+       - cd_builtin: make sure call to internal_getopt handles -e option.
+         Fixes bug reported by <mashimiao.fnst@cn.fujitsu.com>
+
+                                  1/17
+                                  ----
+subst.c
+       - expand_word_list_internal: make sure tempenv_assign_error is
+         initialized to 0
+
+execute_cmd.c
+       - execute_simple_command: make sure tempenv_assign_error is reset to 0
+         after it's tested to see if an error should force the shell to exit.
+         Fixes problem where a the failure of a tempenv assignment preceding
+         a non-special builtin `sticks' and causes the next special builtin
+         to exit the shell.  From a discussion on bug-bash started by
+         douxin <wq-doux@cn.fujitsu.com>
+
+                                  1/20
+                                  ----
+subst.c
+       - parameter_brace_expand_rhs: call stupidly_hack_special_variables
+         after assigning with ${param[:]=word} even if IFS is changing.
+         Suggested by Dan Douglas <ormaaj@gmail.com> [TENTATIVE, needs work
+         on IFS side effects]
+
+command.h
+       - W_GLOBEXP (which was unused) is now W_SPLITSPACE (which isn't used
+         yet)
+
+{execute_cmd,subst,variables}.c
+       - removed all code that mentioned W_GLOBEXP
+       - removed mention of gnu_argv_flags and code that set it
+
+                                  1/22
+                                  ----
+subst.c
+       - param_expand: set W_SPLITSPACE if we expand (unquoted) $* and
+         IFS is unset or null so we can be sure to split this on spaces
+         no matter what happens with IFS later
+       - expand_word_internal: note that param_expand returns W_SPLITSPACE
+         in the returned word flags and keep track of that state with
+         `split_on_spaces'
+
+                                  1/23
+                                  ----
+subst.c
+       - expand_word_internal: if split_on_spaces is non-zero, make sure
+         we split `istring' on spaces and return the resultant word.  The
+         previous expansions should have quoted spaces in the positional
+         parameters where necessary.  Suggested by Dan Douglas
+         <ormaaj@gmail.com>
+
+execute_cmd.c
+       - execute_command_internal: make sure any subshell forked to run a
+         group command or user subshell at the end of a pipeline runs any
+         EXIT trap it sets.  Fixes debian bash bug 698411
+         http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698411
+
+subst.c
+       - shell_expand_word_list: fix code that creates args for and calls
+         make_internal_declare to avoid calling it twice (missing `else'
+         in 12/26 change)
+       - do_assignment_internal: fix code from 12/26 change to fix problem
+         where an existing assoc variable could be converted to an array
+         without checking `mkassoc'
+
+                                  1/24
+                                  ----
+builtins/evalfile.c
+       - _evalfile: add missing `close (fd)' calls before returning to
+         avoid fd leaks.  Bug and fix from Roman Rakus <rrakus@redhat.com>
+
+                                  1/25
+                                  ----
+builtins/read.def
+       - read_builtin: don't try to play tricks with the top of the unwind-
+         protect stack after read gets a SIGALRM; save input_string to new
+         memory, run the stack, then restore input_string and assign the
+         variables.  Part of fix for bug reported by konsolebox
+         <konsolebox@gmail.com>; the rest of the fix is with the changes in
+         trap and signal handling and doing away with interrupt_immediately
+
+                                  1/26
+                                  ----
+redir.c
+       - redirection_expand, write_here_string, write_here_document: before
+         calling any of the word expansion functions, after setting
+         expanding_redir to 1 (which bypasses the temp environment in the
+         variable lookup functions), call sv_ifs to reset the cached IFS-
+         related variables set by subst.c:setifs().  This ensures that
+         redirections will not get any IFS values that are set in the
+         temporary environment, as Posix specifies.  Then, after the word
+         expansions, after resetting expanding_redir to 0, call sv_ifs
+         again to make sure the cached IFS values are set from any
+         assignments in the temporary environment.  We force executing_builtin
+         to 1 to `fool' the variable lookup functions into using any temp
+         environment, then reset it to its old value after sv_ifs returns.
+         This is what allows read() to use the (cached) IFS variables set
+         in the temp environment. Fixes inconsistency reported by Dan Douglas
+         <ormaaj@gmail.com>
+
+                                  1/29
+                                  ----
+lib/readline/display.c
+       - update_line: fix off-by-one error when updating vis_lbreaks array
+         in a multibyte locale that occurs when moving multibyte chars from
+         one line down to another.  Bug report and fix from Egmont
+         Koblinger <egmont@gmail.com>
+
+                                  1/30
+                                  ----
+configure.ac
+       - changed version to 4.3-alpha
+
+redir.c
+       - redir_open: handle open returning -1/EINTR, which seems to happen
+         a lot with FIFOs and SIGCHLD, and call QUIT to handle other
+         signals that can interrupt open(2).  Bug report and initial fix
+         from Mike Frysinger <vapier@gentoo.org>
+
+                                  1/31
+                                  ----
+subst.c
+       - parameter_brace_expand: make sure to propagate the PF_ASSIGNRHS flag
+         to parameter_brace_expand_word
+       - parameter_brace_expand_word: make sure that if the PF_ASSIGNRHS flag
+         is set and we are expanding ${a[@]} or ${a[*]} we set quoted to
+         include Q_DOUBLE_QUOTES before calling array_value_internal, mirroring
+         what we do for $@ and $*.  Fixes inconsistency reported by Dan
+         Douglas <ormaaj@gmail.com>
+
+configure.ac
+       - use AC_CHECK_TOOL instead of AC_CHECK_PROG to check for ar, since it
+         will find $host-prefixed versions of utilities.  Report and fix from
+         Mike Frysinger <vapier@gentoo.org>
+
+builtins/setattr.def
+       - set_var_attribute: check whether bind_variable (called when the
+         variable whose attributes are being modified is found in the temp
+         environment) just modified a read-only global variable, and don't
+         bother marking the temporary variable for propagation if so.  The
+         propagation is superfluous and will result in a strange error
+         message
+
+                                   2/2
+                                   ---
+variables.c
+       - initialize_shell_variables: don't try to import function definitions
+         with invalid names from the environment if already in posix mode,
+         but create them as (invisible) exported variables so they pass
+         through the environment.  Print an error message so user knows
+         what's wrong.  Fixes bug reported by Tomas Trnka <ttrnka@mail.muni.cz>
+
+                                   2/9
+                                   ---
+
+builtins/read.def
+       - sigalrm_seen, alrmbuf: now global so the rest of the shell (trap.c)
+         can use them
+       - sigalrm: just sets flag, no longer longjmps to alrmbuf; problem was
+         longjmp without manipulating signal mask, leaving SIGALRM blocked
+
+quit.h
+       - move CHECK_ALRM macro here from builtins/read.def so trap.c:
+         check_signals() can call it
+
+trap.c
+       - check_signals: add call to CHECK_ALRM before QUIT
+       - check_signals_and_traps: call check_signals() instead of including
+         CHECK_ALRM and QUIT inline.  Integrating check for read builtin's
+         SIGALRM (where zread call to check_signals_and_traps can see it)
+         fixes problem reported by Mike Frysinger <vapier@gentoo.org>
+
+                                  2/12
+                                  ----
+lib/glob/xmbsrtowcs.c
+       - xdupmbstowcs2: fixed but where end of string was not handled
+         correctly, causing loop to go past end of string in a bunch of cases.
+         Fixes bug reported by "Dashing" <dashing@hushmail.com>
+
+
+                                  2/13
+                                  ----
+builtins/pushd.def
+       - popd_builtin: treat any argument that isn't -n or of the form
+         [-+][[:digit:]]* as an error.  Fixes problem reported by Bruce
+         Korb <bruce.korb@gmail.com>
+
+                                  2/14
+                                  ----
+configure.ac
+       - add check for sig_atomic_t; already a placeholder for it in
+         config.h.in
+
+                                  2/15
+                                  ----
+subst.c
+       - do_compound_assignment: don't call assign_compound_array_list with
+         a NULL variable in case make_local_xxx_variable returns NULL
+         (it will if you try to shadow a readonly or noassign variable).
+         Fixes bug reported by Richard Tollerton <rich.tollerton@ni.com>
+
+                                  2/16
+                                  ----
+variables.c
+       - make_local_variable: print error messager if an attempt is made to
+         create a local variable shadowing a `noassign' variable.  Previously
+         we just silently refused to do it
+
+trap.[ch]
+       - get_original_signal: now global so rest of the shell can use it
+
+sig.c
+       - initialize_shell_signals: install a signal handler for SIGTERM
+         that does nothing except set a sigterm_received flag instead of
+         ignoring it with SIG_IGN, as long as SIGTERM is not ignored when
+         the shell is started.  Use get_original_signal early to get the
+         original handler, since we will do that later anyway
+       - set_signal_handler: if installing sigterm_sighandler as the SIGTERM
+         handler, make sure to add SA_RESTART flag to make it as close to
+         SIG_IGN as possible
+
+sig.h
+       - sigterm_sighandler: new extern declaration
+
+quit.h
+       - RESET_SIGTERM: set sigterm_receved to 0
+       - CHECK_SIGTERM: check sigterm_received; if it's non-zero, treat it
+         as a fatal signal and call termsig_handler to exit the shell
+
+jobs.c
+       - make_child: call RESET_SIGTERM just before fork() so we can detect
+         if the child process received a SIGTERM before it's able to change
+         the signal handler back to what it was when the shell started
+         (presumably SIG_DFL).  Only has effect if the shell installed
+         sigterm_sighandler for SIGTERM, interactive shells that were not
+         started with SIG_IGN as the SIGTERM handler
+       - make_child: call RESET_SIGTERM in the parent after fork() so the
+         rest of the shell won't react to it
+
+execute_cmd.c
+       - execute_simple_command: call CHECK_SIGTERM after make_child in child
+         to catch SIGTERM received after fork() and before restoring old
+         signal handlers
+       - execute_disk_command: call CHECK_SIGTERM after make_child in child
+         process after restoring old signal handlers and again just before
+         calling shell_execve.  Fixes race condition observed by
+         Padraig Brady <p@draigbrady.com> when testing with his `timeout'
+         program
+
+lib/readline/display.c
+       - open_some_spaces: new function, subset of insert_some_chars that just
+         opens up a specified number of spaces to be overwritten
+       - insert_some_spaces: now just calls to open_some_spaces followed by
+         _rl_output_some_chars
+       - update_line: use col_temp instead of recalculating it using
+         _rl_col_width in the case where we use more columns with fewer bytes
+       - update_line: use open_some_spaces and then output the right number
+         of chars instead of trying to print new characters then overwrite
+         existing characters in two separate calls.  This includes removing
+         some dodgy code and making things simpler.  Fix from Egmont
+         Koblinger <egmont@gmail.com>
+       - use new variable `bytes_to_insert' instead of overloading temp in
+         some code blocks (nls - nfd, bytes that comprise the characters
+         different in the new line from the old)
+
+                                  2/18
+                                  ----
+redir.c
+       - do_redirection_internal: add undoable redirection for the implicit
+         close performed by the <&n- and >&n- redirections.  Fixes bug
+         reported by Stephane Chazelas <stephane.chazelas@gmail.com>
+
+                                  2/19
+                                  ----
+sig.c
+       - termsig_handler: an interactive shell killed by SIGHUP and keeping
+         command history will try to save the shell history before exiting.
+         This is an attempt to preserve the save-history-when-the-terminal-
+         window-is-closed behavior
+
+                                  2/21
+                                  ----
+braces.c
+       - brace_expand: if a sequence expansion fails (e.g. because the
+         integers overflow), treat that expansion as a simple string, including
+         the braces, and try to process any remainder of the string.  The
+         remainder may include brace expansions.  Derived from SuSE bug
+         804551 example (https://bugzilla.novell.com/show_bug.cgi?id=804551)
+
+                                  2/23
+                                  ----
+{quit,sig}.h,sig.c
+       - sigterm_received declaration now in sig.h; type is sig_atomic_t
+       - sigwinch_received type now sig_atomic_t
+       - sig.h includes bashtypes.h and <signal.h> if SIG_DFL not defined
+         (same logic as trap.h) to pick up sig_atomic_t
+
+unwind_prot.c
+       - include sig.h before quit.h (reverse order)
+
+                                  2/27
+                                  ----
+builtins/shopt.def
+       - reset_shopt_options: make sure check_window_size is reset to the
+         default from config.h, not unconditionally to 0
+
+jobs.[ch]
+       - last_made_pid, last_asynchronous_pid: now volatile.  Change from SuSE
+
+jobs.c
+       - wait_for: if we're using sigaction to install a handler for SIGCHLD,
+         make sure we specify SA_RESTART
+
+lib/{tilde,readline}/shell.c
+       - get_home_dir: instead of looking in the password file every time,
+         look once and cache the result
+
+sig.[ch]
+       - sigwinch_received, sigterm_received: now `volatile' qualified
+
+sig.c,quit.h
+       - interrupt_state,terminating_signal: now sig_atomic_t
+
+                                   3/1
+                                   ---
+MANIFEST,examples/*
+       - removed around 120 files without FSF copyrights; requested by
+         Karl Berry in early January
+
+                                   3/2
+                                   ---
+lib/malloc/malloc.c
+       - morecore: only check whether SIGCHLD is trapped if SIGCHLD is defined
+
+doc/bashref.texi
+       - Fixed most of the examples in the GNU Parallel section to use better
+         shell idioms following complaints on bug-bash; added a couple of
+         examples and smoothed out the text
+
+quit.h
+       - include "sig.h" for sig_atomic_t
+
+lib/readline/display.c
+       - update_line: when inserting one or more characters at the end of
+         the display line in a non-multibyte environment, just write from the
+         first difference to the end of the line and return. We don't have
+         to adjust _rl_last_c_pos.  This is needed to adjust from the old
+         two-part copy to a single call to _rl_output_some_chars (change of
+         2/16)
+
+                                   3/4
+                                   ---
+Makefile.in,doc/Makefile.in
+       - PACKAGE_TARNAME, docdir: new variables substituted by autoconf
+       - OTHER_DOCS,OTHER_INSTALLED_DOCS: new variables with auxiliary
+         documentation files to be installed into $(docdir)
+       - install: add new rule to install $(OTHER_DOCS)
+       - uninstall: add new rule to uninstall $(docdir)/$(OTHER_INSTALLED_DOCS)
+
+doc/bash.1
+       - add URL to `POSIX' file in `SEE ALSO' section; put pointer to that
+         section in --posix and set -o posix descriptions
+
+examples/
+       - removed around 110 examples at the request of the FSF due to copyright
+         issues
+
+                                   3/5
+                                   ---
+builtins/setattr.def
+       - readonly: modified help text slightly to make it clearer that
+         functions aren't changed or displayed unless the -f option is given.
+         Report from <gotmynick@gmail.com>
+
+                                   3/9
+                                   ---
+include/typemax.h
+       - SIZE_MAX: define to 65535 (Posix minimum maximum) if not defined
+
+parse.y
+       - include "typemax.h" for possible SIZE_MAX definition, make sure we
+         include it after shell.h
+
+{braces,expr}.c
+       - include "typemax.h" for possible INTMAX_MIN and INTMAX_MAX definitions
+
+                                  3/10
+                                  ----
+bashline.c
+       - bash_default_completion: make sure completion type of `!' (same as
+         TAB but with show-all-if-ambiguous set) and glob-word-completion
+         sets rl_filename_completion_desired to 0 so extra backslashes don't
+         get inserted by `quoting' the completion.  We can't kill all the
+         matches because show-all-if-ambiguous needs them.   Bug report from
+         Marcel (Felix) Giannelia <info@skeena.net>
+
+[bash-4.3-alpha frozen]
+
+                                  3/14
+                                  ----
+general.c
+       - trim_pathname: use memmove instead of memcpy since the source and
+         destination pathnames may overlap.  Report and fix from Matthew
+         Riley <mattdr@google.com>
+
+                                  3/18
+                                  ----
+configure.ac
+       - socklen_t is defined as `unsigned int' if configure can't find it
+
+                                  3/20
+                                  ----
+lib/readline/complete.c
+       - S_ISVTX: since it's not defined on all platforms (Minix), make sure
+         its use is protected with #ifdef
+
+                                  3/21
+                                  ----
+doc/{bash.1,bashref.texi}
+       - Added mention of ${!name[@]} and ${!name[*]} expansions to get all
+         indices of an array.  Suggested by Jonathan Leffler
+         <jonathan.leffler@gmail.com>
+
+                                  3/24
+                                  ----
+subst.h
+       - SD_IGNOREQUOTE: new define for skip_to_delim; if set, means that
+         single quotes (for now) will be treated as ordinary characters
+
+subst.c
+       - skip_to_delim: handle SD_IGNOREQUOTE. no callers use it for now
+
+                                  3/25
+                                  ----
+support/config.{guess,sub}
+       - updated to versions from autoconf-2.69
+
+                                  3/31
+                                  ----
+lib/sh/shquote.c
+       - sh_single_quote: short-circuit quoting a single "'" instead of
+         creating a long string with empty single-quoted strings
+
+parser.h
+       - DOLBRACE_QUOTE2: new define, like DOLBRACE_QUOTE, but need to single-
+         quote results of $'...' expansion because quote removal will be
+         done later.  Right now this is only done for ${word/pat/rep}
+
+parse.y
+       - parse_matched_pair: set state to DOLBRACE_QUOTE2 for pattern
+         substitution word expansion so we don't treat single quote specially
+         in the pattern or replacement string
+       - parse_matched_pair: if we're parsing a dollar-brace word expansion
+         (${...}) and we're not treating single quote specially within
+         double quotes, single-quote the translation of $'...' ansi-c
+         escaped strings.  Original report and fix from Eduardo A.
+         Bustamante López <dualbus@gmail.com>
+
+subst.c
+       - extract_dollar_brace_string: ${word/pat/rep} scanning now sets the
+         DOLBRACE_QUOTE2 flag instead of DOLBRACE_QUOTE so we don't treat
+         single quotes specially within a double-quoted string
+
+execute_cmd.c
+       - fix_assignment_words: skip over assignment statements preceding a
+         command word before trying to figure out whether or not assignment
+         statements following a possible declaration command should be 
+         treated specially.  Fixes bug reported by Dan Douglas
+         <ormaaj@gmail.com>
+
+                                   4/4
+                                   ---
+lib/readline/readline.c
+       - _rl_dispatch_subseq: only call _rl_vi_set_last (and check whether
+         the key is a text modification command) if the key sequence length
+         is 1.  That keeps the arrow keys from setting the last command
+         when called in vi command mode.  Fixes bug reported by Ian A.
+         Watson <watson_ian_a@lilly.com>
+
+                                   4/6
+                                   ---
+lib/readline/bind.c
+       - rl_parse_and_bind: when parsing a double-quoted string as the value
+         of a variable, make sure we skip past the leading double quote.
+         Fix from Andreas Schwab <schwab@linux-m68k.org>
+
+variables.c
+       - hash_lookup: set new local variable last_table_searched to the table
+         a successful lookup appears in; tested in make_local_variable to
+         solve the problem below
+       - make_local_variable: if we find a variable with the tempenv flag
+         set at the same `level' as variable_context', but not found in the
+         temporary_env (temp environment preceding the builtin), return it.
+         The temp environment preceding the function call has already been
+         merged (in execute_function) into the list of variable contexts the
+         function sees as shell_variables by the time this is called.  Fixes
+         inconsistency pointed out by Dan Douglas <ormaaj@gmail.com>
+
+subst.c
+       - expand_arith_string: expanded out contents of expand_string,
+         expand_string_internal, expand_string_if_necessary to create a
+         WORD_DESC and call call_expand_word_internal() on it directly.
+         We don't want process substitution to be performed ( 1<(2) ) should
+         mean something different in an arithmetic expression context.
+         It doesn't work to just turn on the DQUOTE flag, since that means
+         that things like ${x["expression"]} are not expanded correctly.
+         Fixes problem pointed out by Dan Douglas <ormaaj@gmail.com>
+
+                                  4/13
+                                  ----
+subst.c
+       - process_substitute: run the EXIT trap before exiting, as other
+         shells seem to.  Fixes problem pointed out by Dan Douglas
+         <ormaaj@gmail.com>
+
+lib/readline/readline.c
+       - readline_internal_setup: call rl_vi_insertion_mode to enter vi
+         mode instead of rl_vi_insert_mode to avoid resetting the saved last
+         command information.  Posix says that `.' can repeat a command
+         that was entered on a previous line so we need to save the info.
+         Fixes bug reported by Ian A. Watson <watson_ian_a@lilly.com>
+
+                                  4/14
+                                  ----
+lib/readline/complete.c
+       - rl_completion_matches: make sure xrealloc returns something non-null
+         (can happen when interrupted by a signal) before trying to add
+         matches to match_list
+
+subst.c
+       - array_remove_pattern: return NULL right away if array_variable_part
+         returns an invisible variable
+       - array_length_reference: handle array_variable_part returning an
+         invisible variable
+       - get_var_and_type: handle array_variable_part returning an invisible
+         variable
+
+                                  4/15
+                                  ----
+execute_cmd.c
+       - execute_command_internal: make sure to run the EXIT trap for group
+         commands anywhere in pipelines, not just at the end.  From a point
+         raised by Andreas Schwab <schwab@linux-m68k.org>
+
+variables.c
+       - bind_int_variable: make sure invisible flag is unset.  Fixes problems
+         like "declare -ai a; : $(( a[4]=4 ));"
+
+arrayfunc.c
+       - array_variable_part: return variable even if invisible flag set,
+         callers must handle invisible vars
+
+                                  4/18
+                                  ----
+builtins/set.def
+       - unset_builtin: if -n flag given, call unset_nameref instead of
+         unset_variable
+
+variables.c
+       - find_variable_nameref: print warning message if nameref circular
+         reference detected, return NULL and let caller deal with it
+
+builtins/declare.def
+       - declare_builtin: only disallow global references at this point if
+         we are at the global scope
+
+                                  5/16
+                                  ----
+configure.ac
+       - update release status to beta
+
+                                  5/23
+                                  ----
+trap.c
+       - run_pending_traps: save and restore pipeline around calls to
+         evalstring() in case we get a trap while running a trap. Have to
+         figure out the recursive running traps issue elsewhere.  Fixes
+         bug reported by Roman Rakus <rrakus@redhat.com>
+       - run_pending_traps: make sure to set running_trap to the appropriate
+         signal value when running a trap command
+       - run_pending_traps: short-circuit immediately if running_trap set
+         when invoked.  Could change this later to only skip if it would
+         run the same trap as currently being run (running_trap == sig + 1)
+
+configure.ac
+       - add warning if bison not found
+
+lib/readline/doc/rltech.texi
+       - new section with an example program illustrating the callback
+         interface. Suggested by Peng Yu <pengyu.ut@gmail.com>
+
+examples/loadables/Makefile.in
+       - remove references to `cut' and `getconf', which were removed in
+         early March
+
+                                  5/28
+                                  ----
+lib/sh/pathphys.c
+       - sh_realpath: correct inverted two arguments to call to sh_makepath.
+         Report and fix from Julien Thomas <jthomas@exosec.fr>
+
+                                   6/7
+                                   ---
+execute_cmd.c
+       - executing_line_number: the else clauses that are conditional on
+         various options being defined can simply be if clauses -- they are
+         mutually exclusive and all have `return' in the body.  Fixes bug
+         reported by Flavio Medeiros <flaviomotamedeiros@gmail.com>
+
+                                  6/25
+                                  ----
+lib/readline/readline.c
+       - readline_internal_setup: only sent the meta-key enable string to the
+         terminal if we've been told to use one and the terminal has been
+         successfully initialized (RL_ISSTATE (RL_STATE_TERMPREPPED) != 0).
+         Suggested by Dan Mick <dan.mick@inktank.com>
+
+lib/readline/signals.c
+       - _rl_signal_handler: call any defined signal hook after calling
+         rl_resize_terminal when handling a SIGWINCH.  We already have called
+         the original SIGWINCH handler but will not be resending the signal
+         to ourselves
+
+                                  6/27
+                                  ----
+lib/readline/doc/history.3, doc/bash.1
+       - fix description of the `$' modifier to note that it expands to the
+         last *word*, which is not always the last argument.  Report from
+         ariyetz@gmail.com via gnu.org RT
+
+                                  6/29
+                                  ----
+lib/glob/smatch.c
+       - glob_asciiranges: initialize to value of GLOBASCII_DEFAULT instead
+         of 0 (0 if not defined)
+
+configure.ac,config.h.in
+       - --enable-glob-asciiranges-default: new option, controls the value of
+         GLOBASCII_DEFAULT; use it to turn globasciiranges shopt option on
+         by default
+
+doc/bashref.texi
+       - document new --enable-glob-asciiranges-default configure option
+
+variables.c
+       - assign_in_env: implement += value appending semantics for assignments
+         preceding command names
+
+                                   7/4
+                                   ---
+expr.c
+       - set lasttok = NUM in all of the functions that result in a number,
+         even if it's a boolean, to avoid errors with constructs like
+         1 * x = 1, which should be an asignment error.  Fixes problem
+         pointed out by Dan Douglas <ormaaj@gmail.com>
+
+parse.y
+       - decode_prompt_string: don't bother to call strcpy if
+         polite_directory_format returns its argument unchanged.  It's not
+         necessary and Mac OS X 10.9 aborts because of a supposed overlapping
+         string copy.  Bug and fix from simon@hitzemann.org
+
+subst.c
+       - parameter_brace_find_indir: new function, code from
+         parameter_brace_expand_indir that looks up the indirectly-referenced
+         variable, but does not expand it
+       - parameter_brace_expand_indir: call parameter_brace_find_indir to
+         look up indirected variable reference
+       - get_var_and_type: call parameter_brace_find_indir if it looks like we
+         are trying to manipulate an indirect variable reference like
+         ${!b%%foo}.  This makes a difference if !b references an array
+         variable.  Bug report from Dan Douglas <ormaaj@gmail.com>
+
+                                   7/6
+                                   ---
+lib/sh/casemod.c
+       - sh_modcase: make sure argument passed to is_basic is <= UCHAR_MAX,
+         since cval can convert something to a wchar_t greater than UCHAR_MAX.
+         Fixes bug reported by Tomasz Tomasik <scx.mail@gmail.com>
+
+                                   7/8
+                                   ---
+lib/readline/history.c
+       - add_history_time: if history_length == 0, referencing history_length
+         - 1 will result in an array bounds error, so make history_length be
+         at least 1 before going on.  Fixes bug reported by Geng Sheng Liu
+         <gsliu.tju@gmail.com>
+
+builtins/setattr.def
+       - show_func_attributes: display definition (if NODEFS argument is 0) and
+         attributes for a particular function; used by `declare -fp name'
+
+builtins/declare.def
+       - declare_internal: call show_func_attributes if -f supplied with -p.
+         Fixes inconsistency observed by Linda Walsh <bash@tlinx.org>
+
+builtins/common.h
+       - new extern declaration for show_func_attributes
+
+builtins/read.def
+       - read_builtin: check the first supplied variable name for validity
+         before attempting to read any input, since we know we will have to
+         at least use that one.  Don't check any other names yet.  Suggested
+         by jidanni@jidanni.org
+
+                                  7/10
+                                  ----
+redir.c
+       - do_redirection_internal: when closing a file descriptor with
+         r_close_this ([n]<&-) count close errors as redirection errors if
+         errno ends up as EIO or ENOSPC.  Originally reported back in April
+         2012 by Andrey Zaitsev <jstcdr@gmail.com>
+
+                                  7/11
+                                  ----
+redir.c
+       - do_redirection_internal: before calling check_bash_input, make sure
+         that we don't call check_bash_input for an asynchronous process that
+         is replacing stdin with something else. The seek backwards affects
+         the parent process as well, since parents and children share the
+         file pointer. Fixes problem originally reported in March 2013 by
+         Martin Jackson <mjackson220.list@gmail.com>
+
+                                  7/13
+                                  ----
+doc/{bash.1,bashref.texi}
+       - slight change to add a description of `shopt -o' suggested by Bruce
+         Korb <bruce.korb@gmail.com>
+
+                                  7/19
+                                  ----
+lib/readline/histfile.c
+       - history_do_write: if close returns < 0, make sure we restore the
+         backup history file and return a non-zero value
+       - history_truncate_file: if write or close return < 0, make sure we
+         return a non-zero value
+
+[bash-4.3-beta frozen]
+
+                                  7/21
+                                  ----
+lib/readline/isearch.c
+       - rl_display_search: now takes an entire search context flags word as
+         the second argument, instead of just reverse flag; changed callers
+       - rl_display_search: if the search has failed, add `failed ' to the
+         beginning of the search prompt
+       - _rl_isearch_dispatch: if the search has failed, display the entire
+         search string with an indication that the search failed but with the
+         last matching line.  Suggested by jidanni@jidanni.org
+
+command.h
+       - W_ASSIGNINT: new word flag; used internally for make_internal_declare
+         and set by fix_assignment_words
+
+execute_cmd.c
+       - fix_assignment_words: set W_ASSIGNINT if compound assignment and -i
+         given as option.  We don't do anything with the value yet
+
+subst.c
+       - shell_expand_word_list: rework the way the option list that is
+         passed to make_internal_declare is created
+
+                                   8/1
+                                   ---
+doc/{bash.1,bashref.texi}
+       - minor changes to description of $! based on a report from Chris
+         Down <chris@chrisdown.name>
+
+arrayfunc.c
+       - assign_array_element_internal: before trying to get an array's max
+         index to process a negative subscript, make sure the array exists.
+         Bug report from Geir Hauge <geir.hauge@gmail.com>
+
+                                   8/2
+                                   ---
+arrayfunc.c
+       - assign_array_element_internal: before using array_max_index() when
+         processing a negative subscript, make sure the variable is an array.
+         if it's not, use 0 as array_max_index assuming it's a string.
+         Fixes bug report from Geir Hauge <geir.hauge@gmail.com>
+
+                                   8/3
+                                   ---
+Makefile.in
+       - pcomplete.o: add dependency on $(DEFDIR)/builtext.h. Suggested by
+         Curtis Doty <curtis@greenkey.net>
+
+                                   8/5
+                                   ---
+lib/glob/sm_loop.c
+       - strcompare: short-circuit and return FNM_NOMATCH if the lengths of the
+         pattern and string (pe - p  and se - s, respectively) are not equal
+       - strcompare: don't bother trying to set *pe or *se to '\0' if that's
+         what they already are.  Fixes bug reported by Geir Hauge
+         <geir.hauge@gmail.com>
+
+                                   8/6
+                                   ---
+doc/{bash.1,bashref.texi},builtins/hash.def,lib/readline/doc/rluser.texi
+       - minor typo changes from Geir Hauge <geir.hauge@gmail.com>
+
+bultins/help.def
+       - show_longdoc: avoid trying to translate the empty string because it
+         often translates to some boilerplate about the project and
+         translation.  Report and fix from Geir Hauge <geir.hauge@gmail.com>
+
+                                   8/8
+                                   ---
+builtins/help.def
+       - help_builtin: try two passes through the list of help topics for each
+         argument: one doing exact string matching and one, if the first pass
+         fails to find a match, doing string prefix matching like previous
+         versions.  This prevents `help read' from matching both `read' and
+         `readonly', but allows `help r' to match everything beginning with
+         `r'.  Inspired by report from Geir Hauge <geir.hauge@gmail.com>
+
+                                  8/13
+                                  ----
+builtins/fc.def
+       - fc_builtin,fc_gethnum: calculate `real' end of the history list and
+         use it if -0 is specified as the beginning or end of the history
+         range to list.  Doesn't work for fc -e or fc -s by design.  Feature
+         requested by Mike Fied <micfied@gmail.com>
+
+                                  8/16
+                                  ----
+trap.c
+       - _run_trap_internal: use {save,restore}_parser_state instead of
+         {save,restore}_token_state. It's more comprehensive
+
+                                  8/23
+                                  ----
+doc/bash.1
+       - disown: remove repeated text.  Report and fix from Thomas Hood
+         <jdthood@gmail.com>
+
+                                  8/25
+                                  ----
+lib/readline/rltty.c
+       - set_special_char: fix prototype (last arg is rl_command_func_t *)
+
+sig.c
+       - set_signal_handler: return oact.sa_handler only if sigaction
+         succeeds; if it doesn't, return SIG_DFL (reasonable default).  From
+         https://bugzilla.redhat.com/show_bug.cgi?id=911404
+
+bashline.c
+       - attempt_shell_completion: fix to skip assignment statements preceding
+         command name even if there are no programmable completions defined.
+         From https://bugzilla.redhat.com/show_bug.cgi?id=994659
+       - attempt_shell_completion: if still completing command word following
+         assignment statements, do command completion even if programmable
+         completion defined for partial command name entered so far
+
+                                  8/26
+                                  ----
+pcomplete.c
+       - pcomp_filename_completion_function: make sure rl_filename_dequoting_function
+         is non-NULL before trying to call it.  Bug and fix from
+         Andreas Schwab <schwab@linux-m68k.org>
+
+bashline.c
+       - bash_command_name_stat_hook: if *name is not something we're going
+         to look up in $PATH (absolute_program(*name) != 0), just call the
+         usual bash_filename_stat_hook and return those results.  This makes
+         completions like $PWD/exam[TAB] add a trailing slash
+
+                                   9/2
+                                   ---
+builtins/read.def
+       - read_builtin: before comparing what we read to the delim, make sure
+         we are not supposed to be ignoring the delimiter (read -N).  We
+         set the delim to -1, but it's possible to read a character whose
+         int value ends up being between -1 and -128.  Fixes bug
+         reported by Stephane Chazelas <stephane.chazelas@gmail.com>
+
+doc/{bash.1,bashref.texi}
+       - word splitting: crib some language from Posix to make it clear that
+         characters in IFS are treated as field *terminators*, not field
+         *separators*.  Addresses issue raised by DJ Mills
+         <danielmills1@gmail.com>
+
+lib/readline/{util.c,rldefs.h}
+       - _rl_stricmp,_rl_strnicmp: now take const char * string arguments;
+         changed prototype declarations
+
+                                   9/5
+                                   ---
+doc/{bash.1,bashref.texi}
+       - [[: modify description of pattern matching to make it clear that the
+         match is performed as if the extglob option were enabled.  From Red
+         Hat bug https://bugzilla.redhat.com/show_bug.cgi?id=1002078
+
+                                  9/12
+                                  ----
+lib/readline/isearch.c
+       - _rl_isearch_dispatch: if we read an ESC and it's supposed to
+         terminate the search, make sure we check for typeahead with
+         _rl_pushed_input_available, since installing a hook function causes
+         typeahead to be collected in `ibuffer' (input.c).  If there is any,
+         make sure we still use the ESC as a prefix character.  Bug and fix
+         from Mike Miller <mtmiller@ieee.org>
+
+                                  9/16
+                                  ----
+builtins/{caller,cd,kill,pushd,wait}.def
+       - builtin_usage(): make sure call to this sets return status to
+         EX_USAGE
+
+                                  9/18
+                                  ----
+terminal.c
+       - rl_change_environment: new application-settable variable; if non-
+         zero (the default), readline will modify LINES and COLUMNS in the
+         environment when it handles SIGWINCH
+       - _rl_get_screen_size: if rl_change_environment is non-zero, use setenv
+         to modify LINES and COLUMNS environment variables
+
+readline.h
+       - rl_change_environment: new extern declaration for applications
+
+                                  9/22
+                                  ----
+configure.ac
+       - relstatus: bumped version to bash-4.3-beta2
+
+                                  9/24
+                                  ----
+
+lib/readline/readline.c
+       - bind_arrow_keys_internal: added more key bindings for the numeric key
+         pad arrow keys on mingw32.  Patch from Pierre Muller
+         <pierre.muller@ics-cnrs.unistra.fr>
+
+                                  10/19
+                                  -----
+
+bashline.c
+       - maybe_restore_tilde: version of restore_tilde that honors `direxpand';
+         calls restore_tilde after saving directory expansion hook if
+         necessary.  Report from Andreas Schwab <schwab@linux-m68k.org>
+
+builtins/cd.def
+       - -@: new option, allows cd to use `extended attributes' present in
+         NFSv4, ZFS; idea taken from ksh93.  Attributes associated with a
+         file are presented as a directory containing the attributes as
+         individual files.  Original patch contributed by Cedric Blancher
+         <cedric.blancher@gmail.com>
+
+                                  10/20
+                                  -----
+aclocal.m4
+       - BASH_CHECK_MULTIBYTE: check for wcwidth being broken with unicode
+         combining characters needs a value to use when cross-compiling.
+         Bug report from Bert Sutherland <bertsutherland@gmail.com>
+
+doc/{bash.1,bashref.texi}
+       - document new -@ option to cd builtin
+
+                                  10/28
+                                  -----
+lib/glob/{{gmisc,glob}.c,glob.h}
+       - extglob_pattern renamed to extglob_pattern_p, declared in glob.h
+
+subst.c
+       - expand_word_internal: typo fix: case to fix " $@\ " bug in bash-4.2
+         had a typo (& isexp instead of &&)
+
+                                  10/29
+                                  -----
+input.c
+       - getc_with_restart: make sure local_index and local_bufused are
+         reset to 0 before returning EOF, in case we are running an interactive
+         shell without line editing and ignoreeof is set.  Report and fix
+         from Yong Zhang <yong.zhang@windriver.com>
+
+lib/readline/search.c
+       - _rl_nsearch_init: take out extra third argument to rl_message; it
+         only matches prototype (and maybe format) in cases where
+         PREFER_STDARG and USE_VARARGS are both undefined, which is rare
+
+                                  10/31
+                                  -----
+subst.c
+       - process_substitute: when opening the named pipe in the child, open
+         without O_NONBLOCK to avoid race conditions.  Happens often on AIX.
+         Bug report and fix from Michael Haubenwallner
+         <michael.haubenwallner@salomon.at>
+
+builtins/ulimit.def
+       - RLIMIT_NTHR: if RLIMIT_PTHREAD is not defined, but RLIMIT_NTHR is,
+         use RLIMIT_NTHR (NetBSD)
+
+                                  11/5
+                                  ----
+locale.c
+       - set_default_locale_vars,set_locale_var: if TEXTDOMAINDIR has been
+         set, and default_dir has a non-null value, call bindtextdomain(3)
+         when TEXTDOMAIN is assigned a value.  Fixes problem reported by
+         Michael Arlt <qwertologe@googlemail.com>
+
+                                  11/6
+                                  ----
+builtins/cd.def
+       - cdxattr: only create synthetic pathname in `buf' if NDIRP argument
+         is non-null
+       - change_to_directory: if we have specified -@ and cdxattr returns
+         failure, fail immediately.  Fixes bug reported by Joshuah Hurst
+         <joshhurst@gmail.com>
+
+                                  11/12
+                                  -----
+redir.c
+       - print_redirection: change r_err_and_out (&>) and its append form,
+         r_append_err_and_out (&>>) cases to separate redirection operator
+         from filename by a space, in case we have a process substitution.
+         Fixes bug reported by admn ombres <admn.ombres@gmail.com>
+
+                                  11/15
+                                  -----
+execute_cmd.c
+       - execute_simple_command: don't close process substitution fds until
+         we are finished executing any current shell function.  Partial fix
+         for bug reported by John Dawson <john.dawson@gmail.com>
+
+support/shobj-conf
+       - add support for Darwin 13 (Mac OS X 10.9, Mavericks).  Based on a
+         report by Ludwig Schwardt <ludwig.schwardt@gmail.com>
+
+                                  11/20
+                                  -----
+[bash-4.3-rc1 frozen]
+
+                                  11/24
+                                  -----
+builtins/printf.def
+       - bind_printf_variable: make sure that the variable assigned to is
+         no longer marked as invisible. Fixes bug reported by NBaH
+         <nbah@sfr.fr>
+
+                                  11/28
+                                  -----
+jobs.c
+       - delete_old_job: fix off-by-one error in job index in call to
+         internal_warning. Bug report from Peter Cordes <peter@cordes.ca>
+
+                                  11/30
+                                  -----
+doc/bashref.texi
+       - add string to description of special parameters with name of
+         special parameter prefixed by a $, so you can search for $#,
+         for instance
+
+                                  12/2
+                                  ----
+lib/readline/{histexpand.c
+       - get_history_event: account for current_history() possibly returning
+         NULL. Report and fix from Pankaj Sharma <pankaj.s01@samsung.com>
+
+
+                                  12/11
+                                  -----
+
+lib/readline/parse-colors.c
+       - get_funky_string: don't call abort if we see something we can't
+         parse; just return an error
+       - _rl_parse_colors: if we encounter an error while parsing $LS_COLORS
+         we need to leave _rl_color_ext_list as NULL after freeing its
+         elements, then turn off _rl_colored_stats. Report and fix from Martin
+         Wesdorp <mwesdorp@casema.nl>
+
+                                  12/13
+                                  -----
+
+lib/readline/parse-colors.c
+       - _rl_parse_colors: if we encounter an unrecognized prefix, throw an
+         error but try to recover and go on to the next specification
+
+variables.c
+       - make_local_variable: for new variables this function creates, set
+         the att_invisible attribute.  All callers from declare_internal.
+         Indirectly, this is a fix for bug with `declare -n var; var=foo;'
+         reported by Pierre Gaston <pierre.gaston@gmail.com>
+       - bind_variable: if assigning to nameref variable that doesn't have
+         a value yet (e.g., with `declare -n var; var=foo'), don't try to
+         use the unset name. Fixes a segfault reported by Pierre Gaston
+         <pierre.gaston@gmail.com>
+
+execute_cmd.c
+       - execute_command_internal: make sure last_command_exit_value is set
+         to 0 after any command executed in the background.  Fixes bug
+         reported by Martin Kealey <martin@kurahaupo.gen.nz>
+
+                                  12/17
+                                  -----
+support/config.{guess,sub}
+       - updated to latest versions from git
+
+                                  12/19
+                                  -----
+parse.y
+       - struct STRING_SAVER: now has a new `flags' element, to identify the
+         caller: alias expansion, double-paren parsing, or parse_and_execute
+       - push_string: now sets flags to PSH_ALIAS if `ap' argument is non-NULL
+       - push_string: now doesn't attempt to call strlen on a NULL string to
+         set shell_input_line_size
+       - parser_expanding_alias, parser_save_alias, parser_restore_alias: new
+         functions to provide an external interface to push_string and
+         pop_string; parser_save_alias sets flags element to PSH_SOURCE (could
+         be renamed PSH_EXTERN someday)
+       - shell_getc: when yy_getc returns '\0', instead of just testing
+         whether the pushed_string_list is not-empty before popping it, don't
+         pop if if the saved string has flags PSH_SOURCE, indicating that
+         parse_and_execute set it before setting bash_input to the string.
+         We should continue reading to the end of that string before popping
+         back to a potential alias. Partial solution for the problem of aliases
+         with embedded newlines containing `.' commands being executed out of
+         order reported by Andrew Martin <andrew.martin@gmail.com>
+       - shell_getc: when yy_getc returns '\0' and there is a saved string of
+         type PSH_SOURCE, restart the read without popping the string stack
+         if we have not read to the end of bash_input.location.string.  Rest
+         of fix for out-of-order execution problem
+
+externs.h
+       - parser_expanding_alias, parser_save_alias, parser_restore_alias: new
+         extern function declarations
+
+builtins/evalstring.c
+       - pe_prologue: if the parser is expanding an alias, make sure to add
+         an unwind-protect to restore the alias; undoes the work that will be
+         performed by parse_and_execute/parse_string
+       - parse_and_execute,parse_string: after calling push_stream to save
+         bash_input, check whether or not the parser is currently expanding
+         an alias (parser_expanding_alias() != 0). If it is, we want to save
+         that string in the pushed_string_list, which we do with
+         parser_save_alias.
+
+                                  12/23
+                                  -----
+execute_cmd.c
+       - execute_for_command: make sure to set line_number before expanding
+         the word list, so expansion errors have the right line number.
+         From a report from Ben Okopnik <ben@okopnik.com>
+
+expr.c
+       - exp2: save token pointer before calling readtok(), arrange to use
+         saved token pointer when printing error token on a division by 0
+         error
+
+                                  12/27
+                                  -----
+lib/readline/display.c
+       - rl_redisplay: when calculating effects of invisible characters in a
+         prompt that is split across physical screen lines to set the indices
+         of linebreaks, don't bother testing local_prompt_prefix (line 751).
+         That prefix doesn't matter when calculating prompt visible and
+         invisible characters.  Fixes problem reported by Jinesh Choksi
+         <jinesh@onelittlehope.com>
+
+Makefile.in
+       - install: make sure to use $(DESTDIR) when installing OTHER_DOCS.
+         Report and fix from Matthias Klose <doko@debian.org>
+
+doc/texinfo.tex
+       - updated to version of 2013-09-11
+
+                                  12/28
+                                  -----
+lib/readline/undo.c
+       - rl_do_undo: if we are undoing from a history entry (rl_undo_list ==
+         current_history()->data), make sure the change to rl_line_buffer is
+         reflected in the history entry. We use the guts of
+         rl_maybe_replace_line to do the work.  Fixes problem reported by
+         gregrwm <backuppc-users@whitleymott.net>
+
+                                  12/30
+                                  -----
+sig.c
+       - sigint_sighandler: if we get a SIGINT (and this signal handler is
+         installed) while the wait builtin is running, note that we received
+         it in the same way as jobs.c:wait_sigint_handler and return.  The
+         various wait_for functions will look for that with CHECK_WAIT_INTR.
+         This fixes the wait builtin not being interruptible in an interactive
+         job control shell
+
+                                  12/31
+                                  -----
+trap.c
+       - set_signal_hard_ignored: rename set_signal_ignored to this, since it
+         both sets original_signals[sig] and sets the HARD_IGNORE flag
+       - set_signal_ignored: new function, now just sets original_signals[sig]
+
+trap.h
+       - set_signal_hard_ignored: new external declaration
+
+sig.c
+       - initialize_terminating_signals: call set_signal_hard_ignored instead
+         of set_signal_ignored for signals with disposition SIG_IGN when the
+         shell starts
+
+execute_cmd.c
+       - setup_async_signals: make sure we get the original dispositions for
+         SIGINT and SIGQUIT before starting the subshell, and don't call
+         set_signal_ignored  because that sets original_signals[sig].  If we
+         don't, subsequent attempts to reset handling using trap will fail
+         because it thinks the original dispositions were SIG_IGN. Posix
+         interpretation 751 (http://austingroupbugs.net/view.php?id=751)
+
+                                1/2/2014
+                                --------
+lib/sh/stringvec.c
+       - strvec_mcreate, strvec_mresize: versions of create and resize that
+         use malloc and realloc, respectively, instead of xmalloc/xrealloc
+
+braces.c
+       - expand_amble,mkseq: use strvec_mcreate/strvec_mresize so we can
+         catch and handle memory allocation failures instead of aborting
+         with the xmalloc/xrealloc interface
+
+lib/sh/strdup.c
+       - strdup replacement function for ancient systems that don't have it
+
+lib/sh/itos.c
+       - mitos: new function, itos that uses strdup instead of savestring
+
+externs.h
+       - strvec_mcreate/strvec_mresize: new extern declarations
+       - mitos: new extern declaration
+
+configure.ac
+       - bash version moved to 4.3-rc2
+
+                                   1/6
+                                   ---
+doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
+       - separate the description of what happens when readline reads the
+         tty EOF character from the description of delete-char, leaving a
+         note in the delete-char description about common binding for ^D.
+         From suggestion by Parke <parke.nexus@gmail.com>
+
+lib/readline/doc/{version.texi,history.3,*.texi}
+       - updated email addresses and copyright dates
+
+                                   1/7
+                                   ---
+variables.c
+       - delete_var: new function, just removes a variable from a hash table
+         and frees it, without doing anything else
+       - make_variable_value: if we are trying to assign to a nameref variable,
+         return NULL if the value is null or the empty string or not a valid
+         identifier
+
+variables.h
+       - delete_var: new extern declaration
+
+subst.h
+       - ASS_NAMEREF: new define for assignments, means assigning to a nameref
+         variable
+
+builtins/declare.def
+       - declare_internal: if we are creating and assigning to a nameref
+         variable, make sure the value is a valid variable name (checks done
+         by make_variable_value via bind_variable_value) and display an
+         error message, deleting the variable we just created, if it is not.
+         Fixes bug reported by Peggy Russell <prusselltechgroup@gmail.com>
+
+                                   1/9
+                                   ---
+builtins/declare.def
+       - declare_internal: turning on nameref attribute for an existing
+         variable turns off -i/-l/-u/-c attributes (essentially the ones
+         that cause evaluation at assignment time) for ksh93 compat
+
+builtins/setattr.def
+       - show_name_attributes: if asked to display attributes and values for
+         a nameref variable, don't follow the nameref chain to the end. More
+         ksh93 compat
+
+                                  1/10
+                                  ----
+trap.c
+       - _run_trap_internal: use {save,restore}_parser_state instead of
+         {save,restore}_token_state, like in run_pending_traps(); don't
+         need to save and restore last_command_exit_value as a result
+       - _run_trap_internal: call {save,restore}_pipeline like in
+         run_pending_traps()
+       - run_pending_traps: since we no longer run traps in a signal handler
+         context, do not block and unblock the trapped signal while the
+         trap is executing
+       - run_pending_traps: allow recursive invocations (basically, running
+         traps from a trap handler) with only a warning if the shell is
+         compiled in debug mode.  If a caller doesn't want this to happen,
+         it should test running_trap > 0. signal_in_progress (sig) only works
+         for the signals the shell handles specially
+
+bashline.c
+       - bash_event_hook: make sure we clean up readline if interrupt_state
+         is set, not only when SIGINT is not trapped.  check_signals_and_traps
+         will call check_signals, which calls QUIT, which will longjmp back
+         to top_level, running the interrupt trap along the way.  Fixes the
+         problem of signal handlers being reset out from under readline, and
+         not being set properly the next time readline is called, because
+         signals_set_flag is still set to 1.  XXX - might need to do this
+         for other signals too?
+
+                                  1/11
+                                  ----
+subst.h
+       - SD_GLOB: new define for skip_to_delim; means we are scanning a
+         glob pattern.
+
+subst.c
+       - skip_to_delim: if flags include SD_GLOB, assume we are scanning a
+         glob pattern.  Currently only used to skip bracket expressions
+         which may contain one of the delimiters
+
+                                  1/12
+                                  ----
+subst.c
+       - parameter_brace_expand: when expanding $@ as part of substring
+         expansion, pattern substitution, or case modification, don't turn
+         on the QUOTED_NULL flag.  The code that constructs the word to be
+         returned from expand_word_internal expects a different code path
+         when $@ is being expanded.  Fixes bug reported by Theodoros
+         V. Kalamatianos <thkala@gmail.com>
+
+                                  1/19
+                                  ----
+subst.c
+       - list_dequote_escapes: new function; analogue of list_quote_escapes
+
+pathexp.c
+       - quote_string_for_globbing: fix case where unescaped ^A is last char
+         in string; need to pass it through unaltered instead of turning it
+         into a bare backslash
+       - quote_string_for_globbing: when quoting for regexp matching in [[,
+         don't treat backslash as a quote character; quote the backslash as
+         any other character.  Part of investigation into reports from
+         Eduardo A. Bustamante López <dualbus@gmail.com>
+
+                                  1/25
+                                  ----
+builtins/gen-helpfiles.c
+       - write_helpfiles: add prototype
+       - make sure to #undef xmalloc/xfree/xrealloc/free if USING_BASH_MALLOC
+         is defined. the code does not use them, and we don't link against
+         xmalloc.o. Report from Linda Walsh <bash@tlinx.org>
+
+Makefile.in
+       - variables.o: add dependency on builtins/builtext.h; helps with
+         parallel builds.  Report from Linda Walsh <bash@tlinx.org>
+
+support/shobj-conf
+       - darwin: combine the stanzas into one that will not require them to
+         be updated on each Mac OS X release.  Report and fix from Max Horn
+         <max@quendi.de>
+
+                                  1/27
+                                  ----
+support/shobj-conf
+       - darwin: changed the install_name embedded into the shared library
+         to contain only the major version number, not the minor one. The
+         idea is that the minor versions should all be API/ABI compatible,
+         and it is better to link automatically with the latest one.  Idea
+         from Max Horn <max@quendi.de>
+
+                                  1/29
+                                  ----
+[bash-4.3-rc2 released]
+
+                                  1/30
+                                  ----
+lib/readline/readline.h
+       - rl_clear_history, rl_free_keymap: add extern declarations.  Report
+         from Hiroo Hayashi <hiroo.hayashi@computer.org>
+
+general.c
+       - include trap.h for any_signals_trapped() prototype
+
+lib/sh/unicode.c
+       - include <stdio.h> for sprintf prototype
+
+                                  1/31
+                                  ----
+execute_cmd.c
+       - execute_simple_command: only posix-mode shells should exit on an
+         assignment failure in the temporary environment preceding a special
+         builtin. This is what the documentation and code comments have
+         always said
+       - execute_simple_command: make sure redirection errors, word expansion
+         errors, and assignment errors to Posix special builtins cause a
+         non-interactive posix mode shell to exit.  Previously the shell
+         would not exit if the failed special builtin was on the LHS of ||
+         or &&
+
+pathexp.c
+       - quote_string_for_globbing: when quoting a regular expression
+         (QGLOB_REGEXP), allow an unquoted backslash to pass through
+         unaltered. Don't use it as a quote character or quote it.  More
+         investigation from 1/24 and report by Mike Frysinger
+         <vapier@gentoo.org>
+       - quote_string_for_globbing: when quoting a regular expression
+         (QGLOB_REGEXP), turn CTLESC CTLESC into CTLESC without adding a
+         backslash to quote it. We should not have to quote it because it is
+         not a character special to EREs. More investigation from 1/24
+
+lib/glob/glob.c
+       - glob_testdir: now takes a second flags argument (currently unused);
+         changed prototype and callers
+
+                                   2/1
+                                   ---
+lib/glob/glob.c
+       - glob_testdir: if flags argument includes GX_ALLDIRS (globstar), use
+         lstat so we skip symlinks when traversing the directory tree.
+         Originally reported by Chris Down <chris@chrisdown.name>
+
+                                   2/2
+                                   ---
+lib/readline/undo.c
+       - rl_do_undo: make sure CUR is non-zero before dereferencing it to
+         check cur->data against rl_undo_list.  Report and fix from
+         Andreas Schwab <schwab@linux-m68k.org>
+
+doc/{bash.1,bashref.texi}
+       - added slight clarifying language to the description of $*,
+         describing what happens when the expansion is not within double
+         quotes
+
+                                   2/4
+                                   ---
+test.c
+       - unary_test: add code to -v case so that it interprets `bare' array
+         references (foo[1]) and returns true if that index has a value
+
+                                   2/5
+                                   ---
+trap.c
+       - restore_default_signal: fix SIGCHLD special case for SIG_TRAPPED flag
+         off but SIG_INPROGRESS mode set and handler IMPOSSIBLE_TRAP_HANDLER;
+         continue with resetting handler in this case. maybe_set_sigchld_trap
+         will check these things before resetting sigchld trap from
+         run_sigchld_trap.  Fixes (apparently long-standing?) problem reported
+         by Alexandru Damian <alexandru.damian@intel.com>
+
+                                   2/6
+                                   ---
+lib/sh/strtrans.c
+       - ansic_quote: fixed a bug when copying a printable character that
+         consumes more than one byte; byte counter was not being incremented.
+         Bug report from jidanni@jidanni.org
+
+                                   2/7
+                                   ---
+input.c
+       - getc_with_restart: if read(2) returns -1/EINTR and interrupt_state or
+         terminating_signal is set (which means QUIT; will longjmp out of this
+         function), make sure the local buffer variables are zeroed out to
+         avoid reading past the end of the buffer on the next call.  Bug report
+         from Dan Jacobson <jidanni@jidanni.org>
diff --git a/CWRU/POSIX.NOTES.old b/CWRU/POSIX.NOTES.old
new file mode 100644 (file)
index 0000000..1707ab1
--- /dev/null
@@ -0,0 +1,82 @@
+Starting bash with the `--posix' command-line option or executing
+`set -o posix' while bash is running will cause bash to conform more
+closely to the Posix.2 standard by changing the behavior to match that
+specified by Posix.2 in areas where the bash default differs.
+
+The following list is what's changed when `posix mode' is in effect:
+
+1.  When a command in the hash table no longer exists, bash will re-search
+    $PATH to find the new location.  This is also available with
+    `shopt -s checkhash'.
+
+2.  The >& redirection does not redirect stdout and stderr.
+
+3.  The message printed by the job control code and builtins when a job
+    exits with a non-zero status is `Done(status)'.
+
+4.  Reserved words may not be aliased.
+
+5.  The Posix.2 PS1 and PS2 expansions of `!' -> history number and
+    `!!' -> `!' are enabled, and parameter expansion is performed on
+    the value regardless of the setting of the `promptvars' option.
+
+6.  Interactive comments are enabled by default.  (Note that bash has
+    them on by default anyway.)
+
+7.  The Posix.2 startup files are executed ($ENV) rather than the normal
+    bash files.
+
+8.  Tilde expansion is only performed on assignments preceding a command
+    name, rather than on all assignment statements on the line.
+
+9.  The default history file is ~/.sh_history (default value of $HISTFILE).
+
+10. The output of `kill -l' prints all the signal names on a single line,
+    separated by spaces.
+
+11. Non-interactive shells exit if `file' in `. file' is not found.
+
+12. Redirection operators do not perform pathname expansion on the word
+    in the redirection unless the shell is interactive
+
+13. Function names must be valid shell identifiers.  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 illegal name
+    causes a fatal syntax error in non-interactive shells.
+
+14. Posix.2 `special' builtins are found before shell functions during command
+    lookup.
+
+15. If a Posix.2 special builtin returns an error status, a non-interactive
+    shell exits.  The fatal errors are those listed in the POSIX.2 standard,
+    and include things like passing incorrect options, redirection errors,
+    variable assignment errors for assignments preceding the command name,
+    and so on.
+
+16. The environment passed to executed commands is not sorted.  Neither is
+    the output of `set'.  This is not strictly Posix.2 behavior, but sh
+    does it this way.  Ksh does not.  It's not necessary to sort the
+    environment; no program should rely on it being sorted.
+
+17. If the `cd' builtin finds a directory to change to using $CDPATH, the
+    value it assigns to $PWD does not contain any symbolic links, as if
+    `cd -P' had been executed.
+
+18. 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 read-only variable.
+
+19. A non-interactive shell exits with an error status if the iteration
+    variable in a for statement or the selection variable in a select
+    statement is a read-only variable.
+
+20. Process substitution is not available.
+
+21. Assignment statements preceding POSIX.2 `special' builtins persist in
+    the shell environment after the builtin completes.
+
+There is other Posix.2 behavior that bash does not implement.  Specifically:
+
+1.  Assignment statements affect the execution environment of all builtins,
+    not just special ones.
diff --git a/CWRU/old/set.def.save b/CWRU/old/set.def.save
new file mode 100644 (file)
index 0000000..87b78d7
--- /dev/null
@@ -0,0 +1,544 @@
+This file is set.def, from which is created set.c.
+It implements the "set" and "unset" builtins in Bash.
+
+Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
+
+This file is part of GNU Bash, the Bourne Again SHell.
+
+Bash is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 1, or (at your option) any later
+version.
+
+Bash is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with Bash; see the file COPYING.  If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$PRODUCES set.c
+
+#include <stdio.h>
+#include "../shell.h"
+#include "../flags.h"
+
+#include "bashgetopt.h"
+
+extern int interactive;
+extern int noclobber, posixly_correct;
+#if defined (READLINE)
+extern int rl_editing_mode, no_line_editing;
+#endif /* READLINE */
+
+$BUILTIN set
+$FUNCTION set_builtin
+$SHORT_DOC set [--abefhkmnptuvxldBCHP] [-o option] [arg ...]
+    -a  Mark variables which are modified or created for export.
+    -b  Notify of job termination immediately.
+    -e  Exit immediately if a command exits with a non-zero status.
+    -f  Disable file name generation (globbing).
+    -h  Locate and remember function commands as functions are
+        defined.  Function commands are normally looked up when
+        the function is executed.
+    -i  Force the shell to be an "interactive" one.  Interactive shells
+        always read `~/.bashrc' on startup.
+    -k  All keyword arguments are placed in the environment for a
+        command, not just those that precede the command name.
+    -m  Job control is enabled.
+    -n  Read commands but do not execute them.
+    -o option-name
+        Set the variable corresponding to option-name:
+            allexport    same as -a
+            braceexpand  same as -B
+#if defined (READLINE)
+            emacs        use an emacs-style line editing interface
+#endif /* READLINE */
+            errexit      same as -e
+            histexpand   same as -H
+            ignoreeof    the shell will not exit upon reading EOF
+            interactive-comments
+                         allow comments to appear in interactive commands
+            monitor      same as -m
+            noclobber    disallow redirection to existing files
+            noexec       same as -n
+            noglob       same as -f
+            nohash       same as -d
+            notify       save as -b
+            nounset      same as -u
+           physical     same as -P
+           posix        change the behavior of bash where the default
+                        operation differs from the 1003.2 standard to
+                        match the standard
+           privileged   same as -p
+            verbose      same as -v
+#if defined (READLINE)
+            vi           use a vi-style line editing interface
+#endif /* READLINE */
+            xtrace       same as -x
+    -p  Turned on whenever the real and effective user ids do not match.
+        Disables processing of the $ENV file and importing of shell
+        functions.  Turning this option off causes the effective uid and
+       gid to be set to the real uid and gid.
+    -t  Exit after reading and executing one command.
+    -u  Treat unset variables as an error when substituting.
+    -v  Print shell input lines as they are read.
+    -x  Print commands and their arguments as they are executed.
+    -l  Save and restore the binding of the NAME in a FOR command.
+    -d  Disable the hashing of commands that are looked up for execution.
+        Normally, commands are remembered in a hash table, and once
+        found, do not have to be looked up again.
+#if defined (BRACE_EXPANSION)
+    -B  the shell will perform brace expansion
+#endif /* BRACE_EXPANSION */
+#if defined (BANG_HISTORY)
+    -H  Enable ! style history substitution.  This flag is on
+        by default.
+#endif /* BANG_HISTORY */
+    -C  If set, disallow existing regular files to be overwritten
+        by redirection of output.
+    -P  If set, do not follow symbolic links when executing commands
+        such as cd which change the current directory.
+
+Using + rather than - causes these flags to be turned off.  The
+flags can also be used upon invocation of the shell.  The current
+set of flags may be found in $-.  The remaining n ARGs are positional
+parameters and are assigned, in order, to $1, $2, .. $n.  If no
+ARGs are given, all shell variables are printed.
+$END
+
+/* An a-list used to match long options for set -o to the corresponding
+   option letter. */
+struct {
+  char *name;
+  int letter;
+} o_options[] = {
+  { "allexport",  'a' },
+#if defined (BRACE_EXPANSION)
+  { "braceexpand",'B' },
+#endif
+  { "errexit",   'e' },
+  { "histexpand", 'H' },
+  { "monitor",   'm' },
+  { "noexec",    'n' },
+  { "noglob",    'f' },
+  { "nohash",    'd' },
+#if defined (JOB_CONTROL)
+  { "notify",    'b' },
+#endif /* JOB_CONTROL */
+  {"nounset",    'u' },
+  {"physical",    'P' },
+  {"privileged",  'p' },
+  {"verbose",    'v' },
+  {"xtrace",     'x' },
+  {(char *)NULL, 0},
+};
+
+#define MINUS_O_FORMAT "%-15s\t%s\n"
+
+void
+list_minus_o_opts ()
+{
+  register int i;
+  char *on = "on", *off = "off";
+
+  printf (MINUS_O_FORMAT, "noclobber", (noclobber == 1) ? on : off);
+
+  if (find_variable ("ignoreeof") || find_variable ("IGNOREEOF"))
+    printf (MINUS_O_FORMAT, "ignoreeof", on);
+  else
+    printf (MINUS_O_FORMAT, "ignoreeof", off);
+
+  printf (MINUS_O_FORMAT, "interactive-comments",
+         interactive_comments ? on : off);
+
+  printf (MINUS_O_FORMAT, "posix", posixly_correct ? on : off);
+
+#if defined (READLINE)
+  if (no_line_editing)
+    {
+      printf (MINUS_O_FORMAT, "emacs", off);
+      printf (MINUS_O_FORMAT, "vi", off);
+    }
+  else
+    {
+      /* Magic.  This code `knows' how readline handles rl_editing_mode. */
+      printf (MINUS_O_FORMAT, "emacs", (rl_editing_mode == 1) ? on : off);
+      printf (MINUS_O_FORMAT, "vi", (rl_editing_mode == 0) ? on : off);
+    }
+#endif /* READLINE */
+
+  for (i = 0; o_options[i].name; i++)
+    {
+      int *on_or_off, zero = 0;
+
+      on_or_off = find_flag (o_options[i].letter);
+      if (on_or_off == FLAG_UNKNOWN)
+       on_or_off = &zero;
+      printf (MINUS_O_FORMAT, o_options[i].name, (*on_or_off == 1) ? on : off);
+    }
+}
+
+set_minus_o_option (on_or_off, option_name)
+     int on_or_off;
+     char *option_name;
+{
+  int option_char = -1;
+
+  if (STREQ (option_name, "noclobber"))
+    {
+      if (on_or_off == FLAG_ON)
+       bind_variable ("noclobber", "");
+      else
+       unbind_variable ("noclobber");
+      stupidly_hack_special_variables ("noclobber");
+    }
+  else if (STREQ (option_name, "ignoreeof"))
+    {
+      unbind_variable ("ignoreeof");
+      unbind_variable ("IGNOREEOF");
+      if (on_or_off == FLAG_ON)
+       bind_variable ("IGNOREEOF", "10");
+      stupidly_hack_special_variables ("IGNOREEOF");
+    }
+  
+#if defined (READLINE)
+  else if ((STREQ (option_name, "emacs")) || (STREQ (option_name, "vi")))
+    {
+      if (on_or_off == FLAG_ON)
+       {
+         rl_variable_bind ("editing-mode", option_name);
+
+         if (interactive)
+           with_input_from_stdin ();
+         no_line_editing = 0;
+       }
+      else
+       {
+         int isemacs = (rl_editing_mode == 1);
+         if ((isemacs && STREQ (option_name, "emacs")) ||
+             (!isemacs && STREQ (option_name, "vi")))
+           {
+             if (interactive)
+               with_input_from_stream (stdin, "stdin");
+             no_line_editing = 1;
+           }
+         else
+           builtin_error ("not in %s editing mode", option_name);
+       }
+    }
+#endif /* READLINE */
+  else if (STREQ (option_name, "interactive-comments"))
+    interactive_comments = (on_or_off == FLAG_ON);
+  else if (STREQ (option_name, "posix"))
+    {
+      posixly_correct = (on_or_off == FLAG_ON);
+      unbind_variable ("POSIXLY_CORRECT");
+      unbind_variable ("POSIX_PEDANTIC");
+      if (on_or_off == FLAG_ON)
+       {
+         bind_variable ("POSIXLY_CORRECT", "");
+         stupidly_hack_special_variables ("POSIXLY_CORRECT");
+       }
+    }
+  else
+    {
+      register int i;
+      for (i = 0; o_options[i].name; i++)
+       {
+         if (STREQ (option_name, o_options[i].name))
+           {
+             option_char = o_options[i].letter;
+             break;
+           }
+       }
+      if (option_char == -1)
+       {
+         builtin_error ("%s: unknown option name", option_name);
+         return (EXECUTION_FAILURE);
+       }
+      if (change_flag (option_char, on_or_off) == FLAG_ERROR)
+       {
+         bad_option (option_name);
+         return (EXECUTION_FAILURE);
+       }
+    }
+  return (EXECUTION_SUCCESS);
+}
+
+/* Set some flags from the word values in the input list.  If LIST is empty,
+   then print out the values of the variables instead.  If LIST contains
+   non-flags, then set $1 - $9 to the successive words of LIST. */
+set_builtin (list)
+     WORD_LIST *list;
+{
+  int on_or_off, flag_name, force_assignment = 0;
+
+  if (!list)
+    {
+      SHELL_VAR **vars;
+
+      vars = all_shell_variables ();
+      if (vars)
+       {
+         print_var_list (vars);
+         free (vars);
+       }
+
+      vars = all_shell_functions ();
+      if (vars)
+       {
+         print_var_list (vars);
+         free (vars);
+       }
+
+      return (EXECUTION_SUCCESS);
+    }
+
+  /* Check validity of flag arguments. */
+  if (*list->word->word == '-' || *list->word->word == '+')
+    {
+      register char *arg;
+      WORD_LIST *save_list = list;
+
+      while (list && (arg = list->word->word))
+       {
+         char c;
+
+         if (arg[0] != '-' && arg[0] != '+')
+           break;
+
+         /* `-' or `--' signifies end of flag arguments. */
+         if (arg[0] == '-' &&
+             (!arg[1] || (arg[1] == '-' && !arg[2])))
+           break;
+
+         while (c = *++arg)
+           {
+             if (find_flag (c) == FLAG_UNKNOWN && c != 'o')
+               {
+                 char s[2];
+                 s[0] = c; s[1] = '\0';
+                 bad_option (s);
+                 if (c == '?')
+                   builtin_usage ();
+                 return (c == '?' ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
+               }
+           }
+         list = list->next;
+       }
+      list = save_list;
+    }
+
+  /* Do the set command.  While the list consists of words starting with
+     '-' or '+' treat them as flags, otherwise, start assigning them to
+     $1 ... $n. */
+  while (list)
+    {
+      char *string = list->word->word;
+
+      /* If the argument is `--' or `-' then signal the end of the list
+        and remember the remaining arguments. */
+      if (string[0] == '-' && (!string[1] || (string[1] == '-' && !string[2])))
+       {
+         list = list->next;
+
+         /* `set --' unsets the positional parameters. */
+         if (string[1] == '-')
+           force_assignment = 1;
+
+         /* Until told differently, the old shell behaviour of
+            `set - [arg ...]' being equivalent to `set +xv [arg ...]'
+            stands.  Posix.2 says the behaviour is marked as obsolescent. */
+         else
+           {
+             change_flag ('x', '+');
+             change_flag ('v', '+');
+           }
+
+         break;
+       }
+
+      if ((on_or_off = *string) &&
+         (on_or_off == '-' || on_or_off == '+'))
+       {
+         int i = 1;
+         while (flag_name = string[i++])
+           {
+             if (flag_name == '?')
+               {
+                 builtin_usage ();
+                 return (EXECUTION_SUCCESS);
+               }
+             else if (flag_name == 'o') /* -+o option-name */
+               {
+                 char *option_name;
+                 WORD_LIST *opt;
+
+                 opt = list->next;
+
+                 if (!opt)
+                   {
+                     list_minus_o_opts ();
+                     continue;
+                   }
+
+                 option_name = opt->word->word;
+
+                 if (!option_name || !*option_name || (*option_name == '-'))
+                   {
+                     list_minus_o_opts ();
+                     continue;
+                   }
+                 list = list->next; /* Skip over option name. */
+
+                 if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS)
+                   return (EXECUTION_FAILURE);
+               }
+             else
+               {
+                 if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
+                   {
+                     char opt[3];
+                     opt[0] = on_or_off;
+                     opt[1] = flag_name;
+                     opt[2] = '\0';
+                     bad_option (opt);
+                     builtin_usage ();
+                     return (EXECUTION_FAILURE);
+                   }
+               }
+           }
+       }
+      else
+       {
+         break;
+       }
+      list = list->next;
+    }
+
+  /* Assigning $1 ... $n */
+  if (list || force_assignment)
+    remember_args (list, 1);
+  return (EXECUTION_SUCCESS);
+}
+
+$BUILTIN unset
+$FUNCTION unset_builtin
+$SHORT_DOC unset [-f] [-v] [name ...]
+For each NAME, remove the corresponding variable or function.  Given
+the `-v', unset will only act on variables.  Given the `-f' flag,
+unset will only act on functions.  With neither flag, unset first
+tries to unset a variable, and if that fails, then tries to unset a
+function.  Some variables (such as PATH and IFS) cannot be unset; also
+see readonly.
+$END
+
+#define NEXT_VARIABLE()        any_failed++; list = list->next; continue;
+
+unset_builtin (list)
+  WORD_LIST *list;
+{
+  int unset_function, unset_variable, unset_array, opt, any_failed;
+  char *name;
+
+  unset_function = unset_variable = unset_array = any_failed = 0;
+
+  reset_internal_getopt ();
+  while ((opt = internal_getopt (list, "fv")) != -1)
+    {
+      switch (opt)
+       {
+       case 'f':
+         unset_function = 1;
+         break;
+       case 'v':
+         unset_variable = 1;
+         break;
+       default:
+         builtin_usage ();
+         return (EXECUTION_FAILURE);
+       }
+    }
+
+  list = loptend;
+
+  if (unset_function && unset_variable)
+    {
+      builtin_error ("cannot simultaneously unset a function and a variable");
+      return (EXECUTION_FAILURE);
+    }
+
+  while (list)
+    {
+      SHELL_VAR *var;
+      int tem;
+#if defined (ARRAY_VARS)
+      char *t;
+#endif
+
+      name = list->word->word;
+
+#if defined (ARRAY_VARS)
+      if (!unset_function && valid_array_reference (name))
+       {
+         t = strchr (name, '[');
+         *t++ = '\0';
+         unset_array++;
+       }
+#endif
+
+      var = unset_function ? find_function (name) : find_variable (name);
+
+      if (var && !unset_function && non_unsettable_p (var))
+       {
+         builtin_error ("%s: cannot unset", name);
+         NEXT_VARIABLE ();
+       }
+
+      /* Posix.2 says that unsetting readonly variables is an error. */
+      if (var && readonly_p (var))
+       {
+         builtin_error ("%s: cannot unset: readonly %s",
+                        name, unset_function ? "function" : "variable");
+         NEXT_VARIABLE ();
+       }
+
+      /* Unless the -f option is supplied, the name refers to a variable. */
+#if defined (ARRAY_VARS)
+      if (var && unset_array)
+       {
+         if (array_p (var) == 0)
+           {
+             builtin_error ("%s: not an array variable", name);
+             NEXT_VARIABLE ();
+           }
+         else
+           tem = unbind_array_element (var, t);
+       }
+      else
+#endif /* ARRAY_VARS */
+      tem = makunbound (name, unset_function ? shell_functions : shell_variables);
+
+      /* This is what Posix.2 draft 11+ says.  ``If neither -f nor -v
+        is specified, the name refers to a variable; if a variable by
+        that name does not exist, a function by that name, if any,
+        shall be unset.'' */
+      if ((tem == -1) && !unset_function && !unset_variable)
+       tem = makunbound (name, shell_functions);
+
+      if (tem == -1)
+       any_failed++;
+      else if (!unset_function)
+       stupidly_hack_special_variables (name);
+
+      list = list->next;
+    }
+
+  if (any_failed)
+    return (EXECUTION_FAILURE);
+  else
+    return (EXECUTION_SUCCESS);
+}
diff --git a/CWRU/save/unwind_prot.h.save b/CWRU/save/unwind_prot.h.save
new file mode 100644 (file)
index 0000000..998fd72
--- /dev/null
@@ -0,0 +1,50 @@
+/* unwind_prot.h - Macros and functions for hacking unwind protection. */
+
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 2, or (at your option) any later
+   version.
+
+   Bash is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with Bash; see the file COPYING.  If not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_UNWIND_PROT_H)
+#define _UNWIND_PROT_H
+
+/* Run a function without interrupts. */
+extern void begin_unwind_frame ();
+extern void discard_unwind_frame ();
+extern void run_unwind_frame ();
+extern void add_unwind_protect ();
+extern void remove_unwind_protect ();
+extern void run_unwind_protects ();
+extern void unwind_protect_var ();
+
+/* Define for people who like their code to look a certain way. */
+#define end_unwind_frame()
+
+/* How to protect an integer. */
+#define unwind_protect_int(X) unwind_protect_var (&(X), (char *)(X), sizeof (int))
+
+/* How to protect a pointer to a string. */
+#define unwind_protect_string(X) \
+  unwind_protect_var ((int *)&(X), (X), sizeof (char *))
+
+/* How to protect any old pointer. */
+#define unwind_protect_pointer(X) unwind_protect_string (X)
+
+/* How to protect the contents of a jmp_buf. */
+#define unwind_protect_jmp_buf(X) \
+  unwind_protect_var ((int *)(X), (char *)(X), sizeof (procenv_t))
+
+#endif /* _UNWIND_PROT_H */
index 9865929bcf2f853f92d32c896e1f7a936ea73c33..f6fa6954df60b8c312c04cd1f50ddf6225a4f99a 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -805,6 +805,7 @@ tests/array12.sub   f
 tests/array13.sub      f
 tests/array14.sub      f
 tests/array15.sub      f
+tests/array16.sub      f
 tests/array-at-star    f
 tests/array2.right     f
 tests/assoc.tests      f
index 79b8bcf8f3c548e63828f0c7124584c18a088d19..1f127644a6654da8394baacc54162592f8e73f22 100644 (file)
@@ -1720,6 +1720,7 @@ command_word_completion_function (hint_text, state)
   static char *path = (char *)NULL;
   static char *val = (char *)NULL;
   static char *filename_hint = (char *)NULL;
+  static char *fnhint = (char *)NULL;
   static char *dequoted_hint = (char *)NULL;
   static char *directory_part = (char *)NULL;
   static char **glob_matches = (char **)NULL;
@@ -1799,7 +1800,7 @@ command_word_completion_function (hint_text, state)
          if (filename_hint)
            free (filename_hint);
 
-         filename_hint = savestring (hint);
+         fnhint = filename_hint = savestring (hint);
 
          istate = 0;
 
@@ -2007,15 +2008,25 @@ globword:
       if (current_path[0] == '.' && current_path[1] == '\0')
        dot_in_path = 1;
 
+      if (fnhint && fnhint != filename_hint)
+       free (fnhint);
       if (filename_hint)
        free (filename_hint);
 
       filename_hint = sh_makepath (current_path, hint, 0);
+      /* Need a quoted version (though it doesn't matter much in most
+        cases) because rl_filename_completion_function dequotes the
+        filename it gets, assuming that it's been quoted as part of
+        the input line buffer. */
+      if (strpbrk (filename_hint, "\"'\\"))
+       fnhint = sh_backslash_quote (filename_hint, filename_bstab, 0);
+      else
+       fnhint = filename_hint;
       free (current_path);             /* XXX */
     }
 
  inner:
-  val = rl_filename_completion_function (filename_hint, istate);
+  val = rl_filename_completion_function (fnhint, istate);
   if (mapping_over == 4 && dircomplete_expand)
     set_directory_hook ();
 
diff --git a/bashline.c~ b/bashline.c~
new file mode 100644 (file)
index 0000000..fb441f4
--- /dev/null
@@ -0,0 +1,4211 @@
+/* bashline.c -- Bash's interface to the readline library. */
+
+/* Copyright (C) 1987-2013 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Bash is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+
+#if defined (READLINE)
+
+#include "bashtypes.h"
+#include "posixstat.h"
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_GRP_H)
+#  include <grp.h>
+#endif
+
+#if defined (HAVE_NETDB_H)
+#  include <netdb.h>
+#endif
+
+#include <signal.h>
+
+#include <stdio.h>
+#include "chartypes.h"
+#include "bashansi.h"
+#include "bashintl.h"
+
+#include "shell.h"
+#include "input.h"
+#include "builtins.h"
+#include "bashhist.h"
+#include "bashline.h"
+#include "execute_cmd.h"
+#include "findcmd.h"
+#include "pathexp.h"
+#include "shmbutil.h"
+#include "trap.h"
+
+#include "builtins/common.h"
+
+#include <readline/rlconf.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include <glob/glob.h>
+
+#if defined (ALIAS)
+#  include "alias.h"
+#endif
+
+#if defined (PROGRAMMABLE_COMPLETION)
+#  include "pcomplete.h"
+#endif
+
+/* These should agree with the defines for emacs_mode and vi_mode in
+   rldefs.h, even though that's not a public readline header file. */
+#ifndef EMACS_EDITING_MODE
+#  define NO_EDITING_MODE      -1
+#  define EMACS_EDITING_MODE    1
+#  define VI_EDITING_MODE       0
+#endif
+
+#define RL_BOOLEAN_VARIABLE_VALUE(s)   ((s)[0] == 'o' && (s)[1] == 'n' && (s)[2] == '\0')
+
+#if defined (BRACE_COMPLETION)
+extern int bash_brace_completion __P((int, int));
+#endif /* BRACE_COMPLETION */
+
+/* To avoid including curses.h/term.h/termcap.h and that whole mess. */
+#ifdef _MINIX
+extern int tputs __P((const char *string, int nlines, void (*outx)(int)));
+#else
+extern int tputs __P((const char *string, int nlines, int (*outx)(int)));
+#endif
+
+/* Forward declarations */
+
+/* Functions bound to keys in Readline for Bash users. */
+static int shell_expand_line __P((int, int));
+static int display_shell_version __P((int, int));
+static int operate_and_get_next __P((int, int));
+
+static int bash_ignore_filenames __P((char **));
+static int bash_ignore_everything __P((char **));
+
+#if defined (BANG_HISTORY)
+static char *history_expand_line_internal __P((char *));
+static int history_expand_line __P((int, int));
+static int tcsh_magic_space __P((int, int));
+#endif /* BANG_HISTORY */
+#ifdef ALIAS
+static int alias_expand_line __P((int, int));
+#endif
+#if defined (BANG_HISTORY) && defined (ALIAS)
+static int history_and_alias_expand_line __P((int, int));
+#endif
+
+static int bash_forward_shellword __P((int, int));
+static int bash_backward_shellword __P((int, int));
+static int bash_kill_shellword __P((int, int));
+static int bash_backward_kill_shellword __P((int, int));
+
+/* Helper functions for Readline. */
+static char *restore_tilde __P((char *, char *));
+static char *maybe_restore_tilde __P((char *, char *));
+
+static char *bash_filename_rewrite_hook __P((char *, int));
+
+static void bash_directory_expansion __P((char **));
+static int bash_filename_stat_hook __P((char **));
+static int bash_command_name_stat_hook __P((char **));
+static int bash_directory_completion_hook __P((char **));
+static int filename_completion_ignore __P((char **));
+static int bash_push_line __P((void));
+
+static int executable_completion __P((const char *, int));
+
+static rl_icppfunc_t *save_directory_hook __P((void));
+static void restore_directory_hook __P((rl_icppfunc_t));
+
+static void cleanup_expansion_error __P((void));
+static void maybe_make_readline_line __P((char *));
+static void set_up_new_line __P((char *));
+
+static int check_redir __P((int));
+static char **attempt_shell_completion __P((const char *, int, int));
+static char *variable_completion_function __P((const char *, int));
+static char *hostname_completion_function __P((const char *, int));
+static char *command_subst_completion_function __P((const char *, int));
+
+static void build_history_completion_array __P((void));
+static char *history_completion_generator __P((const char *, int));
+static int dynamic_complete_history __P((int, int));
+static int bash_dabbrev_expand __P((int, int));
+
+static void initialize_hostname_list __P((void));
+static void add_host_name __P((char *));
+static void snarf_hosts_from_file __P((char *));
+static char **hostnames_matching __P((char *));
+
+static void _ignore_completion_names __P((char **, sh_ignore_func_t *));
+static int name_is_acceptable __P((const char *));
+static int test_for_directory __P((const char *));
+static int return_zero __P((const char *));
+
+static char *bash_dequote_filename __P((char *, int));
+static char *quote_word_break_chars __P((char *));
+static void set_filename_bstab __P((const char *));
+static char *bash_quote_filename __P((char *, int, char *));
+
+#ifdef _MINIX
+static void putx __P((int));
+#else
+static int putx __P((int));
+#endif
+static int bash_execute_unix_command __P((int, int));
+static void init_unix_command_map __P((void));
+static int isolate_sequence __P((char *, int, int, int *));
+
+static int set_saved_history __P((void));
+
+#if defined (ALIAS)
+static int posix_edit_macros __P((int, int));
+#endif
+
+static int bash_event_hook __P((void));
+
+#if defined (PROGRAMMABLE_COMPLETION)
+static int find_cmd_start __P((int));
+static int find_cmd_end __P((int));
+static char *find_cmd_name __P((int, int *, int *));
+static char *prog_complete_return __P((const char *, int));
+
+static char **prog_complete_matches;
+#endif
+
+/* Variables used here but defined in other files. */
+#if defined (BANG_HISTORY)
+extern int hist_verify;
+#endif
+
+extern int current_command_line_count, saved_command_line_count;
+extern int last_command_exit_value;
+extern int array_needs_making;
+extern int posixly_correct, no_symbolic_links;
+extern char *current_prompt_string, *ps1_prompt;
+extern STRING_INT_ALIST word_token_alist[];
+extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
+
+/* SPECIFIC_COMPLETION_FUNCTIONS specifies that we have individual
+   completion functions which indicate what type of completion should be
+   done (at or before point) that can be bound to key sequences with
+   the readline library. */
+#define SPECIFIC_COMPLETION_FUNCTIONS
+
+#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
+static int bash_specific_completion __P((int, rl_compentry_func_t *));
+
+static int bash_complete_filename_internal __P((int));
+static int bash_complete_username_internal __P((int));
+static int bash_complete_hostname_internal __P((int));
+static int bash_complete_variable_internal __P((int));
+static int bash_complete_command_internal __P((int));
+
+static int bash_complete_filename __P((int, int));
+static int bash_possible_filename_completions __P((int, int));
+static int bash_complete_username __P((int, int));
+static int bash_possible_username_completions __P((int, int));
+static int bash_complete_hostname __P((int, int));
+static int bash_possible_hostname_completions __P((int, int));
+static int bash_complete_variable __P((int, int));
+static int bash_possible_variable_completions __P((int, int));
+static int bash_complete_command __P((int, int));
+static int bash_possible_command_completions __P((int, int));
+
+static char *glob_complete_word __P((const char *, int));
+static int bash_glob_completion_internal __P((int));
+static int bash_glob_complete_word __P((int, int));
+static int bash_glob_expand_word __P((int, int));
+static int bash_glob_list_expansions __P((int, int));
+
+#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
+
+static int edit_and_execute_command __P((int, int, int, char *));
+#if defined (VI_MODE)
+static int vi_edit_and_execute_command __P((int, int));
+static int bash_vi_complete __P((int, int));
+#endif
+static int emacs_edit_and_execute_command __P((int, int));
+
+/* Non-zero once initalize_readline () has been called. */
+int bash_readline_initialized = 0;
+
+/* If non-zero, we do hostname completion, breaking words at `@' and
+   trying to complete the stuff after the `@' from our own internal
+   host list. */
+int perform_hostname_completion = 1;
+
+/* If non-zero, we don't do command completion on an empty line. */
+int no_empty_command_completion;
+
+/* Set FORCE_FIGNORE if you want to honor FIGNORE even if it ignores the
+   only possible matches.  Set to 0 if you want to match filenames if they
+   are the only possible matches, even if FIGNORE says to. */
+int force_fignore = 1;
+
+/* Perform spelling correction on directory names during word completion */
+int dircomplete_spelling = 0;
+
+/* Expand directory names during word/filename completion. */
+#if DIRCOMPLETE_EXPAND_DEFAULT
+int dircomplete_expand = 1;
+int dircomplete_expand_relpath = 1;
+#else
+int dircomplete_expand = 0;
+int dircomplete_expand_relpath = 0;
+#endif
+
+/* When non-zero, perform `normal' shell quoting on completed filenames
+   even when the completed name contains a directory name with a shell
+   variable referene, so dollar signs in a filename get quoted appropriately.
+   Set to zero to remove dollar sign (and braces or parens as needed) from
+   the set of characters that will be quoted. */
+int complete_fullquote = 1;
+
+static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
+static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
+/* )) */
+
+static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";        /*}*/
+static char *custom_filename_quote_characters = 0;
+static char filename_bstab[256];
+
+static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
+
+static int dot_in_path = 0;
+
+/* Set to non-zero when dabbrev-expand is running */
+static int dabbrev_expand_active = 0;
+
+/* What kind of quoting is performed by bash_quote_filename:
+       COMPLETE_DQUOTE = double-quoting the filename
+       COMPLETE_SQUOTE = single_quoting the filename
+       COMPLETE_BSQUOTE = backslash-quoting special chars in the filename
+*/
+#define COMPLETE_DQUOTE  1
+#define COMPLETE_SQUOTE  2
+#define COMPLETE_BSQUOTE 3
+static int completion_quoting_style = COMPLETE_BSQUOTE;
+
+/* Flag values for the final argument to bash_default_completion */
+#define DEFCOMP_CMDPOS         1
+
+/* Change the readline VI-mode keymaps into or out of Posix.2 compliance.
+   Called when the shell is put into or out of `posix' mode. */
+void
+posix_readline_initialize (on_or_off)
+     int on_or_off;
+{
+  if (on_or_off)
+    rl_variable_bind ("comment-begin", "#");
+#if defined (VI_MODE)
+  rl_bind_key_in_map (CTRL ('I'), on_or_off ? rl_insert : rl_complete, vi_insertion_keymap);
+#endif
+}
+
+void
+reset_completer_word_break_chars ()
+{
+  rl_completer_word_break_characters = perform_hostname_completion ? savestring (bash_completer_word_break_characters) : savestring (bash_nohostname_word_break_characters);
+}
+
+/* When this function returns, rl_completer_word_break_characters points to
+   dynamically allocated memory. */
+int
+enable_hostname_completion (on_or_off)
+     int on_or_off;
+{
+  int old_value;
+  char *at, *nv, *nval;
+
+  old_value = perform_hostname_completion;
+
+  if (on_or_off)
+    {
+      perform_hostname_completion = 1;
+      rl_special_prefixes = "$@";
+    }
+  else
+    {
+      perform_hostname_completion = 0;
+      rl_special_prefixes = "$";
+    }
+
+  /* Now we need to figure out how to appropriately modify and assign
+     rl_completer_word_break_characters depending on whether we want
+     hostname completion on or off. */
+
+  /* If this is the first time this has been called
+     (bash_readline_initialized == 0), use the sames values as before, but
+     allocate new memory for rl_completer_word_break_characters. */
+
+  if (bash_readline_initialized == 0 &&
+      (rl_completer_word_break_characters == 0 || 
+       rl_completer_word_break_characters == rl_basic_word_break_characters))
+    {
+      if (on_or_off)
+       rl_completer_word_break_characters = savestring (bash_completer_word_break_characters);
+      else
+       rl_completer_word_break_characters = savestring (bash_nohostname_word_break_characters);
+    }
+  else
+    {
+      /* See if we have anything to do. */
+      at = strchr (rl_completer_word_break_characters, '@');
+      if ((at == 0 && on_or_off == 0) || (at != 0 && on_or_off != 0))
+        return old_value;
+
+      /* We have something to do.  Do it. */
+      nval = (char *)xmalloc (strlen (rl_completer_word_break_characters) + 1 + on_or_off);
+
+      if (on_or_off == 0)
+       {
+         /* Turn it off -- just remove `@' from word break chars.  We want
+            to remove all occurrences of `@' from the char list, so we loop
+            rather than just copy the rest of the list over AT. */
+         for (nv = nval, at = rl_completer_word_break_characters; *at; )
+           if (*at != '@')
+             *nv++ = *at++;
+           else
+             at++;
+         *nv = '\0';
+       }
+      else
+       {
+         nval[0] = '@';
+         strcpy (nval + 1, rl_completer_word_break_characters);
+        }
+
+      free (rl_completer_word_break_characters);
+      rl_completer_word_break_characters = nval;
+    }
+
+  return (old_value);
+}
+
+/* Called once from parse.y if we are going to use readline. */
+void
+initialize_readline ()
+{
+  rl_command_func_t *func;
+  char kseq[2];
+
+  if (bash_readline_initialized)
+    return;
+
+  rl_terminal_name = get_string_value ("TERM");
+  rl_instream = stdin;
+  rl_outstream = stderr;
+
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "Bash";
+
+  /* Add bindable names before calling rl_initialize so they may be
+     referenced in the various inputrc files. */
+  rl_add_defun ("shell-expand-line", shell_expand_line, -1);
+#ifdef BANG_HISTORY
+  rl_add_defun ("history-expand-line", history_expand_line, -1);
+  rl_add_defun ("magic-space", tcsh_magic_space, -1);
+#endif
+
+  rl_add_defun ("shell-forward-word", bash_forward_shellword, -1);
+  rl_add_defun ("shell-backward-word", bash_backward_shellword, -1);
+  rl_add_defun ("shell-kill-word", bash_kill_shellword, -1);
+  rl_add_defun ("shell-backward-kill-word", bash_backward_kill_shellword, -1);
+
+#ifdef ALIAS
+  rl_add_defun ("alias-expand-line", alias_expand_line, -1);
+#  ifdef BANG_HISTORY
+  rl_add_defun ("history-and-alias-expand-line", history_and_alias_expand_line, -1);
+#  endif
+#endif
+
+  /* Backwards compatibility. */
+  rl_add_defun ("insert-last-argument", rl_yank_last_arg, -1);
+
+  rl_add_defun ("operate-and-get-next", operate_and_get_next, -1);
+  rl_add_defun ("display-shell-version", display_shell_version, -1);
+  rl_add_defun ("edit-and-execute-command", emacs_edit_and_execute_command, -1);
+
+#if defined (BRACE_COMPLETION)
+  rl_add_defun ("complete-into-braces", bash_brace_completion, -1);
+#endif
+
+#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
+  rl_add_defun ("complete-filename", bash_complete_filename, -1);
+  rl_add_defun ("possible-filename-completions", bash_possible_filename_completions, -1);
+  rl_add_defun ("complete-username", bash_complete_username, -1);
+  rl_add_defun ("possible-username-completions", bash_possible_username_completions, -1);
+  rl_add_defun ("complete-hostname", bash_complete_hostname, -1);
+  rl_add_defun ("possible-hostname-completions", bash_possible_hostname_completions, -1);
+  rl_add_defun ("complete-variable", bash_complete_variable, -1);
+  rl_add_defun ("possible-variable-completions", bash_possible_variable_completions, -1);
+  rl_add_defun ("complete-command", bash_complete_command, -1);
+  rl_add_defun ("possible-command-completions", bash_possible_command_completions, -1);
+  rl_add_defun ("glob-complete-word", bash_glob_complete_word, -1);
+  rl_add_defun ("glob-expand-word", bash_glob_expand_word, -1);
+  rl_add_defun ("glob-list-expansions", bash_glob_list_expansions, -1);
+#endif
+
+  rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
+  rl_add_defun ("dabbrev-expand", bash_dabbrev_expand, -1);
+
+  /* Bind defaults before binding our custom shell keybindings. */
+  if (RL_ISSTATE(RL_STATE_INITIALIZED) == 0)
+    rl_initialize ();
+
+  /* Bind up our special shell functions. */
+  rl_bind_key_if_unbound_in_map (CTRL('E'), shell_expand_line, emacs_meta_keymap);
+
+#ifdef BANG_HISTORY
+  rl_bind_key_if_unbound_in_map ('^', history_expand_line, emacs_meta_keymap);
+#endif
+
+  rl_bind_key_if_unbound_in_map (CTRL ('O'), operate_and_get_next, emacs_standard_keymap);
+  rl_bind_key_if_unbound_in_map (CTRL ('V'), display_shell_version, emacs_ctlx_keymap);
+
+  /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
+     so it is not necessary to allow C-M-j for context switching.  Turn
+     off this occasionally confusing behaviour. */
+  kseq[0] = CTRL('J');
+  kseq[1] = '\0';
+  func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
+  if (func == rl_vi_editing_mode)
+    rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
+  kseq[0] = CTRL('M');
+  func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
+  if (func == rl_vi_editing_mode)
+    rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
+#if defined (VI_MODE)
+  rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
+#endif
+
+#if defined (BRACE_COMPLETION)
+  rl_bind_key_if_unbound_in_map ('{', bash_brace_completion, emacs_meta_keymap); /*}*/
+#endif /* BRACE_COMPLETION */
+
+#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
+  rl_bind_key_if_unbound_in_map ('/', bash_complete_filename, emacs_meta_keymap);
+  rl_bind_key_if_unbound_in_map ('/', bash_possible_filename_completions, emacs_ctlx_keymap);
+
+  /* Have to jump through hoops here because there is a default binding for
+     M-~ (rl_tilde_expand) */
+  kseq[0] = '~';
+  kseq[1] = '\0';
+  func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
+  if (func == 0 || func == rl_tilde_expand)
+    rl_bind_keyseq_in_map (kseq, bash_complete_username, emacs_meta_keymap);
+
+  rl_bind_key_if_unbound_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);
+
+  rl_bind_key_if_unbound_in_map ('@', bash_complete_hostname, emacs_meta_keymap);
+  rl_bind_key_if_unbound_in_map ('@', bash_possible_hostname_completions, emacs_ctlx_keymap);
+
+  rl_bind_key_if_unbound_in_map ('$', bash_complete_variable, emacs_meta_keymap);
+  rl_bind_key_if_unbound_in_map ('$', bash_possible_variable_completions, emacs_ctlx_keymap);
+
+  rl_bind_key_if_unbound_in_map ('!', bash_complete_command, emacs_meta_keymap);
+  rl_bind_key_if_unbound_in_map ('!', bash_possible_command_completions, emacs_ctlx_keymap);
+
+  rl_bind_key_if_unbound_in_map ('g', bash_glob_complete_word, emacs_meta_keymap);
+  rl_bind_key_if_unbound_in_map ('*', bash_glob_expand_word, emacs_ctlx_keymap);
+  rl_bind_key_if_unbound_in_map ('g', bash_glob_list_expansions, emacs_ctlx_keymap);
+
+#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
+
+  kseq[0] = TAB;
+  kseq[1] = '\0';
+  func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
+  if (func == 0 || func == rl_tab_insert)
+    rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
+
+  /* Tell the completer that we want a crack first. */
+  rl_attempted_completion_function = attempt_shell_completion;
+
+  /* Tell the completer that we might want to follow symbolic links or
+     do other expansion on directory names. */
+  set_directory_hook ();
+
+  rl_filename_rewrite_hook = bash_filename_rewrite_hook;
+
+  rl_filename_stat_hook = bash_filename_stat_hook;
+
+  /* Tell the filename completer we want a chance to ignore some names. */
+  rl_ignore_some_completions_function = filename_completion_ignore;
+
+  /* Bind C-xC-e to invoke emacs and run result as commands. */
+  rl_bind_key_if_unbound_in_map (CTRL ('E'), emacs_edit_and_execute_command, emacs_ctlx_keymap);
+#if defined (VI_MODE)
+  rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);
+#  if defined (ALIAS)
+  rl_bind_key_if_unbound_in_map ('@', posix_edit_macros, vi_movement_keymap);
+#  endif
+
+  rl_bind_key_in_map ('\\', bash_vi_complete, vi_movement_keymap);
+  rl_bind_key_in_map ('*', bash_vi_complete, vi_movement_keymap);
+  rl_bind_key_in_map ('=', bash_vi_complete, vi_movement_keymap);
+#endif
+
+  rl_completer_quote_characters = "'\"";
+
+  /* This sets rl_completer_word_break_characters and rl_special_prefixes
+     to the appropriate values, depending on whether or not hostname
+     completion is enabled. */
+  enable_hostname_completion (perform_hostname_completion);
+
+  /* characters that need to be quoted when appearing in filenames. */
+  rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
+
+  rl_filename_quoting_function = bash_quote_filename;
+  rl_filename_dequoting_function = bash_dequote_filename;
+  rl_char_is_quoted_p = char_is_quoted;
+
+#if 0
+  /* This is superfluous and makes it impossible to use tab completion in
+     vi mode even when explicitly binding it in ~/.inputrc.  sv_strict_posix()
+     should already have called posix_readline_initialize() when
+     posixly_correct was set. */
+  if (posixly_correct)
+    posix_readline_initialize (1);
+#endif
+
+  bash_readline_initialized = 1;
+}
+
+void
+bashline_reinitialize ()
+{
+  bash_readline_initialized = 0;
+}
+
+void
+bashline_set_event_hook ()
+{
+  rl_signal_event_hook = bash_event_hook;
+}
+
+void
+bashline_reset_event_hook ()
+{
+  rl_signal_event_hook = 0;
+}
+
+/* On Sun systems at least, rl_attempted_completion_function can end up
+   getting set to NULL, and rl_completion_entry_function set to do command
+   word completion if Bash is interrupted while trying to complete a command
+   word.  This just resets all the completion functions to the right thing.
+   It's called from throw_to_top_level(). */
+void
+bashline_reset ()
+{
+  tilde_initialize ();
+  rl_attempted_completion_function = attempt_shell_completion;
+  rl_completion_entry_function = NULL;
+  rl_ignore_some_completions_function = filename_completion_ignore;
+  rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
+
+  set_directory_hook ();
+  rl_filename_stat_hook = bash_filename_stat_hook;
+
+  bashline_reset_event_hook ();
+}
+
+/* Contains the line to push into readline. */
+static char *push_to_readline = (char *)NULL;
+
+/* Push the contents of push_to_readline into the
+   readline buffer. */
+static int
+bash_push_line ()
+{
+  if (push_to_readline)
+    {
+      rl_insert_text (push_to_readline);
+      free (push_to_readline);
+      push_to_readline = (char *)NULL;
+      rl_startup_hook = old_rl_startup_hook;
+    }
+  return 0;
+}
+
+/* Call this to set the initial text for the next line to read
+   from readline. */
+int
+bash_re_edit (line)
+     char *line;
+{
+  FREE (push_to_readline);
+
+  push_to_readline = savestring (line);
+  old_rl_startup_hook = rl_startup_hook;
+  rl_startup_hook = bash_push_line;
+
+  return (0);
+}
+
+static int
+display_shell_version (count, c)
+     int count, c;
+{
+  rl_crlf ();
+  show_shell_version (0);
+  putc ('\r', rl_outstream);
+  fflush (rl_outstream);
+  rl_on_new_line ();
+  rl_redisplay ();
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                          Readline Stuff                         */
+/*                                                                 */
+/* **************************************************************** */
+
+/* If the user requests hostname completion, then simply build a list
+   of hosts, and complete from that forever more, or at least until
+   HOSTFILE is unset. */
+
+/* THIS SHOULD BE A STRINGLIST. */
+/* The kept list of hostnames. */
+static char **hostname_list = (char **)NULL;
+
+/* The physical size of the above list. */
+static int hostname_list_size;
+
+/* The number of hostnames in the above list. */
+static int hostname_list_length;
+
+/* Whether or not HOSTNAME_LIST has been initialized. */
+int hostname_list_initialized = 0;
+
+/* Initialize the hostname completion table. */
+static void
+initialize_hostname_list ()
+{
+  char *temp;
+
+  temp = get_string_value ("HOSTFILE");
+  if (temp == 0)
+    temp = get_string_value ("hostname_completion_file");
+  if (temp == 0)
+    temp = DEFAULT_HOSTS_FILE;
+
+  snarf_hosts_from_file (temp);
+
+  if (hostname_list)
+    hostname_list_initialized++;
+}
+
+/* Add NAME to the list of hosts. */
+static void
+add_host_name (name)
+     char *name;
+{
+  if (hostname_list_length + 2 > hostname_list_size)
+    {
+      hostname_list_size = (hostname_list_size + 32) - (hostname_list_size % 32);
+      hostname_list = strvec_resize (hostname_list, hostname_list_size);
+    }
+
+  hostname_list[hostname_list_length++] = savestring (name);
+  hostname_list[hostname_list_length] = (char *)NULL;
+}
+
+#define cr_whitespace(c) ((c) == '\r' || (c) == '\n' || whitespace(c))
+
+static void
+snarf_hosts_from_file (filename)
+     char *filename;
+{
+  FILE *file;
+  char *temp, buffer[256], name[256];
+  register int i, start;
+
+  file = fopen (filename, "r");
+  if (file == 0)
+    return;
+
+  while (temp = fgets (buffer, 255, file))
+    {
+      /* Skip to first character. */
+      for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++)
+       ;
+
+      /* If comment or blank line, ignore. */
+      if (buffer[i] == '\0' || buffer[i] == '#')
+       continue;
+
+      /* If `preprocessor' directive, do the include. */
+      if (strncmp (buffer + i, "$include ", 9) == 0)
+       {
+         char *incfile, *t;
+
+         /* Find start of filename. */
+         for (incfile = buffer + i + 9; *incfile && whitespace (*incfile); incfile++)
+           ;
+
+         /* Find end of filename. */
+         for (t = incfile; *t && cr_whitespace (*t) == 0; t++)
+           ;
+
+         *t = '\0';
+
+         snarf_hosts_from_file (incfile);
+         continue;
+       }
+
+      /* Skip internet address if present. */
+      if (DIGIT (buffer[i]))
+       for (; buffer[i] && cr_whitespace (buffer[i]) == 0; i++);
+
+      /* Gobble up names.  Each name is separated with whitespace. */
+      while (buffer[i])
+       {
+         for (; cr_whitespace (buffer[i]); i++)
+           ;
+         if (buffer[i] == '\0' || buffer[i] ==  '#')
+           break;
+
+         /* Isolate the current word. */
+         for (start = i; buffer[i] && cr_whitespace (buffer[i]) == 0; i++)
+           ;
+         if (i == start)
+           continue;
+         strncpy (name, buffer + start, i - start);
+         name[i - start] = '\0';
+         add_host_name (name);
+       }
+    }
+  fclose (file);
+}
+
+/* Return the hostname list. */
+char **
+get_hostname_list ()
+{
+  if (hostname_list_initialized == 0)
+    initialize_hostname_list ();
+  return (hostname_list);
+}
+
+void
+clear_hostname_list ()
+{
+  register int i;
+
+  if (hostname_list_initialized == 0)
+    return;
+  for (i = 0; i < hostname_list_length; i++)
+    free (hostname_list[i]);
+  hostname_list_length = hostname_list_initialized = 0;
+}
+
+/* Return a NULL terminated list of hostnames which begin with TEXT.
+   Initialize the hostname list the first time if necessary.
+   The array is malloc ()'ed, but not the individual strings. */
+static char **
+hostnames_matching (text)
+     char *text;
+{
+  register int i, len, nmatch, rsize;
+  char **result;
+
+  if (hostname_list_initialized == 0)
+    initialize_hostname_list ();
+
+  if (hostname_list_initialized == 0)
+    return ((char **)NULL);
+
+  /* Special case.  If TEXT consists of nothing, then the whole list is
+     what is desired. */
+  if (*text == '\0')
+    {
+      result = strvec_create (1 + hostname_list_length);
+      for (i = 0; i < hostname_list_length; i++)
+       result[i] = hostname_list[i];
+      result[i] = (char *)NULL;
+      return (result);
+    }
+
+  /* Scan until found, or failure. */
+  len = strlen (text);
+  result = (char **)NULL;
+  for (i = nmatch = rsize = 0; i < hostname_list_length; i++)
+    {
+      if (STREQN (text, hostname_list[i], len) == 0)
+       continue;
+
+      /* OK, it matches.  Add it to the list. */
+      if (nmatch >= (rsize - 1))
+       {
+         rsize = (rsize + 16) - (rsize % 16);
+         result = strvec_resize (result, rsize);
+       }
+
+      result[nmatch++] = hostname_list[i];
+    }
+  if (nmatch)
+    result[nmatch] = (char *)NULL;
+  return (result);
+}
+
+/* The equivalent of the Korn shell C-o operate-and-get-next-history-line
+   editing command. */
+static int saved_history_line_to_use = -1;
+static int last_saved_history_line = -1;
+
+#define HISTORY_FULL() (history_is_stifled () && history_length >= history_max_entries)
+
+static int
+set_saved_history ()
+{
+  /* XXX - compensate for assumption that history was `shuffled' if it was
+     actually not. */
+  if (HISTORY_FULL () &&
+      hist_last_line_added == 0 &&
+      saved_history_line_to_use < history_length - 1)
+    saved_history_line_to_use++;
+
+  if (saved_history_line_to_use >= 0)
+    {
+     rl_get_previous_history (history_length - saved_history_line_to_use, 0);
+     last_saved_history_line = saved_history_line_to_use;
+    }
+  saved_history_line_to_use = -1;
+  rl_startup_hook = old_rl_startup_hook;
+  return (0);
+}
+
+static int
+operate_and_get_next (count, c)
+     int count, c;
+{
+  int where;
+
+  /* Accept the current line. */
+  rl_newline (1, c);
+
+  /* Find the current line, and find the next line to use. */
+  where = where_history ();
+
+  if (HISTORY_FULL () || (where >= history_length - 1))
+    saved_history_line_to_use = where;
+  else
+    saved_history_line_to_use = where + 1;
+
+  old_rl_startup_hook = rl_startup_hook;
+  rl_startup_hook = set_saved_history;
+
+  return 0;
+}
+
+/* This vi mode command causes VI_EDIT_COMMAND to be run on the current
+   command being entered (if no explicit argument is given), otherwise on
+   a command from the history file. */
+
+#define VI_EDIT_COMMAND                "fc -e \"${VISUAL:-${EDITOR:-vi}}\""
+#define EMACS_EDIT_COMMAND     "fc -e \"${VISUAL:-${EDITOR:-emacs}}\""
+#define POSIX_VI_EDIT_COMMAND  "fc -e vi"
+
+static int
+edit_and_execute_command (count, c, editing_mode, edit_command)
+     int count, c, editing_mode;
+     char *edit_command;
+{
+  char *command, *metaval;
+  int r, rrs, metaflag;
+  sh_parser_state_t ps;
+
+  rrs = rl_readline_state;
+  saved_command_line_count = current_command_line_count;
+
+  /* Accept the current line. */
+  rl_newline (1, c);
+
+  if (rl_explicit_arg)
+    {
+      command = (char *)xmalloc (strlen (edit_command) + 8);
+      sprintf (command, "%s %d", edit_command, count);
+    }
+  else
+    {
+      /* Take the command we were just editing, add it to the history file,
+        then call fc to operate on it.  We have to add a dummy command to
+        the end of the history because fc ignores the last command (assumes
+        it's supposed to deal with the command before the `fc'). */
+      /* This breaks down when using command-oriented history and are not
+        finished with the command, so we should not ignore the last command */
+      using_history ();
+      current_command_line_count++;    /* for rl_newline above */
+      bash_add_history (rl_line_buffer);
+      current_command_line_count = 0;  /* for dummy history entry */
+      bash_add_history ("");
+      history_lines_this_session++;
+      using_history ();
+      command = savestring (edit_command);
+    }
+
+  metaval = rl_variable_value ("input-meta");
+  metaflag = RL_BOOLEAN_VARIABLE_VALUE (metaval);
+  
+  /* Now, POSIX.1-2001 and SUSv3 say that the commands executed from the
+     temporary file should be placed into the history.  We don't do that
+     yet. */
+  if (rl_deprep_term_function)
+    (*rl_deprep_term_function) ();
+  save_parser_state (&ps);
+  r = parse_and_execute (command, (editing_mode == VI_EDITING_MODE) ? "v" : "C-xC-e", SEVAL_NOHIST);
+  restore_parser_state (&ps);
+  if (rl_prep_term_function)
+    (*rl_prep_term_function) (metaflag);
+
+  current_command_line_count = saved_command_line_count;
+
+  /* Now erase the contents of the current line and undo the effects of the
+     rl_accept_line() above.  We don't even want to make the text we just
+     executed available for undoing. */
+  rl_line_buffer[0] = '\0';    /* XXX */
+  rl_point = rl_end = 0;
+  rl_done = 0;
+  rl_readline_state = rrs;
+
+  rl_forced_update_display ();
+
+  return r;
+}
+
+#if defined (VI_MODE)
+static int
+vi_edit_and_execute_command (count, c)
+     int count, c;
+{
+  if (posixly_correct)
+    return (edit_and_execute_command (count, c, VI_EDITING_MODE, POSIX_VI_EDIT_COMMAND));
+  else
+    return (edit_and_execute_command (count, c, VI_EDITING_MODE, VI_EDIT_COMMAND));
+}
+#endif /* VI_MODE */
+
+static int
+emacs_edit_and_execute_command (count, c)
+     int count, c;
+{
+  return (edit_and_execute_command (count, c, EMACS_EDITING_MODE, EMACS_EDIT_COMMAND));
+}
+
+#if defined (ALIAS)
+static int
+posix_edit_macros (count, key)
+     int count, key;
+{
+  int c;
+  char alias_name[3], *alias_value, *macro;
+
+  c = rl_read_key ();
+  alias_name[0] = '_';
+  alias_name[1] = c;
+  alias_name[2] = '\0';
+
+  alias_value = get_alias_value (alias_name);
+  if (alias_value && *alias_value)
+    {
+      macro = savestring (alias_value);
+      rl_push_macro_input (macro);
+    }
+  return 0;
+}
+#endif
+
+/* Bindable commands that move `shell-words': that is, sequences of
+   non-unquoted-metacharacters. */
+
+#define WORDDELIM(c)   (shellmeta(c) || shellblank(c))
+
+static int
+bash_forward_shellword (count, key)
+     int count, key;
+{
+  size_t slen;
+  int sindex, c, p;
+  DECLARE_MBSTATE;
+
+  if (count < 0)
+    return (bash_backward_shellword (-count, key));
+
+  /* The tricky part of this is deciding whether or not the first character
+     we're on is an unquoted metacharacter.  Not completely handled yet. */
+  /* XXX - need to test this stuff with backslash-escaped shell
+     metacharacters and unclosed single- and double-quoted strings. */
+
+  p = rl_point;
+  slen = rl_end;
+
+  while (count)
+    {
+      if (p == rl_end)
+       {
+         rl_point = rl_end;
+         return 0;
+       }
+
+      /* Are we in a quoted string?  If we are, move to the end of the quoted
+         string and continue the outer loop. We only want quoted strings, not
+         backslash-escaped characters, but char_is_quoted doesn't
+         differentiate. */
+      if (char_is_quoted (rl_line_buffer, p) && p > 0 && rl_line_buffer[p-1] != '\\')
+       {
+         do
+           ADVANCE_CHAR (rl_line_buffer, slen, p);
+         while (p < rl_end && char_is_quoted (rl_line_buffer, p));
+         count--;
+         continue;
+       }
+
+      /* Rest of code assumes we are not in a quoted string. */
+      /* Move forward until we hit a non-metacharacter. */
+      while (p < rl_end && (c = rl_line_buffer[p]) && WORDDELIM (c))
+       {
+         switch (c)
+           {
+           default:
+             ADVANCE_CHAR (rl_line_buffer, slen, p);
+             continue;         /* straight back to loop, don't increment p */
+           case '\\':
+             if (p < rl_end && rl_line_buffer[p])
+               ADVANCE_CHAR (rl_line_buffer, slen, p);
+             break;
+           case '\'':
+             p = skip_to_delim (rl_line_buffer, ++p, "'", SD_NOJMP);
+             break;
+           case '"':
+             p = skip_to_delim (rl_line_buffer, ++p, "\"", SD_NOJMP);
+             break;
+           }
+
+         if (p < rl_end)
+           p++;
+       }
+
+      if (rl_line_buffer[p] == 0 || p == rl_end)
+        {
+         rl_point = rl_end;
+         rl_ding ();
+         return 0;
+        }
+       
+      /* Now move forward until we hit a non-quoted metacharacter or EOL */
+      while (p < rl_end && (c = rl_line_buffer[p]) && WORDDELIM (c) == 0)
+       {
+         switch (c)
+           {
+           default:
+             ADVANCE_CHAR (rl_line_buffer, slen, p);
+             continue;         /* straight back to loop, don't increment p */
+           case '\\':
+             if (p < rl_end && rl_line_buffer[p])
+               ADVANCE_CHAR (rl_line_buffer, slen, p);
+             break;
+           case '\'':
+             p = skip_to_delim (rl_line_buffer, ++p, "'", SD_NOJMP);
+             break;
+           case '"':
+             p = skip_to_delim (rl_line_buffer, ++p, "\"", SD_NOJMP);
+             break;
+           }
+
+         if (p < rl_end)
+           p++;
+       }
+
+      if (p == rl_end || rl_line_buffer[p] == 0)
+       {
+         rl_point = rl_end;
+         return (0);
+       }
+
+      count--;      
+    }
+
+  rl_point = p;
+  return (0);
+}
+
+static int
+bash_backward_shellword (count, key)
+     int count, key;
+{
+  size_t slen;
+  int sindex, c, p;
+  DECLARE_MBSTATE;
+  
+  if (count < 0)
+    return (bash_forward_shellword (-count, key));
+
+  p = rl_point;
+  slen = rl_end;
+  
+  while (count)
+    {
+      if (p == 0)
+       {
+         rl_point = 0;
+         return 0;
+       }
+
+      /* Move backward until we hit a non-metacharacter. */
+      while (p > 0)
+       {
+         c = rl_line_buffer[p];
+         if (WORDDELIM (c) && char_is_quoted (rl_line_buffer, p) == 0)
+           BACKUP_CHAR (rl_line_buffer, slen, p);
+         break;
+       }
+
+      if (p == 0)
+       {
+         rl_point = 0;
+         return 0;
+       }
+
+      /* Now move backward until we hit a metacharacter or BOL. */
+      while (p > 0)
+       {
+         c = rl_line_buffer[p];
+         if (WORDDELIM (c) && char_is_quoted (rl_line_buffer, p) == 0)
+           break;
+         BACKUP_CHAR (rl_line_buffer, slen, p);
+       }
+
+      count--;
+    }
+
+  rl_point = p;
+  return 0;
+}
+
+static int
+bash_kill_shellword (count, key)
+     int count, key;
+{
+  int p;
+
+  if (count < 0)
+    return (bash_backward_kill_shellword (-count, key));
+
+  p = rl_point;
+  bash_forward_shellword (count, key);
+
+  if (rl_point != p)
+    rl_kill_text (p, rl_point);
+
+  rl_point = p;
+  if (rl_editing_mode == 1)    /* 1 == emacs_mode */
+    rl_mark = rl_point;
+
+  return 0;
+}
+
+static int
+bash_backward_kill_shellword (count, key)
+     int count, key;
+{
+  int p;
+
+  if (count < 0)
+    return (bash_kill_shellword (-count, key));
+
+  p = rl_point;
+  bash_backward_shellword (count, key);
+
+  if (rl_point != p)
+    rl_kill_text (p, rl_point);
+
+  if (rl_editing_mode == 1)    /* 1 == emacs_mode */
+    rl_mark = rl_point;
+
+  return 0;
+}
+
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     How To Do Shell Completion                  */
+/*                                                                 */
+/* **************************************************************** */
+
+#define COMMAND_SEPARATORS ";|&{(`"
+/* )} */ 
+#define COMMAND_SEPARATORS_PLUS_WS ";|&{(` \t"
+/* )} */ 
+
+/* check for redirections and other character combinations that are not
+   command separators */
+static int
+check_redir (ti)
+     int ti;
+{
+  register int this_char, prev_char;
+
+  /* Handle the two character tokens `>&', `<&', and `>|'.
+     We are not in a command position after one of these. */
+  this_char = rl_line_buffer[ti];
+  prev_char = rl_line_buffer[ti - 1];
+
+  if ((this_char == '&' && (prev_char == '<' || prev_char == '>')) ||
+      (this_char == '|' && prev_char == '>'))
+    return (1);
+  else if (this_char == '{' && prev_char == '$') /*}*/
+    return (1);
+#if 0  /* Not yet */
+  else if (this_char == '(' && prev_char == '$') /*)*/
+    return (1);
+  else if (this_char == '(' && prev_char == '<') /*)*/
+    return (1);
+#if defined (EXTENDED_GLOB)
+  else if (extended_glob && this_char == '(' && prev_char == '!') /*)*/
+    return (1);
+#endif
+#endif
+  else if (char_is_quoted (rl_line_buffer, ti))
+    return (1);
+  return (0);
+}
+
+#if defined (PROGRAMMABLE_COMPLETION)
+/*
+ * XXX - because of the <= start test, and setting os = s+1, this can
+ * potentially return os > start.  This is probably not what we want to
+ * happen, but fix later after 2.05a-release.
+ */
+static int
+find_cmd_start (start)
+     int start;
+{
+  register int s, os;
+
+  os = 0;
+  /* Flags == SD_NOJMP only because we want to skip over command substitutions
+     in assignment statements.  Have to test whether this affects `standalone'
+     command substitutions as individual words. */
+  while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS, SD_NOJMP/*|SD_NOSKIPCMD*/)) <= start) &&
+        rl_line_buffer[s])
+    os = s+1;
+  return os;
+}
+
+static int
+find_cmd_end (end)
+     int end;
+{
+  register int e;
+
+  e = skip_to_delim (rl_line_buffer, end, COMMAND_SEPARATORS, SD_NOJMP);
+  return e;
+}
+
+static char *
+find_cmd_name (start, sp, ep)
+     int start;
+     int *sp, *ep;
+{
+  char *name;
+  register int s, e;
+
+  for (s = start; whitespace (rl_line_buffer[s]); s++)
+    ;
+
+  /* skip until a shell break character */
+  e = skip_to_delim (rl_line_buffer, s, "()<>;&| \t\n", SD_NOJMP);
+
+  name = substring (rl_line_buffer, s, e);
+
+  if (sp)
+    *sp = s;
+  if (ep)
+    *ep = e;
+
+  return (name);
+}
+
+static char *
+prog_complete_return (text, matchnum)
+     const char *text;
+     int matchnum;
+{
+  static int ind;
+
+  if (matchnum == 0)
+    ind = 0;
+
+  if (prog_complete_matches == 0 || prog_complete_matches[ind] == 0)
+    return (char *)NULL;
+  return (prog_complete_matches[ind++]);
+}
+
+#endif /* PROGRAMMABLE_COMPLETION */
+
+/* Do some completion on TEXT.  The indices of TEXT in RL_LINE_BUFFER are
+   at START and END.  Return an array of matches, or NULL if none. */
+static char **
+attempt_shell_completion (text, start, end)
+     const char *text;
+     int start, end;
+{
+  int in_command_position, ti, saveti, qc, dflags;
+  char **matches, *command_separator_chars;
+#if defined (PROGRAMMABLE_COMPLETION)
+  int have_progcomps, was_assignment;
+#endif
+
+  command_separator_chars = COMMAND_SEPARATORS;
+  matches = (char **)NULL;
+  rl_ignore_some_completions_function = filename_completion_ignore;
+
+  rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
+  set_directory_hook ();
+  rl_filename_stat_hook = bash_filename_stat_hook;
+
+  /* Determine if this could be a command word.  It is if it appears at
+     the start of the line (ignoring preceding whitespace), or if it
+     appears after a character that separates commands.  It cannot be a
+     command word if we aren't at the top-level prompt. */
+  ti = start - 1;
+  saveti = qc = -1;
+
+  while ((ti > -1) && (whitespace (rl_line_buffer[ti])))
+    ti--;
+
+#if 1
+  /* If this is an open quote, maybe we're trying to complete a quoted
+     command name. */
+  if (ti >= 0 && (rl_line_buffer[ti] == '"' || rl_line_buffer[ti] == '\''))
+    {
+      qc = rl_line_buffer[ti];
+      saveti = ti--;
+      while (ti > -1 && (whitespace (rl_line_buffer[ti])))
+       ti--;
+    }
+#endif
+      
+  in_command_position = 0;
+  if (ti < 0)
+    {
+      /* Only do command completion at the start of a line when we
+        are prompting at the top level. */
+      if (current_prompt_string == ps1_prompt)
+       in_command_position++;
+      else if (parser_in_command_position ())
+       in_command_position++;
+    }
+  else if (member (rl_line_buffer[ti], command_separator_chars))
+    {
+      in_command_position++;
+
+      if (check_redir (ti) == 1)
+       in_command_position = 0;
+    }
+  else
+    {
+      /* This still could be in command position.  It is possible
+        that all of the previous words on the line are variable
+        assignments. */
+    }
+
+  /* Check that we haven't incorrectly flagged a closed command substitution
+     as indicating we're in a command position. */
+  if (in_command_position && ti >= 0 && rl_line_buffer[ti] == '`' &&
+       *text != '`' && unclosed_pair (rl_line_buffer, end, "`") == 0)
+    in_command_position = 0;
+
+  /* Special handling for command substitution.  If *TEXT is a backquote,
+     it can be the start or end of an old-style command substitution, or
+     unmatched.  If it's unmatched, both calls to unclosed_pair will
+     succeed.  Don't bother if readline found a single quote and we are
+     completing on the substring.  */
+  if (*text == '`' && rl_completion_quote_character != '\'' &&
+       (in_command_position || (unclosed_pair (rl_line_buffer, start, "`") &&
+                                unclosed_pair (rl_line_buffer, end, "`"))))
+    matches = rl_completion_matches (text, command_subst_completion_function);
+
+#if defined (PROGRAMMABLE_COMPLETION)
+  /* Attempt programmable completion. */
+  have_progcomps = prog_completion_enabled && (progcomp_size () > 0);
+  if (matches == 0 && (in_command_position == 0 || text[0] == '\0') &&
+      current_prompt_string == ps1_prompt)
+    {
+      int s, e, s1, e1, os, foundcs;
+      char *n;
+
+      /* XXX - don't free the members */
+      if (prog_complete_matches)
+       free (prog_complete_matches);
+      prog_complete_matches = (char **)NULL;
+
+      os = start;
+      n = 0;
+      s = find_cmd_start (os);
+      e = find_cmd_end (end);
+      do
+       {
+         /* Skip over assignment statements preceding a command name.  If we
+            don't find a command name at all, we can perform command name
+            completion.  If we find a partial command name, we should perform
+            command name completion on it. */
+         FREE (n);
+         n = find_cmd_name (s, &s1, &e1);
+         s = e1 + 1;
+       }
+      while (was_assignment = assignment (n, 0));
+      s = s1;          /* reset to index where name begins */
+
+      /* s == index of where command name begins (reset above)
+        e == end of current command, may be end of line
+         s1 = index of where command name begins
+         e1 == index of where command name ends
+        start == index of where word to be completed begins
+        end == index of where word to be completed ends
+        if (s == start) we are doing command word completion for sure
+        if (e1 == end) we are at the end of the command name and completing it */
+      if (start == 0 && end == 0 && e != 0 && text[0] == '\0') /* beginning of non-empty line */
+        foundcs = 0;
+      else if (start == end && start == s1 && e != 0 && e1 > end)      /* beginning of command name, leading whitespace */
+       foundcs = 0;
+      else if (e == 0 && e == s && text[0] == '\0' && have_progcomps)  /* beginning of empty line */
+        prog_complete_matches = programmable_completions ("_EmptycmD_", text, s, e, &foundcs);
+      else if (start == end && text[0] == '\0' && s1 > start && whitespace (rl_line_buffer[start]))
+        foundcs = 0;           /* whitespace before command name */
+      else if (e > s && was_assignment == 0 && e1 == end && rl_line_buffer[e] == 0 && whitespace (rl_line_buffer[e-1]) == 0)
+       {
+         /* not assignment statement, but still want to perform command
+            completion if we are composing command word. */
+         foundcs = 0;
+         in_command_position = s == start && STREQ (n, text);  /* XXX */
+       }
+      else if (e > s && was_assignment == 0 && have_progcomps)
+       {
+         prog_complete_matches = programmable_completions (n, text, s, e, &foundcs);
+         /* command completion if programmable completion fails */
+         in_command_position = s == start && STREQ (n, text);  /* XXX */
+       }
+      else if (s >= e && n[0] == '\0' && text[0] == '\0' && start > 0)
+        {
+          foundcs = 0; /* empty command name following assignments */
+          in_command_position = was_assignment;
+        }
+      else if (s == start && e == end && STREQ (n, text) && start > 0)
+        {
+          foundcs = 0; /* partial command name following assignments */
+          in_command_position = 1;
+        }
+      else
+       foundcs = 0;
+      FREE (n);
+      /* XXX - if we found a COMPSPEC for the command, just return whatever
+        the programmable completion code returns, and disable the default
+        filename completion that readline will do unless the COPT_DEFAULT
+        option has been set with the `-o default' option to complete or
+        compopt. */
+      if (foundcs)
+       {
+         pcomp_set_readline_variables (foundcs, 1);
+         /* Turn what the programmable completion code returns into what
+            readline wants.  I should have made compute_lcd_of_matches
+            external... */
+         matches = rl_completion_matches (text, prog_complete_return);
+         if ((foundcs & COPT_DEFAULT) == 0)
+           rl_attempted_completion_over = 1;   /* no default */
+         if (matches || ((foundcs & COPT_BASHDEFAULT) == 0))
+           return (matches);
+       }
+    }
+#endif
+
+  if (matches == 0)
+    {
+      dflags = 0;
+      if (in_command_position)
+       dflags |= DEFCOMP_CMDPOS;
+      matches = bash_default_completion (text, start, end, qc, dflags);
+    }
+
+  return matches;
+}
+
+char **
+bash_default_completion (text, start, end, qc, compflags)
+     const char *text;
+     int start, end, qc, compflags;
+{
+  char **matches, *t;
+
+  matches = (char **)NULL;
+
+  /* New posix-style command substitution or variable name? */
+  if (!matches && *text == '$')
+    {
+      if (qc != '\'' && text[1] == '(') /* ) */
+       matches = rl_completion_matches (text, command_subst_completion_function);
+      else
+       {
+         matches = rl_completion_matches (text, variable_completion_function);
+         if (matches && matches[0] && matches[1] == 0)
+           {
+             t = savestring (matches[0]);
+             bash_filename_stat_hook (&t);
+             /* doesn't use test_for_directory because that performs tilde
+                expansion */
+             if (file_isdir (t))
+               rl_completion_append_character = '/';
+             free (t);
+           }
+       }
+    }
+
+  /* If the word starts in `~', and there is no slash in the word, then
+     try completing this word as a username. */
+  if (matches == 0 && *text == '~' && mbschr (text, '/') == 0)
+    matches = rl_completion_matches (text, rl_username_completion_function);
+
+  /* Another one.  Why not?  If the word starts in '@', then look through
+     the world of known hostnames for completion first. */
+  if (matches == 0 && perform_hostname_completion && *text == '@')
+    matches = rl_completion_matches (text, hostname_completion_function);
+
+  /* And last, (but not least) if this word is in a command position, then
+     complete over possible command names, including aliases, functions,
+     and command names. */
+  if (matches == 0 && (compflags & DEFCOMP_CMDPOS))
+    {
+      /* If END == START and text[0] == 0, we are trying to complete an empty
+        command word. */
+      if (no_empty_command_completion && end == start && text[0] == '\0')
+       {
+         matches = (char **)NULL;
+         rl_ignore_some_completions_function = bash_ignore_everything;
+       }
+      else
+       {
+#define CMD_IS_DIR(x)  (absolute_pathname(x) == 0 && absolute_program(x) == 0 && *(x) != '~' && test_for_directory (x))
+
+         dot_in_path = 0;
+         matches = rl_completion_matches (text, command_word_completion_function);
+
+         /* If we are attempting command completion and nothing matches, we
+            do not want readline to perform filename completion for us.  We
+            still want to be able to complete partial pathnames, so set the
+            completion ignore function to something which will remove
+            filenames and leave directories in the match list. */
+         if (matches == (char **)NULL)
+           rl_ignore_some_completions_function = bash_ignore_filenames;
+         else if (matches[1] == 0 && CMD_IS_DIR(matches[0]) && dot_in_path == 0)
+           /* If we found a single match, without looking in the current
+              directory (because it's not in $PATH), but the found name is
+              also a command in the current directory, suppress appending any
+              terminating character, since it's ambiguous. */
+           {
+             rl_completion_suppress_append = 1;
+             rl_filename_completion_desired = 0;
+           }
+         else if (matches[0] && matches[1] && STREQ (matches[0], matches[1]) && CMD_IS_DIR (matches[0]))
+           /* There are multiple instances of the same match (duplicate
+              completions haven't yet been removed).  In this case, all of
+              the matches will be the same, and the duplicate removal code
+              will distill them all down to one.  We turn on
+              rl_completion_suppress_append for the same reason as above.
+              Remember: we only care if there's eventually a single unique
+              completion.  If there are multiple completions this won't
+              make a difference and the problem won't occur. */
+           {
+             rl_completion_suppress_append = 1;
+             rl_filename_completion_desired = 0;
+           }
+       }
+    }
+
+  /* This could be a globbing pattern, so try to expand it using pathname
+     expansion. */
+  if (!matches && glob_pattern_p (text))
+    {
+      matches = rl_completion_matches (text, glob_complete_word);
+      /* A glob expression that matches more than one filename is problematic.
+        If we match more than one filename, punt. */
+      if (matches && matches[1] && rl_completion_type == TAB)
+       {
+         strvec_dispose (matches);
+         matches = (char **)0;
+       }
+      else if (matches && matches[1] && rl_completion_type == '!')
+       {
+         rl_completion_suppress_append = 1;
+         rl_filename_completion_desired = 0;
+       }
+    }
+
+  return (matches);
+}
+
+static int
+bash_command_name_stat_hook (name)
+     char **name;
+{
+  char *cname, *result;
+
+  /* If it's not something we're going to look up in $PATH, just call the
+     normal filename stat hook. */
+  if (absolute_program (*name))
+    return (bash_filename_stat_hook (name));
+
+  cname = *name;
+  /* XXX - we could do something here with converting aliases, builtins,
+     and functions into something that came out as executable, but we don't. */
+  result = search_for_command (cname, 0);
+  if (result)
+    {
+      *name = result;
+      return 1;
+    }
+  return 0;
+}
+
+static int
+executable_completion (filename, searching_path)
+     const char *filename;
+     int searching_path;
+{
+  char *f;
+  int r;
+
+  f = savestring (filename);
+  bash_directory_completion_hook (&f);
+  
+  r = searching_path ? executable_file (f) : executable_or_directory (f);
+  free (f);
+  return r;
+}
+
+/* This is the function to call when the word to complete is in a position
+   where a command word can be found.  It grovels $PATH, looking for commands
+   that match.  It also scans aliases, function names, and the shell_builtin
+   table. */
+char *
+command_word_completion_function (hint_text, state)
+     const char *hint_text;
+     int state;
+{
+  static char *hint = (char *)NULL;
+  static char *path = (char *)NULL;
+  static char *val = (char *)NULL;
+  static char *filename_hint = (char *)NULL;
+  static char *dequoted_hint = (char *)NULL;
+  static char *directory_part = (char *)NULL;
+  static char **glob_matches = (char **)NULL;
+  static int path_index, hint_len, dequoted_len, istate, igncase;
+  static int mapping_over, local_index, searching_path, hint_is_dir;
+  static int old_glob_ignore_case, globpat;
+  static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
+#if defined (ALIAS)
+  static alias_t **alias_list = (alias_t **)NULL;
+#endif /* ALIAS */
+  char *temp, *cval, *fnhint;
+
+  /* We have to map over the possibilities for command words.  If we have
+     no state, then make one just for that purpose. */
+  if (state == 0)
+    {
+      rl_filename_stat_hook = bash_command_name_stat_hook;
+
+      if (dequoted_hint && dequoted_hint != hint)
+       free (dequoted_hint);
+      if (hint)
+       free (hint);
+
+      mapping_over = searching_path = 0;
+      hint_is_dir = CMD_IS_DIR (hint_text);
+      val = (char *)NULL;
+
+      temp = rl_variable_value ("completion-ignore-case");
+      igncase = RL_BOOLEAN_VARIABLE_VALUE (temp);
+
+      if (glob_matches)
+       {
+         free (glob_matches);
+         glob_matches = (char **)NULL;
+       }
+
+      globpat = glob_pattern_p (hint_text);
+
+      /* If this is an absolute program name, do not check it against
+        aliases, reserved words, functions or builtins.  We must check
+        whether or not it is unique, and, if so, whether that filename
+        is executable. */
+      if (globpat || absolute_program (hint_text))
+       {
+         /* Perform tilde expansion on what's passed, so we don't end up
+            passing filenames with tildes directly to stat(). */
+         if (*hint_text == '~')
+           {
+             hint = bash_tilde_expand (hint_text, 0);
+             directory_part = savestring (hint_text);
+             temp = strchr (directory_part, '/');
+             if (temp)
+               *temp = 0;
+             else
+               {
+                 free (directory_part);
+                 directory_part = (char *)NULL;
+               }
+           }
+         else
+           hint = savestring (hint_text);
+
+         dequoted_hint = hint;
+         /* If readline's completer found a quote character somewhere, but
+            didn't set the quote character, there must have been a quote
+            character embedded in the filename.  It can't be at the start of
+            the filename, so we need to dequote the filename before we look
+            in the file system for it. */
+         if (rl_completion_found_quote && rl_completion_quote_character == 0)
+           {
+             dequoted_hint = bash_dequote_filename (hint, 0);
+             free (hint);
+             hint = dequoted_hint;
+           }
+         dequoted_len = hint_len = strlen (hint);
+
+         if (filename_hint)
+           free (filename_hint);
+
+         fnhint = filename_hint = savestring (hint);
+
+         istate = 0;
+
+         if (globpat)
+           {
+             mapping_over = 5;
+             goto globword;
+           }
+         else
+           {
+            if (dircomplete_expand && path_dot_or_dotdot (filename_hint))
+               {
+                 dircomplete_expand = 0;
+                 set_directory_hook ();
+                 dircomplete_expand = 1;
+               }
+             mapping_over = 4;
+             goto inner;
+           }
+       }
+
+      dequoted_hint = hint = savestring (hint_text);
+      dequoted_len = hint_len = strlen (hint);
+
+      if (rl_completion_found_quote && rl_completion_quote_character == 0)
+       {
+         dequoted_hint = bash_dequote_filename (hint, 0);
+         dequoted_len = strlen (dequoted_hint);
+       }
+      
+      path = get_string_value ("PATH");
+      path_index = dot_in_path = 0;
+
+      /* Initialize the variables for each type of command word. */
+      local_index = 0;
+
+      if (varlist)
+       free (varlist);
+
+      varlist = all_visible_functions ();
+
+#if defined (ALIAS)
+      if (alias_list)
+       free (alias_list);
+
+      alias_list = all_aliases ();
+#endif /* ALIAS */
+    }
+
+  /* mapping_over says what we are currently hacking.  Note that every case
+     in this list must fall through when there are no more possibilities. */
+
+  switch (mapping_over)
+    {
+    case 0:                    /* Aliases come first. */
+#if defined (ALIAS)
+      while (alias_list && alias_list[local_index])
+       {
+         register char *alias;
+
+         alias = alias_list[local_index++]->name;
+
+         if (STREQN (alias, hint, hint_len))
+           return (savestring (alias));
+       }
+#endif /* ALIAS */
+      local_index = 0;
+      mapping_over++;
+
+    case 1:                    /* Then shell reserved words. */
+      {
+       while (word_token_alist[local_index].word)
+         {
+           register char *reserved_word;
+
+           reserved_word = word_token_alist[local_index++].word;
+
+           if (STREQN (reserved_word, hint, hint_len))
+             return (savestring (reserved_word));
+         }
+       local_index = 0;
+       mapping_over++;
+      }
+
+    case 2:                    /* Then function names. */
+      while (varlist && varlist[local_index])
+       {
+         register char *varname;
+
+         varname = varlist[local_index++]->name;
+
+         if (STREQN (varname, hint, hint_len))
+           return (savestring (varname));
+       }
+      local_index = 0;
+      mapping_over++;
+
+    case 3:                    /* Then shell builtins. */
+      for (; local_index < num_shell_builtins; local_index++)
+       {
+         /* Ignore it if it doesn't have a function pointer or if it
+            is not currently enabled. */
+         if (!shell_builtins[local_index].function ||
+             (shell_builtins[local_index].flags & BUILTIN_ENABLED) == 0)
+           continue;
+
+         if (STREQN (shell_builtins[local_index].name, hint, hint_len))
+           {
+             int i = local_index++;
+
+             return (savestring (shell_builtins[i].name));
+           }
+       }
+      local_index = 0;
+      mapping_over++;
+    }
+
+globword:
+  /* Limited support for completing command words with globbing chars.  Only
+     a single match (multiple matches that end up reducing the number of
+     characters in the common prefix are bad) will ever be returned on
+     regular completion. */
+  if (globpat)
+    {
+      if (state == 0)
+       {
+         glob_ignore_case = igncase;
+         glob_matches = shell_glob_filename (hint);
+         glob_ignore_case = old_glob_ignore_case;
+
+         if (GLOB_FAILED (glob_matches) || glob_matches == 0)
+           {
+             glob_matches = (char **)NULL;
+             return ((char *)NULL);
+           }
+
+         local_index = 0;
+               
+         if (glob_matches[1] && rl_completion_type == TAB)     /* multiple matches are bad */
+           return ((char *)NULL);
+       }
+
+      while (val = glob_matches[local_index++])
+        {
+         if (executable_or_directory (val))
+           {
+             if (*hint_text == '~' && directory_part)
+               {
+                 temp = maybe_restore_tilde (val, directory_part);
+                 free (val);
+                 val = temp;
+               }
+             return (val);
+           }
+         free (val);
+        }
+
+      glob_ignore_case = old_glob_ignore_case;
+      return ((char *)NULL);
+    }
+
+  /* If the text passed is a directory in the current directory, return it
+     as a possible match.  Executables in directories in the current
+     directory can be specified using relative pathnames and successfully
+     executed even when `.' is not in $PATH. */
+  if (hint_is_dir)
+    {
+      hint_is_dir = 0; /* only return the hint text once */
+      return (savestring (hint_text));
+    }
+    
+  /* Repeatedly call filename_completion_function while we have
+     members of PATH left.  Question:  should we stat each file?
+     Answer: we call executable_file () on each file. */
+ outer:
+
+  istate = (val != (char *)NULL);
+
+  if (istate == 0)
+    {
+      char *current_path;
+
+      /* Get the next directory from the path.  If there is none, then we
+        are all done. */
+      if (path == 0 || path[path_index] == 0 ||
+         (current_path = extract_colon_unit (path, &path_index)) == 0)
+       return ((char *)NULL);
+
+      searching_path = 1;
+      if (*current_path == 0)
+       {
+         free (current_path);
+         current_path = savestring (".");
+       }
+
+      if (*current_path == '~')
+       {
+         char *t;
+
+         t = bash_tilde_expand (current_path, 0);
+         free (current_path);
+         current_path = t;
+       }
+
+      if (current_path[0] == '.' && current_path[1] == '\0')
+       dot_in_path = 1;
+
+      if (fnhint && filename_hint && fnhint != filename_hint)
+       free (fnhint);
+      if (filename_hint)
+       free (filename_hint);
+
+      filename_hint = sh_makepath (current_path, hint, 0);
+      /* Need a quoted version (though it doesn't matter much in most
+        cases) because rl_filename_completion_function dequotes the
+        filename it gets, assuming that it's been quoted as part of
+        the input line buffer. */
+      if (strpbrk (filename_hint, "\"'\\"))
+       fnhint = sh_backslash_quote (filename_hint, filename_bstab, 0);
+      else
+       fnhint = filename_hint;
+      free (current_path);             /* XXX */
+    }
+
+ inner:
+  val = rl_filename_completion_function (fnhint, istate);
+  if (mapping_over == 4 && dircomplete_expand)
+    set_directory_hook ();
+
+  istate = 1;
+
+  if (val == 0)
+    {
+      /* If the hint text is an absolute program, then don't bother
+        searching through PATH. */
+      if (absolute_program (hint))
+       return ((char *)NULL);
+
+      goto outer;
+    }
+  else
+    {
+      int match, freetemp;
+
+      if (absolute_program (hint))
+       {
+         if (igncase == 0)
+           match = strncmp (val, hint, hint_len) == 0;
+         else
+           match = strncasecmp (val, hint, hint_len) == 0;
+
+         /* If we performed tilde expansion, restore the original
+            filename. */
+         if (*hint_text == '~')
+           temp = maybe_restore_tilde (val, directory_part);
+         else
+           temp = savestring (val);
+         freetemp = 1;
+       }
+      else
+       {
+         temp = strrchr (val, '/');
+
+         if (temp)
+           {
+             temp++;
+             if (igncase == 0)
+               freetemp = match = strncmp (temp, hint, hint_len) == 0;
+             else
+               freetemp = match = strncasecmp (temp, hint, hint_len) == 0;
+             if (match)
+               temp = savestring (temp);
+           }
+         else
+           freetemp = match = 0;
+       }
+
+      /* If we have found a match, and it is an executable file, return it.
+        We don't return directory names when searching $PATH, since the
+        bash execution code won't find executables in directories which
+        appear in directories in $PATH when they're specified using
+        relative pathnames.  */
+#if 0
+      /* If we're not searching $PATH and we have a relative pathname, we
+        need to re-canonicalize it before testing whether or not it's an
+        executable or a directory so the shell treats .. relative to $PWD
+        according to the physical/logical option.  The shell already
+        canonicalizes the directory name in order to tell readline where
+        to look, so not doing it here will be inconsistent. */
+      /* XXX -- currently not used -- will introduce more inconsistency,
+        since shell does not canonicalize ../foo before passing it to
+        shell_execve().  */
+      if (match && searching_path == 0 && *val == '.')
+       {
+         char *t, *t1;
+
+         t = get_working_directory ("command-word-completion");
+         t1 = make_absolute (val, t);
+         free (t);
+         cval = sh_canonpath (t1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
+       }
+      else
+#endif
+       cval = val;
+
+      if (match && executable_completion ((searching_path ? val : cval), searching_path))
+       {
+         if (cval != val)
+           free (cval);
+         free (val);
+         val = "";             /* So it won't be NULL. */
+         return (temp);
+       }
+      else
+       {
+         if (freetemp)
+           free (temp);
+         if (cval != val)
+           free (cval);
+         free (val);
+         goto inner;
+       }
+    }
+}
+
+/* Completion inside an unterminated command substitution. */
+static char *
+command_subst_completion_function (text, state)
+     const char *text;
+     int state;
+{
+  static char **matches = (char **)NULL;
+  static const char *orig_start;
+  static char *filename_text = (char *)NULL;
+  static int cmd_index, start_len;
+  char *value;
+
+  if (state == 0)
+    {
+      if (filename_text)
+       free (filename_text);
+      orig_start = text;
+      if (*text == '`')
+       text++;
+      else if (*text == '$' && text[1] == '(') /* ) */
+       text += 2;
+      /* If the text was quoted, suppress any quote character that the
+        readline completion code would insert. */
+      rl_completion_suppress_quote = 1;
+      start_len = text - orig_start;
+      filename_text = savestring (text);
+      if (matches)
+       free (matches);
+
+      /*
+       * At this point we can entertain the idea of re-parsing
+       * `filename_text' into a (possibly incomplete) command name and
+       * arguments, and doing completion based on that.  This is
+       * currently very rudimentary, but it is a small improvement.
+       */
+      for (value = filename_text + strlen (filename_text) - 1; value > filename_text; value--)
+        if (whitespace (*value) || member (*value, COMMAND_SEPARATORS))
+          break;
+      if (value <= filename_text)
+       matches = rl_completion_matches (filename_text, command_word_completion_function);
+      else
+       {
+         value++;
+         start_len += value - filename_text;
+         if (whitespace (value[-1]))
+           matches = rl_completion_matches (value, rl_filename_completion_function);
+         else
+           matches = rl_completion_matches (value, command_word_completion_function);
+       }
+
+      /* If there is more than one match, rl_completion_matches has already
+        put the lcd in matches[0].  Skip over it. */
+      cmd_index = matches && matches[0] && matches[1];
+
+      /* If there's a single match and it's a directory, set the append char
+        to the expected `/'.  Otherwise, don't append anything. */
+      if (matches && matches[0] && matches[1] == 0 && test_for_directory (matches[0]))
+       rl_completion_append_character = '/';
+      else
+       rl_completion_suppress_append = 1;
+    }
+
+  if (matches == 0 || matches[cmd_index] == 0)
+    {
+      rl_filename_quoting_desired = 0; /* disable quoting */
+      return ((char *)NULL);
+    }
+  else
+    {
+      value = (char *)xmalloc (1 + start_len + strlen (matches[cmd_index]));
+
+      if (start_len == 1)
+       value[0] = *orig_start;
+      else
+       strncpy (value, orig_start, start_len);
+
+      strcpy (value + start_len, matches[cmd_index]);
+
+      cmd_index++;
+      return (value);
+    }
+}
+
+/* Okay, now we write the entry_function for variable completion. */
+static char *
+variable_completion_function (text, state)
+     const char *text;
+     int state;
+{
+  static char **varlist = (char **)NULL;
+  static int varlist_index;
+  static char *varname = (char *)NULL;
+  static int namelen;
+  static int first_char, first_char_loc;
+
+  if (!state)
+    {
+      if (varname)
+       free (varname);
+
+      first_char_loc = 0;
+      first_char = text[0];
+
+      if (first_char == '$')
+       first_char_loc++;
+
+      if (text[first_char_loc] == '{')
+       first_char_loc++;
+
+      varname = savestring (text + first_char_loc);
+
+      namelen = strlen (varname);
+      if (varlist)
+       strvec_dispose (varlist);
+
+      varlist = all_variables_matching_prefix (varname);
+      varlist_index = 0;
+    }
+
+  if (!varlist || !varlist[varlist_index])
+    {
+      return ((char *)NULL);
+    }
+  else
+    {
+      char *value;
+
+      value = (char *)xmalloc (4 + strlen (varlist[varlist_index]));
+
+      if (first_char_loc)
+       {
+         value[0] = first_char;
+         if (first_char_loc == 2)
+           value[1] = '{';
+       }
+
+      strcpy (value + first_char_loc, varlist[varlist_index]);
+      if (first_char_loc == 2)
+       strcat (value, "}");
+
+      varlist_index++;
+      return (value);
+    }
+}
+
+/* How about a completion function for hostnames? */
+static char *
+hostname_completion_function (text, state)
+     const char *text;
+     int state;
+{
+  static char **list = (char **)NULL;
+  static int list_index = 0;
+  static int first_char, first_char_loc;
+
+  /* If we don't have any state, make some. */
+  if (state == 0)
+    {
+      FREE (list);
+
+      list = (char **)NULL;
+
+      first_char_loc = 0;
+      first_char = *text;
+
+      if (first_char == '@')
+       first_char_loc++;
+
+      list = hostnames_matching ((char *)text+first_char_loc);
+      list_index = 0;
+    }
+
+  if (list && list[list_index])
+    {
+      char *t;
+
+      t = (char *)xmalloc (2 + strlen (list[list_index]));
+      *t = first_char;
+      strcpy (t + first_char_loc, list[list_index]);
+      list_index++;
+      return (t);
+    }
+
+  return ((char *)NULL);
+}
+
+/*
+ * A completion function for service names from /etc/services (or wherever).
+ */
+char *
+bash_servicename_completion_function (text, state)
+     const char *text;
+     int state;
+{
+#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GETSERVENT)
+  return ((char *)NULL);
+#else
+  static char *sname = (char *)NULL;
+  static struct servent *srvent;
+  static int snamelen, firstc;
+  char *value;
+  char **alist, *aentry;
+  int afound;
+
+  if (state == 0)
+    {
+      FREE (sname);
+      firstc = *text;
+
+      sname = savestring (text);
+      snamelen = strlen (sname);
+      setservent (0);
+    }
+
+  while (srvent = getservent ())
+    {
+      afound = 0;
+      if (snamelen == 0 || (STREQN (sname, srvent->s_name, snamelen)))
+       break;
+      /* Not primary, check aliases */
+      for (alist = srvent->s_aliases; *alist; alist++)
+       {
+         aentry = *alist;
+         if (STREQN (sname, aentry, snamelen))
+           {
+             afound = 1;
+             break;
+           }
+       }
+
+      if (afound)
+       break;
+    }
+
+  if (srvent == 0)
+    {
+      endservent ();
+      return ((char *)NULL);
+    }
+
+  value = afound ? savestring (aentry) : savestring (srvent->s_name);
+  return value;
+#endif
+}
+
+/*
+ * A completion function for group names from /etc/group (or wherever).
+ */
+char *
+bash_groupname_completion_function (text, state)
+     const char *text;
+     int state;
+{
+#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H)
+  return ((char *)NULL);
+#else
+  static char *gname = (char *)NULL;
+  static struct group *grent;
+  static int gnamelen;
+  char *value;
+
+  if (state == 0)
+    {
+      FREE (gname);
+      gname = savestring (text);
+      gnamelen = strlen (gname);
+
+      setgrent ();
+    }
+
+  while (grent = getgrent ())
+    {
+      if (gnamelen == 0 || (STREQN (gname, grent->gr_name, gnamelen)))
+        break;
+    }
+
+  if (grent == 0)
+    {
+      endgrent ();
+      return ((char *)NULL);
+    }
+
+  value = savestring (grent->gr_name);
+  return (value);
+#endif
+}
+
+/* Functions to perform history and alias expansions on the current line. */
+
+#if defined (BANG_HISTORY)
+/* Perform history expansion on the current line.  If no history expansion
+   is done, pre_process_line() returns what it was passed, so we need to
+   allocate a new line here. */
+static char *
+history_expand_line_internal (line)
+     char *line;
+{
+  char *new_line;
+  int old_verify;
+
+  old_verify = hist_verify;
+  hist_verify = 0;
+  new_line = pre_process_line (line, 0, 0);
+  hist_verify = old_verify;
+
+  return (new_line == line) ? savestring (line) : new_line;
+}
+#endif
+
+/* There was an error in expansion.  Let the preprocessor print
+   the error here. */
+static void
+cleanup_expansion_error ()
+{
+  char *to_free;
+#if defined (BANG_HISTORY)
+  int old_verify;
+
+  old_verify = hist_verify;
+  hist_verify = 0;
+#endif
+
+  fprintf (rl_outstream, "\r\n");
+  to_free = pre_process_line (rl_line_buffer, 1, 0);
+#if defined (BANG_HISTORY)
+  hist_verify = old_verify;
+#endif
+  if (to_free != rl_line_buffer)
+    FREE (to_free);
+  putc ('\r', rl_outstream);
+  rl_forced_update_display ();
+}
+
+/* If NEW_LINE differs from what is in the readline line buffer, add an
+   undo record to get from the readline line buffer contents to the new
+   line and make NEW_LINE the current readline line. */
+static void
+maybe_make_readline_line (new_line)
+     char *new_line;
+{
+  if (strcmp (new_line, rl_line_buffer) != 0)
+    {
+      rl_point = rl_end;
+
+      rl_add_undo (UNDO_BEGIN, 0, 0, 0);
+      rl_delete_text (0, rl_point);
+      rl_point = rl_end = rl_mark = 0;
+      rl_insert_text (new_line);
+      rl_add_undo (UNDO_END, 0, 0, 0);
+    }
+}
+
+/* Make NEW_LINE be the current readline line.  This frees NEW_LINE. */
+static void
+set_up_new_line (new_line)
+     char *new_line;
+{
+  int old_point, at_end;
+
+  old_point = rl_point;
+  at_end = rl_point == rl_end;
+
+  /* If the line was history and alias expanded, then make that
+     be one thing to undo. */
+  maybe_make_readline_line (new_line);
+  free (new_line);
+
+  /* Place rl_point where we think it should go. */
+  if (at_end)
+    rl_point = rl_end;
+  else if (old_point < rl_end)
+    {
+      rl_point = old_point;
+      if (!whitespace (rl_line_buffer[rl_point]))
+       rl_forward_word (1, 0);
+    }
+}
+
+#if defined (ALIAS)
+/* Expand aliases in the current readline line. */
+static int
+alias_expand_line (count, ignore)
+     int count, ignore;
+{
+  char *new_line;
+
+  new_line = alias_expand (rl_line_buffer);
+
+  if (new_line)
+    {
+      set_up_new_line (new_line);
+      return (0);
+    }
+  else
+    {
+      cleanup_expansion_error ();
+      return (1);
+    }
+}
+#endif
+
+#if defined (BANG_HISTORY)
+/* History expand the line. */
+static int
+history_expand_line (count, ignore)
+     int count, ignore;
+{
+  char *new_line;
+
+  new_line = history_expand_line_internal (rl_line_buffer);
+
+  if (new_line)
+    {
+      set_up_new_line (new_line);
+      return (0);
+    }
+  else
+    {
+      cleanup_expansion_error ();
+      return (1);
+    }
+}
+
+/* Expand history substitutions in the current line and then insert a
+   space (hopefully close to where we were before). */
+static int
+tcsh_magic_space (count, ignore)
+     int count, ignore;
+{
+  int dist_from_end, old_point;
+
+  old_point = rl_point;
+  dist_from_end = rl_end - rl_point;
+  if (history_expand_line (count, ignore) == 0)
+    {
+      /* Try a simple heuristic from Stephen Gildea <gildea@intouchsys.com>.
+        This works if all expansions were before rl_point or if no expansions
+        were performed. */
+      rl_point = (old_point == 0) ? old_point : rl_end - dist_from_end;
+      rl_insert (1, ' ');
+      return (0);
+    }
+  else
+    return (1);
+}
+#endif /* BANG_HISTORY */
+
+/* History and alias expand the line. */
+static int
+history_and_alias_expand_line (count, ignore)
+     int count, ignore;
+{
+  char *new_line;
+
+  new_line = 0;
+#if defined (BANG_HISTORY)
+  new_line = history_expand_line_internal (rl_line_buffer);
+#endif
+
+#if defined (ALIAS)
+  if (new_line)
+    {
+      char *alias_line;
+
+      alias_line = alias_expand (new_line);
+      free (new_line);
+      new_line = alias_line;
+    }
+#endif /* ALIAS */
+
+  if (new_line)
+    {
+      set_up_new_line (new_line);
+      return (0);
+    }
+  else
+    {
+      cleanup_expansion_error ();
+      return (1);
+    }
+}
+
+/* History and alias expand the line, then perform the shell word
+   expansions by calling expand_string.  This can't use set_up_new_line()
+   because we want the variable expansions as a separate undo'able
+   set of operations. */
+static int
+shell_expand_line (count, ignore)
+     int count, ignore;
+{
+  char *new_line;
+  WORD_LIST *expanded_string;
+
+  new_line = 0;
+#if defined (BANG_HISTORY)
+  new_line = history_expand_line_internal (rl_line_buffer);
+#endif
+
+#if defined (ALIAS)
+  if (new_line)
+    {
+      char *alias_line;
+
+      alias_line = alias_expand (new_line);
+      free (new_line);
+      new_line = alias_line;
+    }
+#endif /* ALIAS */
+
+  if (new_line)
+    {
+      int old_point = rl_point;
+      int at_end = rl_point == rl_end;
+
+      /* If the line was history and alias expanded, then make that
+        be one thing to undo. */
+      maybe_make_readline_line (new_line);
+      free (new_line);
+
+      /* If there is variable expansion to perform, do that as a separate
+        operation to be undone. */
+      new_line = savestring (rl_line_buffer);
+      expanded_string = expand_string (new_line, 0);
+      FREE (new_line);
+      if (expanded_string == 0)
+       {
+         new_line = (char *)xmalloc (1);
+         new_line[0] = '\0';
+       }
+      else
+       {
+         new_line = string_list (expanded_string);
+         dispose_words (expanded_string);
+       }
+
+      maybe_make_readline_line (new_line);
+      free (new_line);
+
+      /* Place rl_point where we think it should go. */
+      if (at_end)
+       rl_point = rl_end;
+      else if (old_point < rl_end)
+       {
+         rl_point = old_point;
+         if (!whitespace (rl_line_buffer[rl_point]))
+           rl_forward_word (1, 0);
+       }
+      return 0;
+    }
+  else
+    {
+      cleanup_expansion_error ();
+      return 1;
+    }
+}
+
+/* If FIGNORE is set, then don't match files with the given suffixes when
+   completing filenames.  If only one of the possibilities has an acceptable
+   suffix, delete the others, else just return and let the completer
+   signal an error.  It is called by the completer when real
+   completions are done on filenames by the completer's internal
+   function, not for completion lists (M-?) and not on "other"
+   completion types, such as hostnames or commands. */
+
+static struct ignorevar fignore =
+{
+  "FIGNORE",
+  (struct ign *)0,
+  0,
+  (char *)0,
+  (sh_iv_item_func_t *) 0,
+};
+
+static void
+_ignore_completion_names (names, name_func)
+     char **names;
+     sh_ignore_func_t *name_func;
+{
+  char **newnames;
+  int idx, nidx;
+  char **oldnames;
+  int oidx;
+
+  /* If there is only one completion, see if it is acceptable.  If it is
+     not, free it up.  In any case, short-circuit and return.  This is a
+     special case because names[0] is not the prefix of the list of names
+     if there is only one completion; it is the completion itself. */
+  if (names[1] == (char *)0)
+    {
+      if (force_fignore)
+       if ((*name_func) (names[0]) == 0)
+         {
+           free (names[0]);
+           names[0] = (char *)NULL;
+         }
+
+      return;
+    }
+
+  /* Allocate space for array to hold list of pointers to matching
+     filenames.  The pointers are copied back to NAMES when done. */
+  for (nidx = 1; names[nidx]; nidx++)
+    ;
+  newnames = strvec_create (nidx + 1);
+
+  if (force_fignore == 0)
+    {
+      oldnames = strvec_create (nidx - 1);
+      oidx = 0;
+    }
+
+  newnames[0] = names[0];
+  for (idx = nidx = 1; names[idx]; idx++)
+    {
+      if ((*name_func) (names[idx]))
+       newnames[nidx++] = names[idx];
+      else if (force_fignore == 0)
+       oldnames[oidx++] = names[idx];
+      else
+       free (names[idx]);
+    }
+
+  newnames[nidx] = (char *)NULL;
+
+  /* If none are acceptable then let the completer handle it. */
+  if (nidx == 1)
+    {
+      if (force_fignore)
+       {
+         free (names[0]);
+         names[0] = (char *)NULL;
+       }
+      else
+       free (oldnames);
+
+      free (newnames);
+      return;
+    }
+
+  if (force_fignore == 0)
+    {
+      while (oidx)
+       free (oldnames[--oidx]);
+      free (oldnames);
+    }
+
+  /* If only one is acceptable, copy it to names[0] and return. */
+  if (nidx == 2)
+    {
+      free (names[0]);
+      names[0] = newnames[1];
+      names[1] = (char *)NULL;
+      free (newnames);
+      return;
+    }
+
+  /* Copy the acceptable names back to NAMES, set the new array end,
+     and return. */
+  for (nidx = 1; newnames[nidx]; nidx++)
+    names[nidx] = newnames[nidx];
+  names[nidx] = (char *)NULL;
+  free (newnames);
+}
+
+static int
+name_is_acceptable (name)
+     const char *name;
+{
+  struct ign *p;
+  int nlen;
+
+  for (nlen = strlen (name), p = fignore.ignores; p->val; p++)
+    {
+      if (nlen > p->len && p->len > 0 && STREQ (p->val, &name[nlen - p->len]))
+       return (0);
+    }
+
+  return (1);
+}
+
+#if 0
+static int
+ignore_dot_names (name)
+     char *name;
+{
+  return (name[0] != '.');
+}
+#endif
+
+static int
+filename_completion_ignore (names)
+     char **names;
+{
+#if 0
+  if (glob_dot_filenames == 0)
+    _ignore_completion_names (names, ignore_dot_names);
+#endif
+
+  setup_ignore_patterns (&fignore);
+
+  if (fignore.num_ignores == 0)
+    return 0;
+
+  _ignore_completion_names (names, name_is_acceptable);
+
+  return 0;
+}
+
+/* Return 1 if NAME is a directory.  NAME undergoes tilde expansion. */
+static int
+test_for_directory (name)
+     const char *name;
+{
+  char *fn;
+  int r;
+
+  fn = bash_tilde_expand (name, 0);
+  r = file_isdir (fn);
+  free (fn);
+
+  return (r);
+}
+
+/* Remove files from NAMES, leaving directories. */
+static int
+bash_ignore_filenames (names)
+     char **names;
+{
+  _ignore_completion_names (names, test_for_directory);
+  return 0;
+}
+
+static int
+return_zero (name)
+     const char *name;
+{
+  return 0;
+}
+
+static int
+bash_ignore_everything (names)
+     char **names;
+{
+  _ignore_completion_names (names, return_zero);
+  return 0;
+}
+
+/* Replace a tilde-prefix in VAL with a `~', assuming the user typed it.  VAL
+   is an expanded filename.  DIRECTORY_PART is the tilde-prefix portion
+   of the un-tilde-expanded version of VAL (what the user typed). */
+static char *
+restore_tilde (val, directory_part)
+     char *val, *directory_part;
+{
+  int l, vl, dl2, xl;
+  char *dh2, *expdir, *ret;
+
+  vl = strlen (val);
+
+  /* We need to duplicate the expansions readline performs on the directory
+     portion before passing it to our completion function. */
+  dh2 = directory_part ? bash_dequote_filename (directory_part, 0) : 0;
+  bash_directory_expansion (&dh2);
+  dl2 = strlen (dh2);
+
+  expdir = bash_tilde_expand (directory_part, 0);
+  xl = strlen (expdir);
+  free (expdir);
+
+  /*
+     dh2 = unexpanded but dequoted tilde-prefix
+     dl2 = length of tilde-prefix
+     expdir = tilde-expanded tilde-prefix
+     xl = length of expanded tilde-prefix
+     l = length of remainder after tilde-prefix
+  */
+  l = (vl - xl) + 1;
+
+  ret = (char *)xmalloc (dl2 + 2 + l);
+  strcpy (ret, dh2);
+  strcpy (ret + dl2, val + xl);
+
+  free (dh2);
+  return (ret);
+}
+
+static char *
+maybe_restore_tilde (val, directory_part)
+     char *val, *directory_part;
+{
+  rl_icppfunc_t *save;
+  char *ret;
+
+  save = (dircomplete_expand == 0) ? save_directory_hook () : (rl_icppfunc_t *)0;
+  ret = restore_tilde (val, directory_part);
+  if (save)
+    restore_directory_hook (save);
+  return ret;
+}
+
+/* Simulate the expansions that will be performed by
+   rl_filename_completion_function.  This must be called with the address of
+   a pointer to malloc'd memory. */
+static void
+bash_directory_expansion (dirname)
+     char **dirname;
+{
+  char *d, *nd;
+
+  d = savestring (*dirname);
+
+  if ((rl_directory_rewrite_hook) && (*rl_directory_rewrite_hook) (&d))
+    {
+      free (*dirname);
+      *dirname = d;
+    }
+  else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&d))
+    {
+      free (*dirname);
+      *dirname = d;
+    }
+  else if (rl_completion_found_quote)
+    {
+      nd = bash_dequote_filename (d, rl_completion_quote_character);
+      free (*dirname);
+      free (d);
+      *dirname = nd;
+    }
+}
+
+/* If necessary, rewrite directory entry */
+static char *
+bash_filename_rewrite_hook (fname, fnlen)
+     char *fname;
+     int fnlen;
+{
+  char *conv;
+
+  conv = fnx_fromfs (fname, fnlen);
+  if (conv != fname)
+    conv = savestring (conv);
+  return conv;
+}
+
+/* Functions to save and restore the appropriate directory hook */
+/* This is not static so the shopt code can call it */
+void
+set_directory_hook ()
+{
+  if (dircomplete_expand)
+    {
+      rl_directory_completion_hook = bash_directory_completion_hook;
+      rl_directory_rewrite_hook = (rl_icppfunc_t *)0;
+    }
+  else
+    {
+      rl_directory_rewrite_hook = bash_directory_completion_hook;
+      rl_directory_completion_hook = (rl_icppfunc_t *)0;
+    }
+}
+
+static rl_icppfunc_t *
+save_directory_hook ()
+{
+  rl_icppfunc_t *ret;
+
+  if (dircomplete_expand)
+    {
+      ret = rl_directory_completion_hook;
+      rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
+    }
+  else
+    {
+      ret = rl_directory_rewrite_hook;
+      rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
+    }
+
+  return ret;
+}
+
+static void
+restore_directory_hook (hookf)
+     rl_icppfunc_t *hookf;
+{
+  if (dircomplete_expand)
+    rl_directory_completion_hook = hookf;
+  else
+    rl_directory_rewrite_hook = hookf;
+}
+
+/* Expand a filename before the readline completion code passes it to stat(2).
+   The filename will already have had tilde expansion performed. */
+static int
+bash_filename_stat_hook (dirname)
+     char **dirname;
+{
+  char *local_dirname, *new_dirname, *t;
+  int should_expand_dirname, return_value;
+  WORD_LIST *wl;
+  struct stat sb;
+
+  local_dirname = *dirname;
+  should_expand_dirname = return_value = 0;
+  if (t = mbschr (local_dirname, '$'))
+    should_expand_dirname = '$';
+  else if (t = mbschr (local_dirname, '`'))    /* XXX */
+    should_expand_dirname = '`';
+
+#if defined (HAVE_LSTAT)
+  if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
+#else
+  if (should_expand_dirname && stat (local_dirname, &sb) == 0)
+#endif
+    should_expand_dirname = 0;
+  
+  if (should_expand_dirname)  
+    {
+      new_dirname = savestring (local_dirname);
+      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB);  /* does the right thing */
+      if (wl)
+       {
+         free (new_dirname);
+         new_dirname = string_list (wl);
+         /* Tell the completer we actually expanded something and change
+            *dirname only if we expanded to something non-null -- stat
+            behaves unpredictably when passed null or empty strings */
+         if (new_dirname && *new_dirname)
+           {
+             free (local_dirname);     /* XXX */
+             local_dirname = *dirname = new_dirname;
+             return_value = STREQ (local_dirname, *dirname) == 0;
+           }
+         else
+           free (new_dirname);
+         dispose_words (wl);
+       }
+      else
+       free (new_dirname);
+    }  
+
+  /* This is very similar to the code in bash_directory_completion_hook below,
+     but without spelling correction and not worrying about whether or not
+     we change relative pathnames. */
+  if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1]))
+    {
+      char *temp1, *temp2;
+
+      t = get_working_directory ("symlink-hook");
+      temp1 = make_absolute (local_dirname, t);
+      free (t);
+      temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
+
+      /* If we can't canonicalize, bail. */
+      if (temp2 == 0)
+       {
+         free (temp1);
+         return return_value;
+       }
+
+      free (local_dirname);
+      *dirname = temp2;
+      free (temp1);
+    }
+
+  return (return_value);
+}
+
+/* Handle symbolic link references and other directory name
+   expansions while hacking completion.  This should return 1 if it modifies
+   the DIRNAME argument, 0 otherwise.  It should make sure not to modify
+   DIRNAME if it returns 0. */
+static int
+bash_directory_completion_hook (dirname)
+     char **dirname;
+{
+  char *local_dirname, *new_dirname, *t;
+  int return_value, should_expand_dirname, nextch, closer;
+  WORD_LIST *wl;
+  struct stat sb;
+
+  return_value = should_expand_dirname = nextch = closer = 0;
+  local_dirname = *dirname;
+
+  if (t = mbschr (local_dirname, '$'))
+    {
+      should_expand_dirname = '$';
+      nextch = t[1];
+      /* Deliberately does not handle the deprecated $[...] arithmetic
+        expansion syntax */
+      if (nextch == '(')
+       closer = ')';
+      else if (nextch == '{')
+       closer = '}';
+      else
+       nextch = 0;
+    }
+  else if (local_dirname[0] == '~')
+    should_expand_dirname = '~';
+  else
+    {
+      t = mbschr (local_dirname, '`');
+      if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
+       should_expand_dirname = '`';
+    }
+
+#if defined (HAVE_LSTAT)
+  if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
+#else
+  if (should_expand_dirname && stat (local_dirname, &sb) == 0)
+#endif
+    should_expand_dirname = 0;
+
+  if (should_expand_dirname)  
+    {
+      new_dirname = savestring (local_dirname);
+      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB);  /* does the right thing */
+      if (wl)
+       {
+         *dirname = string_list (wl);
+         /* Tell the completer to replace the directory name only if we
+            actually expanded something. */
+         return_value = STREQ (local_dirname, *dirname) == 0;
+         free (local_dirname);
+         free (new_dirname);
+         dispose_words (wl);
+         local_dirname = *dirname;
+         /* XXX - change rl_filename_quote_characters here based on
+            should_expand_dirname/nextch/closer.  This is the only place
+            custom_filename_quote_characters is modified. */
+         if (rl_filename_quote_characters && *rl_filename_quote_characters)
+           {
+             int i, j, c;
+             i = strlen (default_filename_quote_characters);
+             custom_filename_quote_characters = xrealloc (custom_filename_quote_characters, i+1);
+             for (i = j = 0; c = default_filename_quote_characters[i]; i++)
+               {
+                 if (c == should_expand_dirname || c == nextch || c == closer)
+                   continue;
+                 custom_filename_quote_characters[j++] = c;
+               }
+             custom_filename_quote_characters[j] = '\0';
+             rl_filename_quote_characters = custom_filename_quote_characters;
+             set_filename_bstab (rl_filename_quote_characters);
+           }
+       }
+      else
+       {
+         free (new_dirname);
+         free (local_dirname);
+         *dirname = (char *)xmalloc (1);
+         **dirname = '\0';
+         return 1;
+       }
+    }
+  else 
+    {
+      /* Dequote the filename even if we don't expand it. */
+      new_dirname = bash_dequote_filename (local_dirname, rl_completion_quote_character);
+      return_value = STREQ (local_dirname, new_dirname) == 0;
+      free (local_dirname);
+      local_dirname = *dirname = new_dirname;
+    }
+
+  /* no_symbolic_links == 0 -> use (default) logical view of the file system.
+     local_dirname[0] == '.' && local_dirname[1] == '/' means files in the
+     current directory (./).
+     local_dirname[0] == '.' && local_dirname[1] == 0 means relative pathnames
+     in the current directory (e.g., lib/sh).
+     XXX - should we do spelling correction on these? */
+
+  /* This is test as it was in bash-4.2: skip relative pathnames in current
+     directory.  Change test to
+      (local_dirname[0] != '.' || (local_dirname[1] && local_dirname[1] != '/'))
+     if we want to skip paths beginning with ./ also. */
+  if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1]))
+    {
+      char *temp1, *temp2;
+      int len1, len2;
+
+      /* If we have a relative path
+               (local_dirname[0] != '/' && local_dirname[0] != '.')
+        that is canonical after appending it to the current directory, then
+               temp1 = temp2+'/'
+        That is,
+               strcmp (temp1, temp2) == 0
+        after adding a slash to temp2 below.  It should be safe to not
+        change those.
+      */
+      t = get_working_directory ("symlink-hook");
+      temp1 = make_absolute (local_dirname, t);
+      free (t);
+      temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
+
+      /* Try spelling correction if initial canonicalization fails.  Make
+        sure we are set to replace the directory name with the results so
+        subsequent directory checks don't fail. */
+      if (temp2 == 0 && dircomplete_spelling && dircomplete_expand)
+       {
+         temp2 = dirspell (temp1);
+         if (temp2)
+           {
+             free (temp1);
+             temp1 = temp2;
+             temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
+             return_value |= temp2 != 0;
+           }
+       }
+      /* If we can't canonicalize, bail. */
+      if (temp2 == 0)
+       {
+         free (temp1);
+         return return_value;
+       }
+      len1 = strlen (temp1);
+      if (temp1[len1 - 1] == '/')
+       {
+         len2 = strlen (temp2);
+         if (len2 > 2)         /* don't append `/' to `/' or `//' */
+           {
+             temp2 = (char *)xrealloc (temp2, len2 + 2);
+             temp2[len2] = '/';
+             temp2[len2 + 1] = '\0';
+           }
+       }
+
+      /* dircomplete_expand_relpath == 0 means we want to leave relative
+        pathnames that are unchanged by canonicalization alone.
+        *local_dirname != '/' && *local_dirname != '.' == relative pathname
+        (consistent with general.c:absolute_pathname())
+        temp1 == temp2 (after appending a slash to temp2) means the pathname
+        is not changed by canonicalization as described above. */
+      if (dircomplete_expand_relpath || ((local_dirname[0] != '/' && local_dirname[0] != '.') && STREQ (temp1, temp2) == 0))
+       return_value |= STREQ (local_dirname, temp2) == 0;
+      free (local_dirname);
+      *dirname = temp2;
+      free (temp1);
+    }
+
+  return (return_value);
+}
+
+static char **history_completion_array = (char **)NULL;
+static int harry_size;
+static int harry_len;
+
+static void
+build_history_completion_array ()
+{
+  register int i, j;
+  HIST_ENTRY **hlist;
+  char **tokens;
+
+  /* First, clear out the current dynamic history completion list. */
+  if (harry_size)
+    {
+      strvec_dispose (history_completion_array);
+      history_completion_array = (char **)NULL;
+      harry_size = 0;
+      harry_len = 0;
+    }
+
+  /* Next, grovel each line of history, making each shell-sized token
+     a separate entry in the history_completion_array. */
+  hlist = history_list ();
+
+  if (hlist)
+    {
+      for (i = 0; hlist[i]; i++)
+       ;
+      for ( --i; i >= 0; i--)
+       {
+         /* Separate each token, and place into an array. */
+         tokens = history_tokenize (hlist[i]->line);
+
+         for (j = 0; tokens && tokens[j]; j++)
+           {
+             if (harry_len + 2 > harry_size)
+               history_completion_array = strvec_resize (history_completion_array, harry_size += 10);
+
+             history_completion_array[harry_len++] = tokens[j];
+             history_completion_array[harry_len] = (char *)NULL;
+           }
+         free (tokens);
+       }
+
+      /* Sort the complete list of tokens. */
+      if (dabbrev_expand_active == 0)
+        qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp);
+    }
+}
+
+static char *
+history_completion_generator (hint_text, state)
+     const char *hint_text;
+     int state;
+{
+  static int local_index, len;
+  static const char *text;
+
+  /* If this is the first call to the generator, then initialize the
+     list of strings to complete over. */
+  if (state == 0)
+    {
+      if (dabbrev_expand_active)       /* This is kind of messy */
+       rl_completion_suppress_append = 1;
+      local_index = 0;
+      build_history_completion_array ();
+      text = hint_text;
+      len = strlen (text);
+    }
+
+  while (history_completion_array && history_completion_array[local_index])
+    {
+      if (strncmp (text, history_completion_array[local_index++], len) == 0)
+       return (savestring (history_completion_array[local_index - 1]));
+    }
+  return ((char *)NULL);
+}
+
+static int
+dynamic_complete_history (count, key)
+     int count, key;
+{
+  int r;
+  rl_compentry_func_t *orig_func;
+  rl_completion_func_t *orig_attempt_func;
+  rl_compignore_func_t *orig_ignore_func;
+
+  orig_func = rl_completion_entry_function;
+  orig_attempt_func = rl_attempted_completion_function;
+  orig_ignore_func = rl_ignore_some_completions_function;
+
+  rl_completion_entry_function = history_completion_generator;
+  rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+  rl_ignore_some_completions_function = filename_completion_ignore;
+
+  /* XXX - use rl_completion_mode here? */
+  if (rl_last_func == dynamic_complete_history)
+    r = rl_complete_internal ('?');
+  else
+    r = rl_complete_internal (TAB);
+
+  rl_completion_entry_function = orig_func;
+  rl_attempted_completion_function = orig_attempt_func;
+  rl_ignore_some_completions_function = orig_ignore_func;
+
+  return r;
+}
+
+static int
+bash_dabbrev_expand (count, key)
+     int count, key;
+{
+  int r, orig_suppress, orig_sort;
+  rl_compentry_func_t *orig_func;
+  rl_completion_func_t *orig_attempt_func;
+  rl_compignore_func_t *orig_ignore_func;
+
+  orig_func = rl_menu_completion_entry_function;
+  orig_attempt_func = rl_attempted_completion_function;
+  orig_ignore_func = rl_ignore_some_completions_function;
+  orig_suppress = rl_completion_suppress_append;
+  orig_sort = rl_sort_completion_matches;
+
+  rl_menu_completion_entry_function = history_completion_generator;
+  rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+  rl_ignore_some_completions_function = filename_completion_ignore;
+  rl_filename_completion_desired = 0;
+  rl_completion_suppress_append = 1;
+  rl_sort_completion_matches = 0;
+
+  /* XXX - use rl_completion_mode here? */
+  dabbrev_expand_active = 1;
+  if (rl_last_func == bash_dabbrev_expand)
+    rl_last_func = rl_menu_complete;
+  r = rl_menu_complete (count, key);
+  dabbrev_expand_active = 0;
+
+  rl_last_func = bash_dabbrev_expand;
+  rl_menu_completion_entry_function = orig_func;
+  rl_attempted_completion_function = orig_attempt_func;
+  rl_ignore_some_completions_function = orig_ignore_func;
+  rl_completion_suppress_append = orig_suppress;
+  rl_sort_completion_matches = orig_sort;
+
+  return r;
+}
+
+#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
+static int
+bash_complete_username (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_username_internal (rl_completion_mode (bash_complete_username));
+}
+
+static int
+bash_possible_username_completions (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_username_internal ('?');
+}
+
+static int
+bash_complete_username_internal (what_to_do)
+     int what_to_do;
+{
+  return bash_specific_completion (what_to_do, rl_username_completion_function);
+}
+
+static int
+bash_complete_filename (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_filename_internal (rl_completion_mode (bash_complete_filename));
+}
+
+static int
+bash_possible_filename_completions (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_filename_internal ('?');
+}
+
+static int
+bash_complete_filename_internal (what_to_do)
+     int what_to_do;
+{
+  rl_compentry_func_t *orig_func;
+  rl_completion_func_t *orig_attempt_func;
+  rl_icppfunc_t *orig_dir_func;
+  rl_compignore_func_t *orig_ignore_func;
+  /*const*/ char *orig_rl_completer_word_break_characters;
+  int r;
+
+  orig_func = rl_completion_entry_function;
+  orig_attempt_func = rl_attempted_completion_function;
+  orig_ignore_func = rl_ignore_some_completions_function;
+  orig_rl_completer_word_break_characters = rl_completer_word_break_characters;
+
+  orig_dir_func = save_directory_hook ();
+
+  rl_completion_entry_function = rl_filename_completion_function;
+  rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+  rl_ignore_some_completions_function = filename_completion_ignore;
+  rl_completer_word_break_characters = " \t\n\"\'";
+
+  r = rl_complete_internal (what_to_do);
+
+  rl_completion_entry_function = orig_func;
+  rl_attempted_completion_function = orig_attempt_func;
+  rl_ignore_some_completions_function = orig_ignore_func;
+  rl_completer_word_break_characters = orig_rl_completer_word_break_characters;
+
+  restore_directory_hook (orig_dir_func);
+
+  return r;
+}
+
+static int
+bash_complete_hostname (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_hostname_internal (rl_completion_mode (bash_complete_hostname));
+}
+
+static int
+bash_possible_hostname_completions (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_hostname_internal ('?');
+}
+
+static int
+bash_complete_variable (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_variable_internal (rl_completion_mode (bash_complete_variable));
+}
+
+static int
+bash_possible_variable_completions (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_variable_internal ('?');
+}
+
+static int
+bash_complete_command (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_command_internal (rl_completion_mode (bash_complete_command));
+}
+
+static int
+bash_possible_command_completions (ignore, ignore2)
+     int ignore, ignore2;
+{
+  return bash_complete_command_internal ('?');
+}
+
+static int
+bash_complete_hostname_internal (what_to_do)
+     int what_to_do;
+{
+  return bash_specific_completion (what_to_do, hostname_completion_function);
+}
+
+static int
+bash_complete_variable_internal (what_to_do)
+     int what_to_do;
+{
+  return bash_specific_completion (what_to_do, variable_completion_function);
+}
+
+static int
+bash_complete_command_internal (what_to_do)
+     int what_to_do;
+{
+  return bash_specific_completion (what_to_do, command_word_completion_function);
+}
+
+static char *globtext;
+static char *globorig;
+
+static char *
+glob_complete_word (text, state)
+     const char *text;
+     int state;
+{
+  static char **matches = (char **)NULL;
+  static int ind;
+  int glen;
+  char *ret, *ttext;
+
+  if (state == 0)
+    {
+      rl_filename_completion_desired = 1;
+      FREE (matches);
+      if (globorig != globtext)
+       FREE (globorig);
+      FREE (globtext);
+
+      ttext = bash_tilde_expand (text, 0);
+
+      if (rl_explicit_arg)
+       {
+         globorig = savestring (ttext);
+         glen = strlen (ttext);
+         globtext = (char *)xmalloc (glen + 2);
+         strcpy (globtext, ttext);
+         globtext[glen] = '*';
+         globtext[glen+1] = '\0';
+       }
+      else
+        globtext = globorig = savestring (ttext);
+
+      if (ttext != text)
+       free (ttext);
+
+      matches = shell_glob_filename (globtext);
+      if (GLOB_FAILED (matches))
+       matches = (char **)NULL;
+      ind = 0;
+    }
+
+  ret = matches ? matches[ind] : (char *)NULL;
+  ind++;
+  return ret;
+}
+
+static int
+bash_glob_completion_internal (what_to_do)
+     int what_to_do;
+{
+  return bash_specific_completion (what_to_do, glob_complete_word);
+}
+
+/* A special quoting function so we don't end up quoting globbing characters
+   in the word if there are no matches or multiple matches. */
+static char *
+bash_glob_quote_filename (s, rtype, qcp)
+     char *s;
+     int rtype;
+     char *qcp;
+{
+  if (globorig && qcp && *qcp == '\0' && STREQ (s, globorig))
+    return (savestring (s));
+  else
+    return (bash_quote_filename (s, rtype, qcp));
+}
+
+static int
+bash_glob_complete_word (count, key)
+     int count, key;
+{
+  int r;
+  rl_quote_func_t *orig_quoting_function;
+
+  if (rl_editing_mode == EMACS_EDITING_MODE)
+    rl_explicit_arg = 1;       /* force `*' append */
+  orig_quoting_function = rl_filename_quoting_function;
+  rl_filename_quoting_function = bash_glob_quote_filename;
+  
+  r = bash_glob_completion_internal (rl_completion_mode (bash_glob_complete_word));
+
+  rl_filename_quoting_function = orig_quoting_function;
+  return r;
+}
+
+static int
+bash_glob_expand_word (count, key)
+     int count, key;
+{
+  return bash_glob_completion_internal ('*');
+}
+
+static int
+bash_glob_list_expansions (count, key)
+     int count, key;
+{
+  return bash_glob_completion_internal ('?');
+}
+
+static int
+bash_specific_completion (what_to_do, generator)
+     int what_to_do;
+     rl_compentry_func_t *generator;
+{
+  rl_compentry_func_t *orig_func;
+  rl_completion_func_t *orig_attempt_func;
+  rl_compignore_func_t *orig_ignore_func;
+  int r;
+
+  orig_func = rl_completion_entry_function;
+  orig_attempt_func = rl_attempted_completion_function;
+  orig_ignore_func = rl_ignore_some_completions_function;
+  rl_completion_entry_function = generator;
+  rl_attempted_completion_function = NULL;
+  rl_ignore_some_completions_function = orig_ignore_func;
+
+  r = rl_complete_internal (what_to_do);
+
+  rl_completion_entry_function = orig_func;
+  rl_attempted_completion_function = orig_attempt_func;
+  rl_ignore_some_completions_function = orig_ignore_func;
+
+  return r;
+}
+
+#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
+
+#if defined (VI_MODE)
+/* Completion, from vi mode's point of view.  This is a modified version of
+   rl_vi_complete which uses the bash globbing code to implement what POSIX
+   specifies, which is to append a `*' and attempt filename generation (which
+   has the side effect of expanding any globbing characters in the word). */
+static int
+bash_vi_complete (count, key)
+     int count, key;
+{
+#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
+  int p, r;
+  char *t;
+
+  if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point])))
+    {
+      if (!whitespace (rl_line_buffer[rl_point + 1]))
+       rl_vi_end_word (1, 'E');
+      rl_point++;
+    }
+
+  /* Find boundaries of current word, according to vi definition of a
+     `bigword'. */
+  t = 0;
+  if (rl_point > 0)
+    {
+      p = rl_point;
+      rl_vi_bWord (1, 'B');
+      r = rl_point;
+      rl_point = p;
+      p = r;
+
+      t = substring (rl_line_buffer, p, rl_point);
+    }      
+
+  if (t && glob_pattern_p (t) == 0)
+    rl_explicit_arg = 1;       /* XXX - force glob_complete_word to append `*' */
+  FREE (t);
+
+  if (key == '*')      /* Expansion and replacement. */
+    r = bash_glob_expand_word (count, key);
+  else if (key == '=') /* List possible completions. */
+    r = bash_glob_list_expansions (count, key);
+  else if (key == '\\')        /* Standard completion */
+    r = bash_glob_complete_word (count, key);
+  else
+    r = rl_complete (0, key);
+
+  if (key == '*' || key == '\\')
+    rl_vi_start_inserting (key, 1, 1);
+
+  return (r);
+#else
+  return rl_vi_complete (count, key);
+#endif /* !SPECIFIC_COMPLETION_FUNCTIONS */
+}
+#endif /* VI_MODE */
+
+/* Filename quoting for completion. */
+/* A function to strip unquoted quote characters (single quotes, double
+   quotes, and backslashes).  It allows single quotes to appear
+   within double quotes, and vice versa.  It should be smarter. */
+static char *
+bash_dequote_filename (text, quote_char)
+     char *text;
+     int quote_char;
+{
+  char *ret, *p, *r;
+  int l, quoted;
+
+  l = strlen (text);
+  ret = (char *)xmalloc (l + 1);
+  for (quoted = quote_char, p = text, r = ret; p && *p; p++)
+    {
+      /* Allow backslash-escaped characters to pass through unscathed. */
+      if (*p == '\\')
+       {
+         /* Backslashes are preserved within single quotes. */
+         if (quoted == '\'')
+           *r++ = *p;
+         /* Backslashes are preserved within double quotes unless the
+            character is one that is defined to be escaped */
+         else if (quoted == '"' && ((sh_syntaxtab[p[1]] & CBSDQUOTE) == 0))
+           *r++ = *p;
+
+         *r++ = *++p;
+         if (*p == '\0')
+           return ret;         /* XXX - was break; */
+         continue;
+       }
+      /* Close quote. */
+      if (quoted && *p == quoted)
+       {
+         quoted = 0;
+         continue;
+       }
+      /* Open quote. */
+      if (quoted == 0 && (*p == '\'' || *p == '"'))
+       {
+         quoted = *p;
+         continue;
+       }
+      *r++ = *p;
+    }
+  *r = '\0';
+  return ret;
+}
+
+/* Quote characters that the readline completion code would treat as
+   word break characters with backslashes.  Pass backslash-quoted
+   characters through without examination. */
+static char *
+quote_word_break_chars (text)
+     char *text;
+{
+  char *ret, *r, *s;
+  int l;
+
+  l = strlen (text);
+  ret = (char *)xmalloc ((2 * l) + 1);
+  for (s = text, r = ret; *s; s++)
+    {
+      /* Pass backslash-quoted characters through, including the backslash. */
+      if (*s == '\\')
+       {
+         *r++ = '\\';
+         *r++ = *++s;
+         if (*s == '\0')
+           break;
+         continue;
+       }
+      /* OK, we have an unquoted character.  Check its presence in
+        rl_completer_word_break_characters. */
+      if (mbschr (rl_completer_word_break_characters, *s))
+       *r++ = '\\';
+      /* XXX -- check for standalone tildes here and backslash-quote them */
+      if (s == text && *s == '~' && file_exists (text))
+        *r++ = '\\';
+      *r++ = *s;
+    }
+  *r = '\0';
+  return ret;
+}
+
+/* Use characters in STRING to populate the table of characters that should
+   be backslash-quoted.  The table will be used for sh_backslash_quote from
+   this file. */
+static void
+set_filename_bstab (string)
+     const char *string;
+{
+  const char *s;
+
+  memset (filename_bstab, 0, sizeof (filename_bstab));
+  for (s = string; s && *s; s++)
+    filename_bstab[*s] = 1;
+}
+
+/* Quote a filename using double quotes, single quotes, or backslashes
+   depending on the value of completion_quoting_style.  If we're
+   completing using backslashes, we need to quote some additional
+   characters (those that readline treats as word breaks), so we call
+   quote_word_break_chars on the result.  This returns newly-allocated
+   memory. */
+static char *
+bash_quote_filename (s, rtype, qcp)
+     char *s;
+     int rtype;
+     char *qcp;
+{
+  char *rtext, *mtext, *ret;
+  int rlen, cs;
+
+  rtext = (char *)NULL;
+
+  /* If RTYPE == MULT_MATCH, it means that there is
+     more than one match.  In this case, we do not add
+     the closing quote or attempt to perform tilde
+     expansion.  If RTYPE == SINGLE_MATCH, we try
+     to perform tilde expansion, because single and double
+     quotes inhibit tilde expansion by the shell. */
+
+  cs = completion_quoting_style;
+  /* Might need to modify the default completion style based on *qcp,
+     since it's set to any user-provided opening quote.  We also change
+     to single-quoting if there is no user-provided opening quote and
+     the word being completed contains newlines, since those are not
+     quoted correctly using backslashes (a backslash-newline pair is
+     special to the shell parser). */
+  if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && mbschr (s, '\n'))
+    cs = COMPLETE_SQUOTE;
+  else if (*qcp == '"')
+    cs = COMPLETE_DQUOTE;
+  else if (*qcp == '\'')
+    cs = COMPLETE_SQUOTE;
+#if defined (BANG_HISTORY)
+  else if (*qcp == '\0' && history_expansion && cs == COMPLETE_DQUOTE &&
+          history_expansion_inhibited == 0 && mbschr (s, '!'))
+    cs = COMPLETE_BSQUOTE;
+
+  if (*qcp == '"' && history_expansion && cs == COMPLETE_DQUOTE &&
+       history_expansion_inhibited == 0 && mbschr (s, '!'))
+    {
+      cs = COMPLETE_BSQUOTE;
+      *qcp = '\0';
+    }
+#endif
+
+  /* Don't tilde-expand backslash-quoted filenames, since only single and
+     double quotes inhibit tilde expansion. */
+  mtext = s;
+  if (mtext[0] == '~' && rtype == SINGLE_MATCH && cs != COMPLETE_BSQUOTE)
+    mtext = bash_tilde_expand (s, 0);
+
+  switch (cs)
+    {
+    case COMPLETE_DQUOTE:
+      rtext = sh_double_quote (mtext);
+      break;
+    case COMPLETE_SQUOTE:
+      rtext = sh_single_quote (mtext);
+      break;
+    case COMPLETE_BSQUOTE:
+      rtext = sh_backslash_quote (mtext, complete_fullquote ? 0 : filename_bstab, 0);
+      break;
+    }
+
+  if (mtext != s)
+    free (mtext);
+
+  /* We may need to quote additional characters: those that readline treats
+     as word breaks that are not quoted by backslash_quote. */
+  if (rtext && cs == COMPLETE_BSQUOTE)
+    {
+      mtext = quote_word_break_chars (rtext);
+      free (rtext);
+      rtext = mtext;
+    }
+
+  /* Leave the opening quote intact.  The readline completion code takes
+     care of avoiding doubled opening quotes. */
+  if (rtext)
+    {
+      rlen = strlen (rtext);
+      ret = (char *)xmalloc (rlen + 1);
+      strcpy (ret, rtext);
+    }
+  else
+    {
+      ret = (char *)xmalloc (rlen = 1);
+      ret[0] = '\0';
+    }
+
+  /* If there are multiple matches, cut off the closing quote. */
+  if (rtype == MULT_MATCH && cs != COMPLETE_BSQUOTE)
+    ret[rlen - 1] = '\0';
+  free (rtext);
+  return ret;
+}
+
+/* Support for binding readline key sequences to Unix commands. */
+static Keymap cmd_xmap;
+
+#ifdef _MINIX
+static void
+#else
+static int
+#endif
+putx(c)
+     int c;
+{
+  int x;
+  x = putc (c, rl_outstream);
+#ifndef _MINIX
+  return x;
+#endif
+}
+  
+static int
+bash_execute_unix_command (count, key)
+     int count;        /* ignored */
+     int key;
+{
+  Keymap ckmap;                /* current keymap */
+  Keymap xkmap;                /* unix command executing keymap */
+  rl_command_func_t *func;
+  int type;
+  register int i, r;
+  intmax_t mi;
+  sh_parser_state_t ps;
+  char *cmd, *value, *l, *l1, *ce;
+  SHELL_VAR *v;
+  char ibuf[INT_STRLEN_BOUND(int) + 1];
+
+  /* First, we need to find the right command to execute.  This is tricky,
+     because we might have already indirected into another keymap, so we
+     have to walk cmd_xmap using the entire key sequence. */
+  cmd = (char *)rl_function_of_keyseq (rl_executing_keyseq, cmd_xmap, &type);
+    
+  if (cmd == 0 || type != ISMACR)
+    {
+      rl_crlf ();
+      internal_error (_("bash_execute_unix_command: cannot find keymap for command"));
+      rl_forced_update_display ();
+      return 1;
+    }
+
+  ce = rl_get_termcap ("ce");
+  if (ce)      /* clear current line */
+    {
+      fprintf (rl_outstream, "\r");
+      tputs (ce, 1, putx);
+      fflush (rl_outstream);
+    }
+  else
+    rl_crlf ();        /* move to a new line */
+
+  v = bind_variable ("READLINE_LINE", rl_line_buffer, 0);
+  if (v)
+    VSETATTR (v, att_exported);
+  l = v ? value_cell (v) : 0;
+  value = inttostr (rl_point, ibuf, sizeof (ibuf));
+  v = bind_int_variable ("READLINE_POINT", value);
+  if (v)
+    VSETATTR (v, att_exported);
+  array_needs_making = 1;
+
+  save_parser_state (&ps);
+  r = parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST|SEVAL_NOFREE);
+  restore_parser_state (&ps);
+
+  v = find_variable ("READLINE_LINE");
+  l1 = v ? value_cell (v) : 0;
+  if (l1 != l)
+    maybe_make_readline_line (value_cell (v));
+  v = find_variable ("READLINE_POINT");
+  if (v && legal_number (value_cell (v), &mi))
+    {
+      i = mi;
+      if (i != rl_point)
+       {
+         rl_point = i;
+         if (rl_point > rl_end)
+           rl_point = rl_end;
+         else if (rl_point < 0)
+           rl_point = 0;
+       }
+    }      
+
+  unbind_variable ("READLINE_LINE");
+  unbind_variable ("READLINE_POINT");
+  array_needs_making = 1;
+
+  /* and restore the readline buffer and display after command execution. */
+  rl_forced_update_display ();
+  return 0;
+}
+
+int
+print_unix_command_map ()
+{
+  Keymap save;
+
+  save = rl_get_keymap ();
+  rl_set_keymap (cmd_xmap);
+  rl_macro_dumper (1);
+  rl_set_keymap (save);
+  return 0;
+}
+
+static void
+init_unix_command_map ()
+{
+  cmd_xmap = rl_make_bare_keymap ();
+}
+
+static int
+isolate_sequence (string, ind, need_dquote, startp)
+     char *string;
+     int ind, need_dquote, *startp;
+{
+  register int i;
+  int c, passc, delim;
+
+  for (i = ind; string[i] && whitespace (string[i]); i++)
+    ;
+  /* NEED_DQUOTE means that the first non-white character *must* be `"'. */
+  if (need_dquote && string[i] != '"')
+    {
+      builtin_error (_("%s: first non-whitespace character is not `\"'"), string);
+      return -1;
+    }
+
+  /* We can have delimited strings even if NEED_DQUOTE == 0, like the command
+     string to bind the key sequence to. */
+  delim = (string[i] == '"' || string[i] == '\'') ? string[i] : 0;
+    
+  if (startp)
+    *startp = delim ? ++i : i;
+
+  for (passc = 0; c = string[i]; i++)
+    {
+      if (passc)
+       {
+         passc = 0;
+         continue;
+       }
+      if (c == '\\')
+       {
+         passc++;
+         continue;
+       }
+      if (c == delim)
+       break;
+    }
+
+  if (delim && string[i] != delim)
+    {
+      builtin_error (_("no closing `%c' in %s"), delim, string);
+      return -1;
+    }
+
+  return i;
+}
+
+int
+bind_keyseq_to_unix_command (line)
+     char *line;
+{
+  Keymap kmap;
+  char *kseq, *value;
+  int i, kstart;
+
+  if (cmd_xmap == 0)
+    init_unix_command_map ();
+
+  kmap = rl_get_keymap ();
+
+  /* We duplicate some of the work done by rl_parse_and_bind here, but
+     this code only has to handle `"keyseq": ["]command["]' and can
+     generate an error for anything else. */
+  i = isolate_sequence (line, 0, 1, &kstart);
+  if (i < 0)
+    return -1;
+
+  /* Create the key sequence string to pass to rl_generic_bind */
+  kseq = substring (line, kstart, i);
+
+  for ( ; line[i] && line[i] != ':'; i++)
+    ;
+  if (line[i] != ':')
+    {
+      builtin_error (_("%s: missing colon separator"), line);
+      FREE (kseq);
+      return -1;
+    }
+
+  i = isolate_sequence (line, i + 1, 0, &kstart);
+  if (i < 0)
+    {
+      FREE (kseq);
+      return -1;
+    }
+
+  /* Create the value string containing the command to execute. */
+  value = substring (line, kstart, i);
+
+  /* Save the command to execute and the key sequence in the CMD_XMAP */
+  rl_generic_bind (ISMACR, kseq, value, cmd_xmap);
+
+  /* and bind the key sequence in the current keymap to a function that
+     understands how to execute from CMD_XMAP */
+  rl_bind_keyseq_in_map (kseq, bash_execute_unix_command, kmap);
+
+  free (kseq);  
+  return 0;
+}
+
+/* Used by the programmable completion code.  Complete TEXT as a filename,
+   but return only directories as matches.  Dequotes the filename before
+   attempting to find matches. */
+char **
+bash_directory_completion_matches (text)
+     const char *text;
+{
+  char **m1;
+  char *dfn;
+  int qc;
+
+  qc = rl_dispatching ? rl_completion_quote_character : 0;  
+  dfn = bash_dequote_filename ((char *)text, qc);
+  m1 = rl_completion_matches (dfn, rl_filename_completion_function);
+  free (dfn);
+
+  if (m1 == 0 || m1[0] == 0)
+    return m1;
+  /* We don't bother recomputing the lcd of the matches, because it will just
+     get thrown away by the programmable completion code and recomputed
+     later. */
+  (void)bash_ignore_filenames (m1);
+  return m1;
+}
+
+char *
+bash_dequote_text (text)
+     const char *text;
+{
+  char *dtxt;
+  int qc;
+
+  qc = (text[0] == '"' || text[0] == '\'') ? text[0] : 0;
+  dtxt = bash_dequote_filename ((char *)text, qc);
+  return (dtxt);
+}
+
+/* This event hook is designed to be called after readline receives a signal
+   that interrupts read(2).  It gives reasonable responsiveness to interrupts
+   and fatal signals without executing too much code in a signal handler
+   context. */
+static int
+bash_event_hook ()
+{
+  /* If we're going to longjmp to top_level, make sure we clean up readline.
+     check_signals will call QUIT, which will eventually longjmp to top_level,
+     calling run_interrupt_trap along the way. */
+  if (interrupt_state)
+    rl_cleanup_after_signal ();
+  bashline_reset_event_hook ();
+  check_signals_and_traps ();  /* XXX */
+  return 0;
+}
+
+#endif /* READLINE */
diff --git a/cross-build/cygwin32.cache.old b/cross-build/cygwin32.cache.old
new file mode 100644 (file)
index 0000000..640390f
--- /dev/null
@@ -0,0 +1,42 @@
+# This file is a shell script that caches the results of configure
+# tests for CYGWIN32 so they don't need to be done when cross-compiling.
+
+# AC_FUNC_GETPGRP should also define GETPGRP_VOID
+ac_cv_func_getpgrp_void=${ac_cv_func_getpgrp_void='yes'}
+# AC_FUNC_SETVBUF_REVERSED should not define anything else
+ac_cv_func_setvbuf_reversed=${ac_cv_func_setvbuf_reversed='no'}
+# on CYGWIN32, system calls do not restart
+ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
+bash_cv_sys_restartable_syscalls=${bash_cv_sys_restartable_syscalls='no'}
+
+# these may be necessary, but they are currently commented out
+#ac_cv_c_bigendian=${ac_cv_c_bigendian='no'}
+ac_cv_sizeof_char_p=${ac_cv_sizeof_char_p='4'}
+ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
+ac_cv_sizeof_long=${ac_cv_sizeof_long='4'}
+ac_cv_sizeof_double=${ac_cv_sizeof_double='8'}
+
+bash_cv_dup2_broken=${bash_cv_dup2_broken='no'}
+bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe='no'}
+bash_cv_type_rlimit=${bash_cv_type_rlimit='long'}
+bash_cv_decl_under_sys_siglist=${bash_cv_decl_under_sys_siglist='no'}
+bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist='no'}
+bash_cv_sys_siglist=${bash_cv_sys_siglist='no'}
+bash_cv_opendir_not_robust=${bash_cv_opendir_not_robust='no'}
+bash_cv_getenv_redef=${bash_cv_getenv_redef='yes'}
+bash_cv_printf_declared=${bash_cv_printf_declared='yes'}
+bash_cv_ulimit_maxfds=${bash_cv_ulimit_maxfds='no'}
+bash_cv_getcwd_calls_popen=${bash_cv_getcwd_calls_popen='no'}
+bash_cv_must_reinstall_sighandlers=${bash_cv_must_reinstall_sighandlers='no'}
+bash_cv_job_control_missing=${bash_cv_job_control_missing='present'}
+bash_cv_sys_named_pipes=${bash_cv_sys_named_pipes='missing'}
+bash_cv_func_sigsetjmp=${bash_cv_func_sigsetjmp='missing'}
+bash_cv_mail_dir=${bash_cv_mail_dir='unknown'}
+bash_cv_func_strcoll_broken=${bash_cv_func_strcoll_broken='no'}
+
+bash_cv_type_int32_t=${bash_cv_type_int32_t='int'}
+bash_cv_type_u_int32_t=${bash_cv_type_u_int32_t='int'}
+
+ac_cv_type_bits64_t=${ac_cv_type_bits64_t='no'}
+
+# end of cross-build/cygwin32.cache
diff --git a/doc/FAQ.orig b/doc/FAQ.orig
new file mode 100644 (file)
index 0000000..1cff3c8
--- /dev/null
@@ -0,0 +1,1745 @@
+This is the Bash FAQ, version 3.24, for Bash version 2.05b.
+
+This document contains a set of frequently-asked questions concerning
+Bash, the GNU Bourne-Again Shell.  Bash is a freely-available command
+interpreter with advanced features for both interactive use and shell
+programming.
+
+Another good source of basic information about shells is the collection
+of FAQ articles periodically posted to comp.unix.shell.
+
+Questions and comments concerning this document should be sent to
+chet@po.cwru.edu.
+
+This document is available for anonymous FTP with the URL
+
+ftp://ftp.cwru.edu/pub/bash/FAQ
+
+The Bash home page is http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html
+
+----------
+Contents:
+
+Section A:  The Basics
+
+A1) What is it?
+A2) What's the latest version?
+A3) Where can I get it?
+A4) On what machines will bash run?
+A5) Will bash run on operating systems other than Unix?
+A6) How can I build bash with gcc?
+A7) How can I make bash my login shell?
+A8) I just changed my login shell to bash, and now I can't FTP into my
+    machine.  Why not?
+A9) What's the `POSIX 1003.2 standard'?
+A10) What is the bash `posix mode'?
+
+Section B:  The latest version
+
+B1) What's new in version 2.05b?
+B2) Are there any user-visible incompatibilities between bash-2.05b and
+    bash-1.14.7?
+
+Section C:  Differences from other Unix shells
+
+C1) How does bash differ from sh, the Bourne shell?
+C2) How does bash differ from the Korn shell, version ksh88?
+C3) Which new features in ksh-93 are not in bash, and which are?
+
+Section D:  Why does bash do some things differently than other Unix shells?
+
+D1) Why does bash run a different version of `command' than
+    `which command' says it will?
+D2) Why doesn't bash treat brace expansions exactly like csh?
+D3) Why doesn't bash have csh variable modifiers?
+D4) How can I make my csh aliases work when I convert to bash?
+D5) How can I pipe standard output and standard error from one command to
+    another, like csh does with `|&'?
+D6) Now that I've converted from ksh to bash, are there equivalents to
+    ksh features like autoloaded functions and the `whence' command?
+
+Section E:  Why does bash do certain things the way it does?
+
+E1) Why is the bash builtin `test' slightly different from /bin/test?
+E2) Why does bash sometimes say `Broken pipe'?
+E3) When I have terminal escape sequences in my prompt, why does bash
+    wrap lines at the wrong column?
+E4) If I pipe the output of a command into `read variable', why doesn't
+    the output show up in $variable when the read command finishes?
+E5) I have a bunch of shell scripts that use backslash-escaped characters
+    in arguments to `echo'.  Bash doesn't interpret these characters.  Why
+    not, and how can I make it understand them?
+E6) Why doesn't a while or for loop get suspended when I type ^Z?
+E7) What about empty for loops in Makefiles?
+E8) Why does the arithmetic evaluation code complain about `08'?
+E9) Why does the pattern matching expression [A-Z]* match files beginning
+    with every letter except `z'?
+E10) Why does `cd //' leave $PWD as `//'?
+E11) If I resize my xterm while another program is running, why doesn't bash
+     notice the change?
+
+Section F:  Things to watch out for on certain Unix versions
+
+F1) Why can't I use command line editing in my `cmdtool'?
+F2) I built bash on Solaris 2.  Why do globbing expansions and filename
+    completion chop off the first few characters of each filename?
+F3) Why does bash dump core after I interrupt username completion or
+    `~user' tilde expansion on a machine running NIS?
+F4) I'm running SVR4.2.  Why is the line erased every time I type `@'?
+F5) Why does bash report syntax errors when my C News scripts use a
+    redirection before a subshell command?
+F6) Why can't I use vi-mode editing on Red Hat Linux 6.1?
+F7) Why do bash-2.05a and  bash-2.05b fail to compile `printf.def' on
+    HP/UX 11.x?
+
+Section G:  How can I get bash to do certain common things?
+
+G1) How can I get bash to read and display eight-bit characters?
+G2) How do I write a function `x' to replace builtin command `x', but
+    still invoke the command from within the function?
+G3) How can I find the value of a shell variable whose name is the value
+    of another shell variable?
+G4) How can I make the bash `time' reserved word print timing output that
+    looks like the output from my system's /usr/bin/time?
+G5) How do I get the current directory into my prompt?
+G6) How can I rename "*.foo" to "*.bar"?
+G7) How can I translate a filename from uppercase to lowercase?
+G8) How can I write a filename expansion (globbing) pattern that will match
+    all files in the current directory except "." and ".."?
+
+Section H:  Where do I go from here?
+
+H1) How do I report bugs in bash, and where should I look for fixes and
+    advice?
+H2) What kind of bash documentation is there?
+H3) What's coming in future versions?
+H4) What's on the bash `wish list'?
+H5) When will the next release appear?
+
+----------
+Section A:  The Basics
+
+A1)  What is it?
+
+Bash is a Unix command interpreter (shell).  It is an implementation of
+the Posix 1003.2 shell standard, and resembles the Korn and System V
+shells.
+
+Bash contains a number of enhancements over those shells, both
+for interactive use and shell programming.  Features geared
+toward interactive use include command line editing, command
+history, job control, aliases, and prompt expansion.  Programming
+features include additional variable expansions, shell
+arithmetic, and a number of variables and options to control
+shell behavior.
+
+Bash was originally written by Brian Fox of the Free Software
+Foundation.  The current developer and maintainer is Chet Ramey
+of Case Western Reserve University.
+
+A2)  What's the latest version?
+
+The latest version is 2.05b, first made available on Wednesday, 17
+July, 2002.
+
+A3)  Where can I get it?
+
+Bash is the GNU project's shell, and so is available from the
+master GNU archive site, ftp.gnu.org, and its mirrors.  The
+latest version is also available for FTP from ftp.cwru.edu.
+The following URLs tell how to get version 2.05b:
+
+ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-2.05b.tar.gz
+
+Formatted versions of the documentation are available with the URLs:
+
+ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-2.05b.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-doc-2.05b.tar.gz
+
+A4)  On what machines will bash run?
+
+Bash has been ported to nearly every version of UNIX.  All you
+should have to do to build it on a machine for which a port
+exists is to type `configure' and then `make'.  The build process
+will attempt to discover the version of UNIX you have and tailor
+itself accordingly, using a script created by GNU autoconf.
+
+More information appears in the file `INSTALL' in the distribution.
+
+The Bash web page (http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html)
+explains how to obtain binary versions of bash for most of the major
+commercial Unix systems.
+
+A5) Will bash run on operating systems other than Unix?
+
+Configuration specifics for Unix-like systems such as QNX and
+LynxOS are included in the distribution.  Bash-2.05 and later
+versions should compile and run on Minix 2.0 (patches were
+contributed), but I don't believe anyone has built bash-2.x on
+earlier Minix versions yet. 
+
+Bash has been ported to versions of Windows implementing the Win32
+programming interface.  This includes Windows 95 and Windows NT.
+The port was done by Cygnus Solutions as part of their CYGWIN
+project.  For more information about the project, look at the URLs
+
+http://www.cygwin.com/
+http://sourceware.cygnus.com/cygwin
+
+Cygnus originally ported bash-1.14.7, and that port was part of their
+early GNU-Win32 (the original name) releases.  Cygnus has also done a
+port of bash-2.05 to the CYGWIN environment, and it is available as
+part of their current release.
+
+Bash-2.05b should require no local Cygnus changes to build and run under
+CYGWIN.
+
+The Cygnus port works only on Intel machines.  There is a port of bash
+(I don't know which version) to the alpha/NT environment available from
+
+ftp://ftp.gnustep.org//pub/win32/bash-alpha-nt-1.01.tar.gz
+
+DJ Delorie has a port of bash-2.x which runs under MS-DOS, as part
+of the DJGPP project.  For more information on the project, see
+
+http://www.delorie.com/djgpp/
+
+I have been told that the original DJGPP port was done by Daisuke Aoyama.
+
+Mark Elbrecht <snowball3@bigfoot.com> has sent me notice that bash-2.04
+is available for DJGPP V2.  The files are available as:
+
+ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh204b.zip binary
+ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh204d.zip documentation
+ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh204s.zip source
+
+Mark has begun to work with bash-2.05, but I don't know the status.
+
+Ports of bash-1.12 and bash-2.0 are available for OS/2 from
+
+ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash_112.zip
+ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash-2.0(253).zip
+
+I haven't looked at either, but the second appears to be a binary-only
+distribution.  Beware.
+
+I have received word that Bash (I'm not sure which version, but I
+believe that it's at least bash-2.02.1) is the standard shell on
+BeOS.
+
+A6) How can I build bash with gcc? 
+
+Bash configures to use gcc by default if it is available.  Read the
+file INSTALL in the distribution for more information.
+
+A7)  How can I make bash my login shell?
+
+Some machines let you use `chsh' to change your login shell.  Other
+systems use `passwd -s' or `passwd -e'.  If one of these works for
+you, that's all you need.  Note that many systems require the full
+pathname to a shell to appear in /etc/shells before you can make it
+your login shell.  For this, you may need the assistance of your
+friendly local system administrator. 
+
+If you cannot do this, you can still use bash as your login shell, but
+you need to perform some tricks.  The basic idea is to add a command
+to your login shell's startup file to replace your login shell with
+bash.
+
+For example, if your login shell is csh or tcsh, and you have installed
+bash in /usr/gnu/bin/bash, add the following line to ~/.login:
+
+       if ( -f /usr/gnu/bin/bash ) exec /usr/gnu/bin/bash --login
+
+(the `--login' tells bash that it is a login shell).
+
+It's not a good idea to put this command into ~/.cshrc, because every
+csh you run without the `-f' option, even ones started to run csh scripts,
+reads that file.  If you must put the command in ~/.cshrc, use something
+like
+
+       if ( $?prompt ) exec /usr/gnu/bin/bash --login
+
+to ensure that bash is exec'd only when the csh is interactive.
+
+If your login shell is sh or ksh, you have to do two things.
+
+First, create an empty file in your home directory named `.bash_profile'.
+The existence of this file will prevent the exec'd bash from trying to
+read ~/.profile, and re-execing itself over and over again.  ~/.bash_profile
+is the first file bash tries to read initialization commands from when
+it is invoked as a login shell.
+
+Next, add a line similar to the above to ~/.profile:
+
+       [ -f /usr/gnu/bin/bash ] && [ -x /usr/gnu/bin/bash ] && \
+               exec /usr/gnu/bin/bash --login
+
+This will cause login shells to replace themselves with bash running as
+a login shell.  Once you have this working, you can copy your initialization
+code from ~/.profile to ~/.bash_profile.
+
+I have received word that the recipe supplied above is insufficient for
+machines running CDE.  CDE has a maze of twisty little startup files, all
+slightly different.
+
+If you cannot change your login shell in the password file to bash, you
+will have to (apparently) live with CDE using the shell in the password
+file to run its startup scripts.  If you have changed your shell to bash,
+there is code in the CDE startup files (on Solaris, at least) that attempts
+to do the right thing.  It is, however, often broken, and may require that
+you use the $BASH_ENV trick described below.
+
+`dtterm' claims to use $SHELL as the default program to start, so if you
+can change $SHELL in the CDE startup files, you should be able to use bash
+in your terminal windows.
+
+Setting DTSOURCEPROFILE in ~/.dtprofile will cause the `Xsession' program
+to read your login shell's startup files.  You may be able to use bash for
+the rest of the CDE programs by setting SHELL to bash in ~/.dtprofile as
+well, but I have not tried this.
+
+You can use the above `exec' recipe to start bash when not logging in with
+CDE by testing the value of the DT variable:
+
+       if [ -n "$DT" ]; then
+               [ -f /usr/gnu/bin/bash ] && exec /usr/gnu/bin/bash --login
+       fi
+
+If CDE starts its shells non-interactively during login, the login shell
+startup files (~/.profile, ~/.bash_profile) will not be sourced at login.
+To get around this problem, append a line similar to the following to your
+~/.dtprofile:
+
+       BASH_ENV=${HOME}/.bash_profile ; export BASH_ENV
+
+and add the following line to the beginning of ~/.bash_profile:
+
+       unset BASH_ENV
+
+A8) I just changed my login shell to bash, and now I can't FTP into my
+   machine.  Why not?
+
+You must add the full pathname to bash to the file /etc/shells.  As
+noted in the answer to the previous question, many systems require
+this before you can make bash your login shell. 
+
+Most versions of ftpd use this file to prohibit `special' users
+such as `uucp' and `news' from using FTP. 
+
+A9)  What's the `POSIX 1003.2 standard'?
+
+POSIX is a name originally coined by Richard Stallman for a
+family of open system standards based on UNIX.  There are a
+number of aspects of UNIX under consideration for
+standardization, from the basic system services at the system
+call and C library level to applications and tools to system
+administration and management.  Each area of standardization is
+assigned to a working group in the 1003 series. 
+
+The POSIX Shell and Utilities standard has been developed by IEEE
+Working Group 1003.2 (POSIX.2).  It concentrates on the command
+interpreter interface and utility programs commonly executed from
+the command line or by other programs.  An initial version of the
+standard has been approved and published by the IEEE, and work is
+currently underway to update it. 
+
+Bash is concerned with the aspects of the shell's behavior
+defined by POSIX.2.  The shell command language has of course
+been standardized, including the basic flow control and program
+execution constructs, I/O redirection and pipelining, argument
+handling, variable expansion, and quoting. 
+
+The `special' builtins, which must be implemented as part of the
+shell to provide the desired functionality, are specified as
+being part of the shell; examples of these are `eval' and
+`export'.  Other utilities appear in the sections of POSIX.2 not
+devoted to the shell which are commonly (and in some cases must
+be) implemented as builtin commands, such as `read' and `test'. 
+POSIX.2 also specifies aspects of the shell's interactive
+behavior as part of the UPE, including job control and command
+line editing.  Only vi-style line editing commands have been
+standardized; emacs editing commands were left out due to
+objections.
+
+The Open Group has made an older version of its Single Unix
+Specification (version 2), which is very similar to POSIX.2,
+available on the web at
+
+http://www.opengroup.org/onlinepubs/007908799/
+
+The Single Unix Specification, version 3, is available on the web at
+
+http://www.opengroup.org/onlinepubs/007904975/
+
+A10)  What is the bash `posix mode'?
+
+Although bash is an implementation of the POSIX.2 shell
+specification, there are areas where the bash default behavior
+differs from that spec.  The bash `posix mode' changes the bash
+behavior in these areas so that it obeys the spec more closely. 
+
+Posix mode is entered by starting bash with the --posix or
+'-o posix' option or executing `set -o posix' after bash is running.
+
+The specific aspects of bash which change when posix mode is
+active are listed in the file POSIX in the bash distribution.
+They are also listed in a section in the Bash Reference Manual
+(from which that file is generated).
+
+Section B:  The latest version
+
+B1) What's new in version 2.05b?
+
+The raison d'etre for bash-2.05b is to make a second intermediate
+release containing the first of the new features to be available
+in bash-3.0 and get feedback on those features before proceeding.
+The major new feature is multibyte character support in both Bash
+and Readline.
+
+Bash-2.05b contains the following new features (see the manual page for
+complete descriptions and the CHANGES and NEWS files in the bash-2.05b
+distribution):
+
+o support for multibyte characters has been added to both bash and readline
+
+o the DEBUG trap is now run *before* simple commands, ((...)) commands,
+  [[...]] conditional commands, and for ((...)) loops
+
+o the shell now performs arithmetic in the largest integer size the machine
+  supports (intmax_t)
+
+o there is a new \D{...} prompt expansion; passes the `...' to strftime(3)
+  and inserts the result into the expanded prompt
+
+o there is a new `here-string' redirection operator:  <<< word
+
+o when displaying variables, function attributes and definitions are shown
+  separately, allowing them to be re-used as input (attempting to re-use
+  the old output would result in syntax errors).
+
+o `read' has a new `-u fd' option to read from a specified file descriptor
+
+o the bash debugger in examples/bashdb has been modified to work with the
+  new DEBUG trap semantics, the command set has been made more gdb-like,
+  and the changes to $LINENO make debugging functions work better
+
+o the expansion of $LINENO inside a shell function is only relative to the
+  function start if the shell is interactive -- if the shell is running a
+  script, $LINENO expands to the line number in the script.  This is as
+  POSIX-2001 requires
+
+
+A short feature history dating from Bash-2.0:
+
+Bash-2.05a introduced the following new features:
+
+o The `printf' builtin has undergone major work
+
+o There is a new read-only `shopt' option: login_shell, which is set by
+  login shells and unset otherwise
+
+o New `\A' prompt string escape sequence; expanding to time in 24-hour
+  HH:MM format
+
+o New `-A group/-g' option to complete and compgen; goes group name
+  completion
+
+o New [+-]O invocation option to set and unset `shopt' options at startup
+
+o ksh-like `ERR' trap
+
+o `for' loops now allow empty word lists after the `in' reserved word
+
+o new `hard' and `soft' arguments for the `ulimit' builtin
+
+o Readline can be configured to place the user at the same point on the line
+  when retrieving commands from the history list
+
+o Readline can be configured to skip `hidden' files (filenames with a leading
+  `.' on Unix) when performing completion
+
+Bash-2.05 introduced the following new features:
+
+o This version has once again reverted to using locales and strcoll(3) when
+  processing pattern matching bracket expressions, as POSIX requires. 
+o Added a new `--init-file' invocation argument as a synonym for `--rcfile',
+  per the new GNU coding standards.
+o The /dev/tcp and /dev/udp redirections now accept service names as well as
+  port numbers.
+o `complete' and `compgen' now take a `-o value' option, which controls some
+   of the aspects of that compspec.  Valid values are:
+
+        default - perform bash default completion if programmable
+                  completion produces no matches
+        dirnames - perform directory name completion if programmable
+                   completion produces no matches
+        filenames - tell readline that the compspec produces filenames,
+                    so it can do things like append slashes to
+                    directory names and suppress trailing spaces
+o A new loadable builtin, realpath, which canonicalizes and expands symlinks
+  in pathname arguments.
+o When `set' is called without options, it prints function defintions in a
+  way that allows them to be reused as input.  This affects `declare' and 
+  `declare -p' as well.  This only happens when the shell is not in POSIX
+   mode, since POSIX.2 forbids this behavior.
+
+Bash-2.04 introduced the following new features:
+
+o Programmable word completion with the new `complete' and `compgen' builtins;
+  examples are provided in examples/complete/complete-examples
+o `history' has a new `-d' option to delete a history entry
+o `bind' has a new `-x' option to bind key sequences to shell commands
+o The prompt expansion code has new `\j' and `\l' escape sequences
+o The `no_empty_cmd_completion' shell option, if enabled, inhibits
+  command completion when TAB is typed on an empty line
+o `help' has a new `-s' option to print a usage synopsis
+o New arithmetic operators: var++, var--, ++var, --var, expr1,expr2 (comma)
+o New ksh93-style arithmetic for command:
+       for ((expr1 ; expr2; expr3 )); do list; done
+o `read' has new options: `-t', `-n', `-d', `-s'
+o The redirection code handles several filenames specially:  /dev/fd/N,
+  /dev/stdin, /dev/stdout, /dev/stderr
+o The redirection code now recognizes /dev/tcp/HOST/PORT and
+  /dev/udp/HOST/PORT and tries to open a TCP or UDP socket, respectively,
+  to the specified port on the specified host
+o The ${!prefix*} expansion has been implemented
+o A new FUNCNAME variable, which expands to the name of a currently-executing
+  function
+o The GROUPS variable is no longer readonly
+o A new shopt `xpg_echo' variable, to control the behavior of echo with
+  respect to backslash-escape sequences at runtime
+o The NON_INTERACTIVE_LOGIN_SHELLS #define has returned
+
+The version of Readline released with Bash-2.04, Readline-4.1, had several
+new features as well:
+
+o Parentheses matching is always compiled into readline, and controllable
+  with the new `blink-matching-paren' variable
+o The history-search-forward and history-search-backward functions now leave
+  point at the end of the line when the search string is empty, like
+  reverse-search-history, and forward-search-history
+o A new function for applications:  rl_on_new_line_with_prompt()
+o New variables for applications:  rl_already_prompted, and rl_gnu_readline_p
+
+
+Bash-2.03 had very few new features, in keeping with the convention
+that odd-numbered releases provide mainly bug fixes.  A number of new
+features were added to Readline, mostly at the request of the Cygnus
+folks.
+
+A new shopt option, `restricted_shell', so that startup files can test
+       whether or not the shell was started in restricted mode
+Filename generation is now performed on the words between ( and ) in
+       compound array assignments (this is really a bug fix)
+OLDPWD is now auto-exported, as POSIX.2 requires
+ENV and BASH_ENV are read-only variables in a restricted shell
+Bash may now be linked against an already-installed Readline library,
+       as long as the Readline library is version 4 or newer
+All shells begun with the `--login' option will source the login shell
+       startup files, even if the shell is not interactive
+
+There were lots of changes to the version of the Readline library released
+along with Bash-2.03.  For a complete list of the changes, read the file
+CHANGES in the Bash-2.03 distribution.
+
+Bash-2.02 contained the following new features:
+
+a new version of malloc (based on the old GNU malloc code in previous
+       bash versions) that is more page-oriented, more conservative
+       with memory usage, does not `orphan' large blocks when they
+       are freed, is usable on 64-bit machines, and has allocation
+       checking turned on unconditionally
+POSIX.2-style globbing character classes ([:alpha:], [:alnum:], etc.)
+POSIX.2-style globbing equivalence classes
+POSIX.2-style globbing collating symbols
+the ksh [[...]] extended conditional command
+the ksh egrep-style extended pattern matching operators
+a new `printf' builtin
+the ksh-like $(<filename) command substitution, which is equivalent to
+       $(cat filename)
+new tilde prefixes that expand to directories from the directory stack
+new `**' arithmetic operator to do exponentiation
+case-insensitive globbing (filename expansion)
+menu completion a la tcsh
+`magic-space' history expansion function like tcsh
+the readline inputrc `language' has a new file inclusion directive ($include)
+
+Bash-2.01 contained only a few new features:
+
+new `GROUPS' builtin array variable containing the user's group list
+new bindable readline commands: history-and-alias-expand-line and
+       alias-expand-line
+
+Bash-2.0 contained extensive changes and new features from bash-1.14.7.
+Here's a short list:
+
+new `time' reserved word to time pipelines, shell builtins, and
+       shell functions
+one-dimensional arrays with a new compound assignment statement,
+        appropriate expansion constructs and modifications to some
+       of the builtins (read, declare, etc.) to use them
+new quoting syntaxes for ANSI-C string expansion and locale-specific
+       string translation
+new expansions to do substring extraction, pattern replacement, and
+       indirect variable expansion
+new builtins: `disown' and `shopt'
+new variables: HISTIGNORE, SHELLOPTS, PIPESTATUS, DIRSTACK, GLOBIGNORE,
+              MACHTYPE, BASH_VERSINFO
+special handling of many unused or redundant variables removed
+       (e.g., $notify, $glob_dot_filenames, $no_exit_on_failed_exec)
+dynamic loading of new builtin commands; many loadable examples provided
+new prompt expansions: \a, \e, \n, \H, \T, \@, \v, \V
+history and aliases available in shell scripts
+new readline variables: enable-keypad, mark-directories, input-meta,
+       visible-stats, disable-completion, comment-begin
+new readline commands to manipulate the mark and operate on the region
+new readline emacs mode commands and bindings for ksh-88 compatibility
+updated and extended builtins
+new DEBUG trap
+expanded (and now documented) restricted shell mode
+
+implementation stuff:  
+autoconf-based configuration
+nearly all of the bugs reported since version 1.14 have been fixed
+most builtins converted to use builtin `getopt' for consistency
+most builtins use -p option to display output in a reusable form
+       (for consistency)
+grammar tighter and smaller (66 reduce-reduce conflicts gone)
+lots of code now smaller and faster
+test suite greatly expanded
+
+B2) Are there any user-visible incompatibilities between bash-2.05b and
+    bash-1.14.7?
+
+There are a few incompatibilities between version 1.14.7 and version 2.05b.
+They are detailed in the file COMPAT in the bash distribution.  That file
+is not meant to be all-encompassing; send mail to bash-maintainers@gnu.org
+if if you find something that's not mentioned there.
+
+Section C:  Differences from other Unix shells
+
+C1) How does bash differ from sh, the Bourne shell?
+
+This is a non-comprehensive list of features that differentiate bash
+from the SVR4.2 shell.  The bash manual page explains these more
+completely.
+
+Things bash has that sh does not:
+       long invocation options
+       [+-]O invocation option
+       -l invocation option
+       `!' reserved word to invert pipeline return value
+       `time' reserved word to time pipelines and shell builtins
+       the `function' reserved word
+       the `select' compound command and reserved word
+       arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
+       new $'...' and $"..." quoting
+       the $(...) form of command substitution
+       the $(<filename) form of command substitution, equivalent to
+               $(cat filename)
+       the ${#param} parameter value length operator
+       the ${!param} indirect parameter expansion operator
+       the ${!param*} prefix expansion operator
+       the ${param:offset[:length]} parameter substring operator
+       the ${param/pat[/string]} parameter pattern substitution operator
+       expansions to perform substring removal (${p%[%]w}, ${p#[#]w})
+       expansion of positional parameters beyond $9 with ${num}
+       variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, REPLY,
+                  TIMEFORMAT, PPID, PWD, OLDPWD, SHLVL, RANDOM, SECONDS,
+                  LINENO, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE, HOSTNAME,
+                  ENV, PS3, PS4, DIRSTACK, PIPESTATUS, HISTSIZE, HISTFILE,
+                  HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, GROUPS,
+                  PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC,
+                  SHELLOPTS, OPTERR, HOSTFILE, TMOUT, FUNCNAME, histchars,
+                  auto_resume
+       DEBUG trap
+       ERR trap
+       variable arrays with new compound assignment syntax
+       redirections: <>, &>, >|, <<<, [n]<&word-, [n]>&word-
+       prompt string special char translation and variable expansion
+       auto-export of variables in initial environment
+       command search finds functions before builtins
+       bash return builtin will exit a file sourced with `.'
+       builtins: cd -/-L/-P, exec -l/-c/-a, echo -e/-E, hash -d/-l/-p/-t.
+                 export -n/-f/-p/name=value, pwd -L/-P,
+                 read -e/-p/-a/-t/-n/-d/-s/-u,
+                 readonly -a/-f/name=value, trap -l, set +o,
+                 set -b/-m/-o option/-h/-p/-B/-C/-H/-P,
+                 unset -f/-v, ulimit -m/-p/-u,
+                 type -a/-p/-t/-f/-P, suspend -f, kill -n,
+                 test -o optname/s1 == s2/s1 < s2/s1 > s2/-nt/-ot/-ef/-O/-G/-S
+       bash reads ~/.bashrc for interactive shells, $ENV for non-interactive
+       bash restricted shell mode is more extensive
+       bash allows functions and variables with the same name
+       brace expansion
+       tilde expansion
+       arithmetic expansion with $((...)) and `let' builtin
+       the `[[...]]' extended conditional command
+       process substitution
+       aliases and alias/unalias builtins
+       local variables in functions and `local' builtin
+       readline and command-line editing with programmable completion
+       command history and history/fc builtins
+       csh-like history expansion
+       other new bash builtins: bind, command, compgen, complete, builtin,
+                                declare/typeset, dirs, enable, fc, help,
+                                history, logout, popd, pushd, disown, shopt,
+                                printf
+       exported functions
+       filename generation when using output redirection (command >a*)
+       POSIX.2-style globbing character classes
+       POSIX.2-style globbing equivalence classes
+       POSIX.2-style globbing collating symbols
+       egrep-like extended pattern matching operators
+       case-insensitive pattern matching and globbing
+       variable assignments preceding commands affect only that command,
+               even for builtins and functions
+       posix mode
+       redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr,
+               /dev/tcp/host/port, /dev/udp/host/port
+
+Things sh has that bash does not:
+       uses variable SHACCT to do shell accounting
+       includes `stop' builtin (bash can use alias stop='kill -s STOP')
+       `newgrp' builtin
+       turns on job control if called as `jsh'
+       $TIMEOUT (like bash $TMOUT)
+       `^' is a synonym for `|'
+       new SVR4.2 sh builtins: mldmode, priv
+
+Implementation differences:
+       redirection to/from compound commands causes sh to create a subshell
+       bash does not allow unbalanced quotes; sh silently inserts them at EOF
+       bash does not mess with signal 11
+       sh sets (euid, egid) to (uid, gid) if -p not supplied and uid < 100
+       bash splits only the results of expansions on IFS, using POSIX.2
+               field splitting rules; sh splits all words on IFS
+       sh does not allow MAILCHECK to be unset (?)
+       sh does not allow traps on SIGALRM or SIGCHLD
+       bash allows multiple option arguments when invoked (e.g. -x -v);
+               sh allows only a single option argument (`sh -x -v' attempts
+               to open a file named `-v', and, on SunOS 4.1.4, dumps core.
+               On Solaris 2.4 and earlier versions, sh goes into an infinite
+               loop.)
+       sh exits a script if any builtin fails; bash exits only if one of
+               the POSIX.2 `special' builtins fails
+
+C2)  How does bash differ from the Korn shell, version ksh88?
+
+Things bash has or uses that ksh88 does not:
+       long invocation options
+       [-+]O invocation option
+       -l invocation option
+       `!' reserved word
+       arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
+       arithmetic in largest machine-supported size (intmax_t)
+       posix mode and posix conformance
+       command hashing
+       tilde expansion for assignment statements that look like $PATH
+       process substitution with named pipes if /dev/fd is not available
+       the ${!param} indirect parameter expansion operator
+       the ${!param*} prefix expansion operator
+       the ${param:offset[:length]} parameter substring operator
+       the ${param/pat[/string]} parameter pattern substitution operator
+       variables: BASH, BASH_VERSION, BASH_VERSINFO, UID, EUID, SHLVL,
+                  TIMEFORMAT, HISTCMD, HOSTTYPE, OSTYPE, MACHTYPE,
+                  HISTFILESIZE, HISTIGNORE, HISTCONTROL, PROMPT_COMMAND,
+                  IGNOREEOF, FIGNORE, INPUTRC, HOSTFILE, DIRSTACK,
+                  PIPESTATUS, HOSTNAME, OPTERR, SHELLOPTS, GLOBIGNORE,
+                  GROUPS, FUNCNAME, histchars, auto_resume
+       prompt expansion with backslash escapes and command substitution
+       redirection: &> (stdout and stderr), <<<, [n]<&word-, [n]>&word-
+       more extensive and extensible editing and programmable completion
+       builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable,
+                 exec -l/-c/-a, fc -s, export -n/-f/-p, hash, help, history,
+                 jobs -x/-r/-s, kill -s/-n/-l, local, logout, popd, pushd,
+                 read -e/-p/-a/-t/-n/-d/-s, readonly -a/-n/-f/-p,
+                 set -o braceexpand/-o histexpand/-o interactive-comments/
+                 -o notify/-o physical/-o posix/-o hashall/-o onecmd/
+                 -h/-B/-C/-b/-H/-P, set +o, suspend, trap -l, type,
+                 typeset -a/-F/-p, ulimit -u, umask -S, alias -p, shopt,
+                 disown, printf, complete, compgen
+       `!' csh-style history expansion
+       POSIX.2-style globbing character classes
+       POSIX.2-style globbing equivalence classes
+       POSIX.2-style globbing collating symbols
+       egrep-like extended pattern matching operators
+       case-insensitive pattern matching and globbing
+       `**' arithmetic operator to do exponentiation
+       redirection to /dev/fd/N, /dev/stdin, /dev/stdout, /dev/stderr
+       arrays of unlimited size
+       TMOUT is default timeout for `read' and `select'
+
+Things ksh88 has or uses that bash does not:
+       tracked aliases (alias -t)
+       variables: ERRNO, FPATH, EDITOR, VISUAL
+       co-processes (|&, >&p, <&p)
+       weirdly-scoped functions
+       typeset +f to list all function names without definitions
+       text of command history kept in a file, not memory
+       builtins: alias -x, cd old new, fc -e -, newgrp, print,
+                 read -p/-s/var?prompt, set -A/-o gmacs/
+                 -o bgnice/-o markdirs/-o nolog/-o trackall/-o viraw/-s,
+                 typeset -H/-L/-R/-Z/-A/-ft/-fu/-fx/-l/-u/-t, whence
+       using environment to pass attributes of exported variables
+       arithmetic evaluation done on arguments to some builtins
+       reads .profile from $PWD when invoked as login shell
+
+Implementation differences:
+       ksh runs last command of a pipeline in parent shell context
+       bash has brace expansion by default (ksh88 compile-time option)
+       bash has fixed startup file for all interactive shells; ksh reads $ENV
+       bash has exported functions
+       bash command search finds functions before builtins
+       bash waits for all commands in pipeline to exit before returning status
+       emacs-mode editing has some slightly different key bindings
+
+C3)  Which new features in ksh-93 are not in bash, and which are?
+
+New things in ksh-93 not in bash-2.05b:
+       associative arrays
+       floating point arithmetic and variables
+       math library functions
+       ${!name[sub]} name of subscript for associative array
+       `.' is allowed in variable names to create a hierarchical namespace
+       more extensive compound assignment syntax
+       discipline functions
+       `sleep' and `getconf' builtins (bash has loadable versions)
+       typeset -n and `nameref' variables
+       KEYBD trap
+       variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, .sh.version,
+                  .sh.name, .sh.subscript, .sh.value, .sh.match, HISTEDIT
+       backreferences in pattern matching (\N)
+       `&' operator in pattern lists for matching
+       print -f (bash uses printf)
+       `fc' has been renamed to `hist'
+       `.' can execute shell functions
+       exit statuses between 0 and 255
+       set -o pipefail
+       `+=' variable assignment operator
+       FPATH and PATH mixing
+       getopts -a
+       -I invocation option
+       DEBUG trap now executed before each simple command, instead of after
+       printf %H, %P, %T, %Z modifiers, output base for %d
+       lexical scoping for local variables in `ksh' functions
+       no scoping for local variables in `POSIX' functions
+
+New things in ksh-93 present in bash-2.05b:
+       [n]<&word- and [n]>&word- redirections (combination dup and close)
+        for (( expr1; expr2; expr3 )) ; do list; done - arithmetic for command
+        ?:, ++, --, `expr1 , expr2' arithmetic operators
+       expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]},
+                   ${!param*}
+       compound array assignment
+       the `!' reserved word
+       loadable builtins -- but ksh uses `builtin' while bash uses `enable'
+       `command', `builtin', `disown' builtins
+       new $'...' and $"..." quoting
+       FIGNORE (but bash uses GLOBIGNORE), HISTCMD
+       set -o notify/-C
+       changes to kill builtin
+       read -A (bash uses read -a)
+        read -t/-d
+       trap -p
+       exec -c/-a
+       `.' restores the positional parameters when it completes
+       POSIX.2 `test'
+       umask -S
+       unalias -a
+       command and arithmetic substitution performed on PS1, PS4, and ENV
+       command name completion
+       ENV processed only for interactive shells
+
+Section D:  Why does bash do some things differently than other Unix shells?
+
+D1) Why does bash run a different version of `command' than
+    `which command' says it will?
+
+On many systems, `which' is actually a csh script that assumes
+you're running csh.  In tcsh, `which' and its cousin `where'
+are builtins.  On other Unix systems, `which' is a perl script
+that uses the PATH environment variable.
+
+The csh script version reads the csh startup files from your
+home directory and uses those to determine which `command' will
+be invoked.  Since bash doesn't use any of those startup files,
+there's a good chance that your bash environment differs from
+your csh environment.  The bash `type' builtin does everything
+`which' does, and will report correct results for the running
+shell.  If you're really wedded to the name `which', try adding
+the following function definition to your .bashrc:
+
+       which()
+       {
+               builtin type "$@"
+       }
+
+If you're moving from tcsh and would like to bring `where' along
+as well, use this function:
+
+       where()
+       {
+               builtin type -a "$@"
+       }
+
+D2) Why doesn't bash treat brace expansions exactly like csh?
+
+The only difference between bash and csh brace expansion is that
+bash requires a brace expression to contain at least one unquoted
+comma if it is to be expanded.  Any brace-surrounded word not
+containing an unquoted comma is left unchanged by the brace
+expansion code.  This affords the greatest degree of sh
+compatibility. 
+
+Bash, ksh, zsh, and pd-ksh all implement brace expansion this way. 
+
+D3) Why doesn't bash have csh variable modifiers?
+
+Posix has specified a more powerful, albeit somewhat more cryptic,
+mechanism cribbed from ksh, and bash implements it.
+
+${parameter%word}
+        Remove smallest suffix pattern.  The WORD is expanded to produce
+        a pattern.  It then expands to the value of PARAMETER, with the
+        smallest portion of the suffix matched by the pattern deleted.
+
+        x=file.c
+        echo ${x%.c}.o
+        -->file.o
+
+${parameter%%word}
+
+        Remove largest suffix pattern.  The WORD is expanded to produce
+        a pattern.  It then expands to the value of PARAMETER, with the
+        largest portion of the suffix matched by the pattern deleted.
+
+        x=posix/src/std
+        echo ${x%%/*}
+        -->posix
+
+${parameter#word}
+        Remove smallest prefix pattern.  The WORD is expanded to produce
+        a pattern.  It then expands to the value of PARAMETER, with the
+        smallest portion of the prefix matched by the pattern deleted.
+
+        x=$HOME/src/cmd
+        echo ${x#$HOME}
+        -->/src/cmd
+
+${parameter##word}
+        Remove largest prefix pattern.  The WORD is expanded to produce
+        a pattern.  It then expands to the value of PARAMETER, with the
+        largest portion of the prefix matched by the pattern deleted.
+
+        x=/one/two/three
+        echo ${x##*/}
+        -->three
+
+
+Given
+       a=/a/b/c/d
+       b=b.xxx
+
+       csh                     bash            result
+       ---                     ----            ------
+       $a:h                    ${a%/*}            /a/b/c
+       $a:t                    ${a##*/}           d
+       $b:r                    ${b%.*}            b
+       $b:e                    ${b##*.}           xxx
+
+
+D4) How can I make my csh aliases work when I convert to bash?
+
+Bash uses a different syntax to support aliases than csh does. 
+The details can be found in the documentation.  We have provided
+a shell script which does most of the work of conversion for you;
+this script can be found in ./examples/misc/aliasconv.sh.  Here is
+how you use it:
+  
+Start csh in the normal way for you.  (e.g., `csh')
+  
+Pipe the output of `alias' through `aliasconv.sh', saving the
+results into `bash_aliases':
+  
+       alias | bash aliasconv.sh >bash_aliases
+  
+Edit `bash_aliases', carefully reading through any created
+functions.  You will need to change the names of some csh specific
+variables to the bash equivalents.  The script converts $cwd to
+$PWD, $term to $TERM, $home to $HOME, $user to $USER, and $prompt
+to $PS1.  You may also have to add quotes to avoid unwanted
+expansion.
+
+For example, the csh alias:
+  
+       alias cd 'cd \!*; echo $cwd'
+  
+is converted to the bash function:
+
+       cd () { command cd "$@"; echo $PWD ; }
+
+The only thing that needs to be done is to quote $PWD:
+  
+       cd () { command cd "$@"; echo "$PWD" ; }
+  
+Merge the edited file into your ~/.bashrc.
+
+There is an additional, more ambitious, script in
+examples/misc/cshtobash that attempts to convert your entire csh
+environment to its bash equivalent.  This script can be run as
+simply `cshtobash' to convert your normal interactive
+environment, or as `cshtobash ~/.login' to convert your login
+environment. 
+
+D5) How can I pipe standard output and standard error from one command to
+    another, like csh does with `|&'?
+
+Use
+       command 2>&1 | command2
+
+The key is to remember that piping is performed before redirection, so
+file descriptor 1 points to the pipe when it is duplicated onto file
+descriptor 2.
+
+D6) Now that I've converted from ksh to bash, are there equivalents to
+    ksh features like autoloaded functions and the `whence' command?
+
+There are features in ksh-88 and ksh-93 that do not have direct bash
+equivalents.  Most, however, can be emulated with very little trouble.
+
+ksh-88 feature         Bash equivalent
+--------------         ---------------
+compiled-in aliases    set up aliases in .bashrc; some ksh aliases are
+                       bash builtins (hash, history, type)
+coprocesses            named pipe pairs (one for read, one for write)
+typeset +f             declare -F
+cd, print, whence      function substitutes in examples/functions/kshenv
+autoloaded functions   examples/functions/autoload is the same as typeset -fu
+read var?prompt                read -p prompt var
+
+ksh-93 feature         Bash equivalent
+--------------         ---------------
+sleep, getconf         Bash has loadable versions in examples/loadables
+${.sh.version}         $BASH_VERSION
+print -f               printf
+hist                   alias hist=fc
+$HISTEDIT              $FCEDIT
+
+Section E:  How can I get bash to do certain things, and why does bash do
+           things the way it does?
+
+E1) Why is the bash builtin `test' slightly different from /bin/test?
+
+The specific example used here is [ ! x -o x ], which is false.
+
+Bash's builtin `test' implements the Posix.2 spec, which can be
+summarized as follows (the wording is due to David Korn):
+   
+Here is the set of rules for processing test arguments.
+  
+    0 Args: False
+    1 Arg:  True iff argument is not null.
+    2 Args: If first arg is !, True iff second argument is null.
+           If first argument is unary, then true if unary test is true
+           Otherwise error.
+    3 Args: If second argument is a binary operator, do binary test of $1 $3
+           If first argument is !, negate two argument test of $2 $3
+           If first argument is `(' and third argument is `)', do the
+           one-argument test of the second argument.
+           Otherwise error.
+    4 Args: If first argument is !, negate three argument test of $2 $3 $4.
+           Otherwise unspecified
+    5 or more Args: unspecified.  (Historical shells would use their
+    current algorithm).
+   
+The operators -a and -o are considered binary operators for the purpose
+of the 3 Arg case.
+   
+As you can see, the test becomes (not (x or x)), which is false.
+
+E2) Why does bash sometimes say `Broken pipe'?
+
+If a sequence of commands appears in a pipeline, and one of the
+reading commands finishes before the writer has finished, the
+writer receives a SIGPIPE signal.  Many other shells special-case
+SIGPIPE as an exit status in the pipeline and do not report it. 
+For example, in:
+  
+      ps -aux | head
+  
+`head' can finish before `ps' writes all of its output, and ps
+will try to write on a pipe without a reader.  In that case, bash
+will print `Broken pipe' to stderr when ps is killed by a
+SIGPIPE. 
+
+You can build a version of bash that will not report SIGPIPE errors
+by uncommenting the definition of DONT_REPORT_SIGPIPE in the file
+config-top.h.
+
+E3) When I have terminal escape sequences in my prompt, why does bash
+    wrap lines at the wrong column?
+
+Readline, the line editing library that bash uses, does not know
+that the terminal escape sequences do not take up space on the
+screen.  The redisplay code assumes, unless told otherwise, that
+each character in the prompt is a `printable' character that
+takes up one character position on the screen. 
+
+You can use the bash prompt expansion facility (see the PROMPTING
+section in the manual page) to tell readline that sequences of
+characters in the prompt strings take up no screen space. 
+
+Use the \[ escape to begin a sequence of non-printing characters,
+and the \] escape to signal the end of such a sequence. 
+
+E4) If I pipe the output of a command into `read variable', why doesn't
+    the output show up in $variable when the read command finishes?
+
+This has to do with the parent-child relationship between Unix
+processes.  It affects all commands run in pipelines, not just
+simple calls to `read'.  For example, piping a command's output
+into a `while' loop that repeatedly calls `read' will result in
+the same behavior.
+
+Each element of a pipeline runs in a separate process, a child of
+the shell running the pipeline.  A subprocess cannot affect its
+parent's environment.  When the `read' command sets the variable
+to the input, that variable is set only in the subshell, not the
+parent shell.  When the subshell exits, the value of the variable
+is lost. 
+
+Many pipelines that end with `read variable' can be converted
+into command substitutions, which will capture the output of
+a specified command.  The output can then be assigned to a
+variable:
+
+       grep ^gnu /usr/lib/news/active | wc -l | read ngroup
+
+can be converted into
+
+       ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
+
+This does not, unfortunately, work to split the text among
+multiple variables, as read does when given multiple variable
+arguments.  If you need to do this, you can either use the
+command substitution above to read the output into a variable
+and chop up the variable using the bash pattern removal
+expansion operators or use some variant of the following
+approach.
+
+Say /usr/local/bin/ipaddr is the following shell script:
+
+#! /bin/sh
+host `hostname` | awk '/address/ {print $NF}'
+
+Instead of using
+
+       /usr/local/bin/ipaddr | read A B C D
+
+to break the local machine's IP address into separate octets, use
+
+       OIFS="$IFS"
+       IFS=.
+       set -- $(/usr/local/bin/ipaddr)
+       IFS="$OIFS"
+       A="$1" B="$2" C="$3" D="$4"
+
+Beware, however, that this will change the shell's positional
+parameters.  If you need them, you should save them before doing
+this.
+
+This is the general approach -- in most cases you will not need to
+set $IFS to a different value.
+
+Some other user-supplied alternatives include:
+
+read A B C D << HERE
+    $(IFS=.; echo $(/usr/local/bin/ipaddr))
+HERE
+
+and, where process substitution is available,
+
+read A B C D < <(IFS=.; echo $(/usr/local/bin/ipaddr))
+
+E5) I have a bunch of shell scripts that use backslash-escaped characters
+    in arguments to `echo'.  Bash doesn't interpret these characters.  Why
+    not, and how can I make it understand them?
+
+This is the behavior of echo on most Unix System V machines.
+
+The bash builtin `echo' is modeled after the 9th Edition
+Research Unix version of `echo'.  It does not interpret
+backslash-escaped characters in its argument strings by default;
+it requires the use of the -e option to enable the
+interpretation.  The System V echo provides no way to disable the
+special characters; the bash echo has a -E option to disable
+them. 
+
+There is a configuration option that will make bash behave like
+the System V echo and interpret things like `\t' by default.  Run
+configure with the --enable-xpg-echo-default option to turn this
+on.  Be aware that this will cause some of the tests run when you
+type `make tests' to fail.
+
+There is a shell option, `xpg_echo', settable with `shopt', that will
+change the behavior of echo at runtime.  Enabling this option turns
+on expansion of backslash-escape sequences.
+
+E6) Why doesn't a while or for loop get suspended when I type ^Z?
+
+This is a consequence of how job control works on Unix.  The only
+thing that can be suspended is the process group.  This is a single
+command or pipeline of commands that the shell forks and executes.
+
+When you run a while or for loop, the only thing that the shell forks
+and executes are any commands in the while loop test and commands in
+the loop bodies.  These, therefore, are the only things that can be
+suspended when you type ^Z.
+
+If you want to be able to stop the entire loop, you need to put it
+within parentheses, which will force the loop into a subshell that
+may be stopped (and subsequently restarted) as a single unit.
+
+E7) What about empty for loops in Makefiles?
+
+It's fairly common to see constructs like this in automatically-generated
+Makefiles:
+
+SUBDIRS = @SUBDIRS@
+
+       ...
+
+subdirs-clean:
+       for d in ${SUBDIRS}; do \
+               ( cd $$d && ${MAKE} ${MFLAGS} clean ) \
+       done
+
+When SUBDIRS is empty, this results in a command like this being passed to
+bash:
+
+       for d in ; do
+               ( cd $d && ${MAKE} ${MFLAGS} clean )
+       done
+
+In versions of bash before bash-2.05a, this was a syntax error.  If the
+reserved word `in' was present, a word must follow it before the semicolon
+or newline.  The language in the manual page referring to the list of words
+being empty referred to the list after it is expanded.  These versions of
+bash required that there be at least one word following the `in' when the
+construct was parsed.
+
+The idiomatic Makefile solution is something like:
+
+SUBDIRS = @SUBDIRS@
+
+subdirs-clean:
+       subdirs=$SUBDIRS ; for d in $$subdirs; do \
+               ( cd $$d && ${MAKE} ${MFLAGS} clean ) \
+       done
+
+The latest drafts of the updated POSIX standard have changed this:  the
+word list is no longer required.  Bash versions 2.05a and later accept
+the new syntax.
+
+E8) Why does the arithmetic evaluation code complain about `08'?
+
+The bash arithmetic evaluation code (used for `let', $(()), (()), and in
+other places), interprets a leading `0' in numeric constants as denoting
+an octal number, and a leading `0x' as denoting hexadecimal.  This is
+in accordance with the POSIX.2 spec, section 2.9.2.1, which states that
+arithmetic constants should be handled as signed long integers as defined
+by the ANSI/ISO C standard.
+
+The POSIX.2 interpretation committee has confirmed this:
+
+http://www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-173.html
+
+E9) Why does the pattern matching expression [A-Z]* match files beginning
+    with every letter except `z'?
+
+Bash-2.03, Bash-2.05 and later versions honor the current locale setting
+when processing ranges within pattern matching bracket expressions ([A-Z]). 
+This is what POSIX.2 and SUSv3/XPG6 specify. 
+
+The behavior of the matcher in bash-2.05 and later versions depends on the
+current LC_COLLATE setting.  Setting this variable to `C' or `POSIX' will
+result in the traditional behavior ([A-Z] matches all uppercase ASCII
+characters).  Many other locales, including the en_US locale (the default
+on many US versions of Linux) collate the upper and lower case letters like
+this:
+
+       AaBb...Zz
+
+which means that [A-Z] matches every letter except `z'.  Others collate like
+
+       aAbBcC...zZ
+
+which means that [A-Z] matches every letter except `a'.
+
+The portable way to specify upper case letters is [:upper:] instead of
+A-Z; lower case may be specified as [:lower:] instead of a-z.
+
+Look at the manual pages for setlocale(3), strcoll(3), and, if it is
+present, locale(1).  If you have locale(1), you can use it to find
+your current locale information even if you do not have any of the
+LC_ variables set.
+
+My advice is to put
+
+       export LC_COLLATE=C
+
+into /etc/profile and inspect any shell scripts run from cron for
+constructs like [A-Z].  This will prevent things like
+
+       rm [A-Z]*
+
+from removing every file in the current directory except those beginning
+with `z' and still allow individual users to change the collation order.
+Users may put the above command into their own profiles as well, of course.
+
+E10) Why does `cd //' leave $PWD as `//'?
+
+POSIX.2, in its description of `cd', says that *three* or more leading
+slashes may be replaced with a single slash when canonicalizing the
+current working directory.
+
+This is, I presume, for historical compatibility.  Certain versions of
+Unix, and early network file systems, used paths of the form
+//hostname/path to access `path' on server `hostname'.
+
+E11) If I resize my xterm while another program is running, why doesn't bash
+     notice the change?
+
+This is another issue that deals with job control.
+
+The kernel maintains a notion of a current terminal process group.  Members
+of this process group (processes whose process group ID is equal to the
+current terminal process group ID) receive terminal-generated signals like
+SIGWINCH.  (For more details, see the JOB CONTROL section of the bash
+man page.)
+
+If a terminal is resized, the kernel sends SIGWINCH to each member of
+the terminal's current process group (the `foreground' process group).
+
+When bash is running with job control enabled, each pipeline (which may be
+a single command) is run in its own process group, different from bash's
+process group.  This foreground process group receives the SIGWINCH; bash
+does not.  Bash has no way of knowing that the terminal has been resized.
+
+There is a `checkwinsize' option, settable with the `shopt' builtin, that
+will cause bash to check the window size and adjust its idea of the
+terminal's dimensions each time a process stops or exits and returns control
+of the terminal to bash.  Enable it with `shopt -s checkwinsize'.
+
+Section F:  Things to watch out for on certain Unix versions
+
+F1) Why can't I use command line editing in my `cmdtool'?
+
+The problem is `cmdtool' and bash fighting over the input.  When
+scrolling is enabled in a cmdtool window, cmdtool puts the tty in
+`raw mode' to permit command-line editing using the mouse for
+applications that cannot do it themselves.  As a result, bash and
+cmdtool each try to read keyboard input immediately, with neither
+getting enough of it to be useful.
+
+This mode also causes cmdtool to not implement many of the
+terminal functions and control sequences appearing in the
+`sun-cmd' termcap entry.  For a more complete explanation, see
+that file examples/suncmd.termcap in the bash distribution. 
+
+`xterm' is a better choice, and gets along with bash much more
+smoothly.
+
+If you must use cmdtool, you can use the termcap description in
+examples/suncmd.termcap.  Set the TERMCAP variable to the terminal
+description contained in that file, i.e.
+
+TERMCAP='Mu|sun-cmd:am:bs:km:pt:li#34:co#80:cl=^L:ce=\E[K:cd=\E[J:rs=\E[s:'
+
+Then export TERMCAP and start a new cmdtool window from that shell.
+The bash command-line editing should behave better in the new
+cmdtool.  If this works, you can put the assignment to TERMCAP
+in your bashrc file.
+
+F2) I built bash on Solaris 2.  Why do globbing expansions and filename
+    completion chop off the first few characters of each filename?
+
+This is the consequence of building bash on SunOS 5 and linking
+with the libraries in /usr/ucblib, but using the definitions
+and structures from files in /usr/include. 
+
+The actual conflict is between the dirent structure in
+/usr/include/dirent.h and the struct returned by the version of
+`readdir' in libucb.a (a 4.3-BSD style `struct direct'). 
+
+Make sure you've got /usr/ccs/bin ahead of /usr/ucb in your $PATH
+when configuring and building bash.  This will ensure that you
+use /usr/ccs/bin/cc or acc instead of /usr/ucb/cc and that you
+link with libc before libucb. 
+
+If you have installed the Sun C compiler, you may also need to
+put /usr/ccs/bin and /opt/SUNWspro/bin into your $PATH before
+/usr/ucb.
+
+F3) Why does bash dump core after I interrupt username completion or
+    `~user' tilde expansion on a machine running NIS?
+
+This is a famous and long-standing bug in the SunOS YP (sorry, NIS)
+client library, which is part of libc.
+
+The YP library code keeps static state -- a pointer into the data
+returned from the server.  When YP initializes itself (setpwent),
+it looks at this pointer and calls free on it if it's non-null. 
+So far, so good. 
+
+If one of the YP functions is interrupted during getpwent (the
+exact function is interpretwithsave()), and returns NULL, the
+pointer is freed without being reset to NULL, and the function
+returns.  The next time getpwent is called, it sees that this
+pointer is non-null, calls free, and the bash free() blows up
+because it's being asked to free freed memory. 
+
+The traditional Unix mallocs allow memory to be freed multiple
+times; that's probably why this has never been fixed.  You can
+run configure with the `--without-gnu-malloc' option to use
+the C library malloc and avoid the problem.
+
+F4) I'm running SVR4.2.  Why is the line erased every time I type `@'?
+
+The `@' character is the default `line kill' character in most
+versions of System V, including SVR4.2.  You can change this
+character to whatever you want using `stty'.  For example, to
+change the line kill character to control-u, type
+
+       stty kill ^U
+
+where the `^' and `U' can be two separate characters.
+
+F5) Why does bash report syntax errors when my C News scripts use a
+    redirection before a subshell command?
+
+The actual command in question is something like
+
+       < file ( command )
+
+According to the grammar given in the POSIX.2 standard, this construct
+is, in fact, a syntax error.  Redirections may only precede `simple
+commands'.  A subshell construct such as the above is one of the shell's
+`compound commands'.  A redirection may only follow a compound command.
+
+This affects the mechanical transformation of commands that use `cat'
+to pipe a file into a command (a favorite Useless-Use-Of-Cat topic on
+comp.unix.shell).  While most commands of the form
+
+       cat file | command
+
+can be converted to `< file command', shell control structures such as
+loops and subshells require `command < file'.
+
+The file CWRU/sh-redir-hack in the bash-2.05a distribution is an
+(unofficial) patch to parse.y that will modify the grammar to
+support this construct.  It will not apply with `patch'; you must
+modify parse.y by hand.  Note that if you apply this, you must
+recompile with -DREDIRECTION_HACK.  This introduces a large
+number of reduce/reduce conflicts into the shell grammar. 
+
+F6) Why can't I use vi-mode editing on Red Hat Linux 6.1?
+
+The short answer is that Red Hat screwed up.
+
+The long answer is that they shipped an /etc/inputrc that only works
+for emacs mode editing, and then screwed all the vi users by setting
+INPUTRC to /etc/inputrc in /etc/profile.
+
+The short fix is to do one of the following: remove or rename
+/etc/inputrc, set INPUTRC=~/.inputrc in ~/.bashrc (or .bash_profile,
+but make sure you export it if you do), remove the assignment to
+INPUTRC from /etc/profile, add
+
+        set keymap emacs
+
+to the beginning of /etc/inputrc, or bracket the key bindings in
+/etc/inputrc with these lines
+
+       $if mode=emacs
+               [...]
+       $endif
+
+F7) Why do bash-2.05a and bash-2.05b fail to compile `printf.def' on
+    HP/UX 11.x?
+
+HP/UX's support for long double is imperfect at best.
+
+GCC will support it without problems, but the HP C library functions
+like strtold(3) and printf(3) don't actually work with long doubles.
+HP implemented a `long_double' type as a 4-element array of 32-bit
+ints, and that is what the library functions use.  The ANSI C
+`long double' type is a 128-bit floating point scalar.
+
+The easiest fix, until HP fixes things up, is to edit the generated
+config.h and #undef the HAVE_LONG_DOUBLE line.  After doing that,
+the compilation should complete successfully.
+
+Section G:  How can I get bash to do certain common things?
+
+G1) How can I get bash to read and display eight-bit characters?
+
+This is a process requiring several steps.
+
+First, you must ensure that the `physical' data path is a full eight
+bits.  For xterms, for example, the `vt100' resources `eightBitInput'
+and `eightBitOutput' should be set to `true'.
+
+Once you have set up an eight-bit path, you must tell the kernel and
+tty driver to leave the eighth bit of characters alone when processing
+keyboard input.  Use `stty' to do this:
+
+       stty cs8 -istrip -parenb
+
+For old BSD-style systems, you can use
+
+       stty pass8
+
+You may also need
+
+       stty even odd
+
+Finally, you need to tell readline that you will be inputting and
+displaying eight-bit characters.  You use readline variables to do
+this.  These variables can be set in your .inputrc or using the bash
+`bind' builtin.  Here's an example using `bind':
+
+       bash$ bind 'set convert-meta off'
+       bash$ bind 'set meta-flag on'
+       bash$ bind 'set output-meta on'
+
+The `set' commands between the single quotes may also be placed
+in ~/.inputrc.
+
+G2) How do I write a function `x' to replace builtin command `x', but
+    still invoke the command from within the function?
+
+This is why the `command' and `builtin' builtins exist.  The
+`command' builtin executes the command supplied as its first
+argument, skipping over any function defined with that name.  The
+`builtin' builtin executes the builtin command given as its first
+argument directly. 
+
+For example, to write a function to replace `cd' that writes the
+hostname and current directory to an xterm title bar, use
+something like the following:
+
+       cd()
+       {
+               builtin cd "$@" && xtitle "$HOST: $PWD"
+       }
+
+This could also be written using `command' instead of `builtin';
+the version above is marginally more efficient. 
+
+G3) How can I find the value of a shell variable whose name is the value
+    of another shell variable?
+
+Versions of Bash newer than Bash-2.0 support this directly.  You can use 
+
+       ${!var}
+
+For example, the following sequence of commands will echo `z':
+
+       var1=var2
+       var2=z
+       echo ${!var1}
+
+For sh compatibility, use the `eval' builtin.  The important
+thing to remember is that `eval' expands the arguments you give
+it again, so you need to quote the parts of the arguments that
+you want `eval' to act on. 
+
+For example, this expression prints the value of the last positional
+parameter:
+
+       eval echo \"\$\{$#\}\"
+
+The expansion of the quoted portions of this expression will be
+deferred until `eval' runs, while the `$#' will be expanded
+before `eval' is executed.  In versions of bash later than bash-2.0,
+
+       echo ${!#}
+
+does the same thing.
+
+This is not the same thing as ksh93 `nameref' variables, though the syntax
+is similar.  I may add namerefs in a future bash version.
+
+G4) How can I make the bash `time' reserved word print timing output that
+     looks like the output from my system's /usr/bin/time?
+
+The bash command timing code looks for a variable `TIMEFORMAT' and
+uses its value as a format string to decide how to display the
+timing statistics.
+
+The value of TIMEFORMAT is a string with `%' escapes expanded in a
+fashion similar in spirit to printf(3).  The manual page explains
+the meanings of the escape sequences in the format string.
+
+If TIMEFORMAT is not set, bash acts as if the following assignment had
+been performed:
+
+       TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
+
+The POSIX.2 default time format (used by `time -p command') is
+
+       TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S'
+
+The BSD /usr/bin/time format can be emulated with:
+
+       TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys'
+
+The System V /usr/bin/time format can be emulated with:
+
+       TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S'
+
+The ksh format can be emulated with:
+
+       TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS'
+
+G5) How do I get the current directory into my prompt?
+
+Bash provides a number of backslash-escape sequences which are expanded
+when the prompt string (PS1 or PS2) is displayed.  The full list is in
+the manual page.
+
+The \w expansion gives the full pathname of the current directory, with
+a tilde (`~') substituted for the current value of $HOME.  The \W
+expansion gives the basename of the current directory.  To put the full
+pathname of the current directory into the path without any tilde
+subsitution, use $PWD.  Here are some examples:
+
+       PS1='\w$ '      # current directory with tilde
+       PS1='\W$ '      # basename of current directory
+       PS1='$PWD$ '    # full pathname of current directory
+
+The single quotes are important in the final example to prevent $PWD from
+being expanded when the assignment to PS1 is performed.
+
+G6) How can I rename "*.foo" to "*.bar"?
+
+Use the pattern removal functionality described in D3.  The following `for'
+loop will do the trick:
+
+       for f in *.foo; do
+               mv $f ${f%foo}bar
+       done
+
+G7) How can I translate a filename from uppercase to lowercase?
+
+The script examples/functions/lowercase, originally written by John DuBois,
+will do the trick.  The converse is left as an exercise.
+
+G8) How can I write a filename expansion (globbing) pattern that will match
+    all files in the current directory except "." and ".."?
+
+You must have set the `extglob' shell option using `shopt -s extglob' to use
+this:
+
+       echo .!(.|) *
+
+A solution that works without extended globbing is given in the Unix Shell
+FAQ, posted periodically to comp.unix.shell.
+
+Section H:  Where do I go from here?
+
+H1) How do I report bugs in bash, and where should I look for fixes and
+    advice?
+
+Use the `bashbug' script to report bugs.  It is built and
+installed at the same time as bash.  It provides a standard
+template for reporting a problem and automatically includes
+information about your configuration and build environment. 
+
+`bashbug' sends its reports to bug-bash@gnu.org, which
+is a large mailing list gatewayed to the usenet newsgroup gnu.bash.bug. 
+
+Bug fixes, answers to questions, and announcements of new releases
+are all posted to gnu.bash.bug.  Discussions concerning bash features
+and problems also take place there.
+
+To reach the bash maintainers directly, send mail to
+bash-maintainers@gnu.org.
+
+H2) What kind of bash documentation is there?
+
+First, look in the doc directory in the bash distribution.  It should
+contain at least the following files:
+
+bash.1         an extensive, thorough Unix-style manual page
+builtins.1     a manual page covering just bash builtin commands
+bashref.texi   a reference manual in GNU tex`info format
+bashref.info   an info version of the reference manual
+FAQ            this file
+article.ms     text of an article written for The Linux Journal
+readline.3     a man page describing readline
+
+Postscript, HTML, and ASCII files created from the above source are
+available in the documentation distribution.
+
+There is additional documentation available for anonymous FTP from host
+ftp.cwru.edu in the `pub/bash' directory.
+
+Cameron Newham and Bill Rosenblatt have written a book on bash, published
+by O'Reilly and Associates.  The book is based on Bill Rosenblatt's Korn
+Shell book.  The title is ``Learning the Bash Shell'', and the ISBN number
+is 1-56592-147-X.  Look for it in fine bookstores near you.  This book
+covers bash-1.14, but has an appendix describing some of the new features
+in bash-2.0.  
+
+A second edition of this book is available, published in January, 1998.
+The ISBN number is 1-56592-347-2.  Look for it in the same fine bookstores
+or on the web.
+
+The GNU Bash Reference Manual has been published as a printed book by
+Network Theory Ltd (Paperback, ISBN: 0-9541617-7-7, Feb 2003).  It covers
+bash-2.0 and is available from most online bookstores (see
+http://www.network-theory.co.uk/bash/manual/ for details).  The publisher
+will donate $1 to the Free Software Foundation for each copy sold. 
+
+H3) What's coming in future versions?
+
+These are features I hope to include in a future version of bash.
+
+a better bash debugger (a minimally-tested version is included with bash-2.05b)
+associative arrays
+co-processes, but with a new-style syntax that looks like function declaration
+
+H4) What's on the bash `wish list' for future versions?
+
+These are features that may or may not appear in a future version of bash.
+
+breaking some of the shell functionality into embeddable libraries
+a module system like zsh's, using dynamic loading like builtins
+better internationalization using GNU `gettext'
+date-stamped command history
+a bash programmer's guide with a chapter on creating loadable builtins
+a better loadable interface to perl with access to the shell builtins and
+       variables (contributions gratefully accepted)
+ksh93-like `nameref' variables
+ksh93-like `+=' variable assignment operator
+ksh93-like `xx.yy' variables (including some of the .sh.* variables) and
+       associated disipline functions
+Some of the new ksh93 pattern matching operators, like backreferencing
+
+H5) When will the next release appear?
+
+The next version will appear sometime in 2002.  Never make predictions. 
+
+
+This document is Copyright 1995-2003 by Chester Ramey.
+
+Permission is hereby granted, without written agreement and
+without license or royalty fees, to use, copy, and distribute
+this document for any purpose, provided that the above copyright
+notice appears in all copies of this document and that the
+contents of this document remain unaltered.
index faa88989095e4152d59e418c01db7e4fd712b011..8f2c57ddcdc0c1da5dbc16f92ceb769ddbdd568a 100644 (file)
@@ -468,7 +468,7 @@ S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR
               status is zero if no pattern matches.  Otherwise, it is the exit
               status of the last command executed in _\bl_\bi_\bs_\bt.
 
-       i\bif\bf _\bl_\bi_\bs_\bt; t\bth\bhe\ben\bn _\bl_\bi_\bs_\bt_\b; [ e\bel\bli\bif\bf _\bl_\bi_\bs_\bt; t\bth\bhe\ben\bn _\bl_\bi_\bs_\bt; ] ... [ e\bel\bls\bse\be _\bl_\bi_\bs_\bt; ] f\bfi\bi
+       i\bif\bf _\bl_\bi_\bs_\bt; t\bth\bhe\ben\bn _\bl_\bi_\bs_\bt; [ e\bel\bli\bif\bf _\bl_\bi_\bs_\bt; t\bth\bhe\ben\bn _\bl_\bi_\bs_\bt; ] ... [ e\bel\bls\bse\be _\bl_\bi_\bs_\bt; ] f\bfi\bi
               The i\bif\bf _\bl_\bi_\bs_\bt is executed.  If its exit status is zero,  the  t\bth\bhe\ben\bn
               _\bl_\bi_\bs_\bt  is  executed.   Otherwise,  each  e\bel\bli\bif\bf _\bl_\bi_\bs_\bt is executed in
               turn, and if its exit status is  zero,  the  corresponding  t\bth\bhe\ben\bn
@@ -706,13 +706,16 @@ P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS
        The shell treats several parameters specially.   These  parameters  may
        only be referenced; assignment to them is not allowed.
        *\b*      Expands  to  the positional parameters, starting from one.  When
-              the expansion occurs within double quotes, it expands to a  sin-
-              gle word with the value of each parameter separated by the first
-              character of the I\bIF\bFS\bS special variable.  That is, "$\b$*\b*" is equiva-
-              lent to "$\b$1\b1_\bc$\b$2\b2_\bc.\b..\b..\b.", where _\bc is the first character of the value
-              of the I\bIF\bFS\bS variable.  If I\bIF\bFS\bS is unset, the parameters are  sepa-
-              rated  by  spaces.   If  I\bIF\bFS\bS  is null, the parameters are joined
-              without intervening separators.
+              the expansion is  not  within  double  quotes,  each  positional
+              parameter  expands  to a separate word.  In contexts where it is
+              performed, those words are subject to further word splitting and
+              pathname  expansion.   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 I\bIF\bFS\bS special
+              variable.  That is, "$\b$*\b*" is equivalent to "$\b$1\b1_\bc$\b$2\b2_\bc.\b..\b..\b.",  where  _\bc
+              is the first character of the value of the I\bIF\bFS\bS variable.  If I\bIF\bFS\bS
+              is unset, the parameters are separated by  spaces.   If  I\bIF\bFS\bS  is
+              null,  the parameters are joined without intervening separators.
        @\b@      Expands to the positional parameters, starting from  one.   When
               the  expansion  occurs  within  double  quotes,  each  parameter
               expands to a separate word.  That is, "$\b$@\b@" is equivalent to "$\b$1\b1"
@@ -5721,4 +5724,4 @@ B\bBU\bUG\bGS\bS
 
 
 
-GNU Bash 4.3                    2014 January 6                         BASH(1)
+GNU Bash 4.3                    2014 February 2                        BASH(1)
index bdc580f9b0b2f9698c77bc0e8762a6e1ce877b37..ec414627f0f832225cc453e51840dc90e534b5a6 100644 (file)
@@ -7526,6 +7526,9 @@ command,
 unless the \fB\-g\fP option is supplied.
 If a variable name is followed by =\fIvalue\fP, the value of
 the variable is set to \fIvalue\fP.
+When using \fB\-a\fP or \fB\-A\fP and the compound assignment syntax to
+create array variables, additional attributes do not take effect until
+subsequent assignments.
 The return value is 0 unless an invalid option is encountered,
 an attempt is made to define a function using
 .if n ``\-f foo=bar'',
index 3652bd18ed6d0f823d89e14a8096a13459b814b8..a83f8b3134fd879f5677939d0c04a64b7abdb472 100644 (file)
@@ -3,7 +3,7 @@
 </HEAD>
 <BODY><TABLE WIDTH=100%>
 <TR>
-<TH ALIGN=LEFT width=33%>BASH(1)<TH ALIGN=CENTER width=33%>2014 January 6<TH ALIGN=RIGHT width=33%>BASH(1)
+<TH ALIGN=LEFT width=33%>BASH(1)<TH ALIGN=CENTER width=33%>2014 February 2<TH ALIGN=RIGHT width=33%>BASH(1)
 </TR>
 </TABLE>
 <BR><A HREF="#index">Index</A>
@@ -1130,7 +1130,7 @@ on a successful match.
 The exit status is zero if no
 pattern matches.  Otherwise, it is the exit status of the
 last command executed in <I>list</I>.
-<DT><B>if</B> <I>list</I>; <B>then</B> <I>list;</I> [ <B>elif</B> <I>list</I>; <B>then</B> <I>list</I>; ] ... [ <B>else</B> <I>list</I>; ] <B>fi</B><DD>
+<DT><B>if</B> <I>list</I>; <B>then</B> <I>list</I>; [ <B>elif</B> <I>list</I>; <B>then</B> <I>list</I>; ] ... [ <B>else</B> <I>list</I>; ] <B>fi</B><DD>
 The
 <B>if </B>
 
@@ -1679,8 +1679,12 @@ only be referenced; assignment to them is not allowed.
 <DT><B>*</B>
 
 <DD>
-Expands to the positional parameters, starting from one.  When the
-expansion occurs within double quotes, it expands to a single word
+Expands to the positional parameters, starting from one.
+When the expansion is not within double quotes, each positional parameter
+expands to a separate word.
+In contexts where it is performed, those words
+are subject to further word splitting and pathname expansion.
+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 
 <FONT SIZE=-1><B>IFS</B>
@@ -13157,7 +13161,7 @@ There may be only one active coprocess at a time.
 <HR>
 <TABLE WIDTH=100%>
 <TR>
-<TH ALIGN=LEFT width=33%>GNU Bash 4.3<TH ALIGN=CENTER width=33%>2014 January 6<TH ALIGN=RIGHT width=33%>BASH(1)
+<TH ALIGN=LEFT width=33%>GNU Bash 4.3<TH ALIGN=CENTER width=33%>2014 February 2<TH ALIGN=RIGHT width=33%>BASH(1)
 </TR>
 </TABLE>
 <HR>
@@ -13263,6 +13267,6 @@ There may be only one active coprocess at a time.
 </DL>
 <HR>
 This document was created by man2html from bash.1.<BR>
-Time: 23 January 2014 15:52:11 EST
+Time: 04 February 2014 09:39:07 EST
 </BODY>
 </HTML>
index afd63b848ba67199843c12fe4befe6bb9cbdebfb..97cc14fe4f2cff9139410ad0623e95dfb2f41b4d 100644 (file)
Binary files a/doc/bash.pdf and b/doc/bash.pdf differ
index 7abc39fd4e9d838e63034b50f2ab0fbb12158175..6963486d195dd23c2df33800366f9443efdb0508 100644 (file)
@@ -1,6 +1,6 @@
 %!PS-Adobe-3.0
 %%Creator: groff version 1.19.2
-%%CreationDate: Thu Jan 23 15:52:06 2014
+%%CreationDate: Tue Feb  4 09:39:00 2014
 %%DocumentNeededResources: font Times-Roman
 %%+ font Times-Bold
 %%+ font Times-Italic
@@ -329,7 +329,7 @@ F .474(xtended deb)-.15 F(ug-)-.2 E
 (~/.bashr)3.599 E(c)-.37 E F0 1.599(if the)4.409 F(shell is interacti)
 144 698.4 Q .3 -.15(ve \()-.25 H(see).15 E F4(INV)2.5 E(OCA)-.405 E
 (TION)-.855 E F0(belo)2.25 E(w\).)-.25 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(1)198.45 E 0 Cg EP
+(2014 February 2)141.79 E(1)195.95 E 0 Cg EP
 %%Page: 2 2
 %%BeginPageSetup
 BP
@@ -448,8 +448,8 @@ G(ly).15 E 5.306(,t)-.65 G 5.306(or)-5.306 G 2.806
 F(ariable)-.25 E F3 -.27(BA)108 720 S(SH_ENV).27 E F0 1.01(in the en)
 3.26 F 1.01(vironment, e)-.4 F 1.01(xpands its v)-.15 F 1.01
 (alue if it appears there, and uses the e)-.25 F 1.011(xpanded v)-.15 F
-1.011(alue as the)-.25 F(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E
-(2)198.45 E 0 Cg EP
+1.011(alue as the)-.25 F(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E
+(2)195.95 E 0 Cg EP
 %%Page: 3 3
 %%BeginPageSetup
 BP
@@ -584,7 +584,7 @@ F .389(wed by)-.25 F F1(blank)2.889 E F0 .389(-separated w)B .389
 (simple command)2.675 F F0 .175(is its e)2.675 F .175
 (xit status, or 128+)-.15 F F4(n)A F0 .176
 (if the command is terminated by signal)3.508 F F4(n)2.676 E F0(.).24 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(3)198.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(3)195.95 E 0 Cg EP
 %%Page: 4 4
 %%BeginPageSetup
 BP
@@ -695,7 +695,7 @@ Q F2 1.053(compound command)3.553 F F0 1.053(is one of the follo)3.553 F
 -3.554 F 1.027(separated from the rest of the command by one or more ne)
 108 698.4 R 1.026(wlines, and may be follo)-.25 F 1.026(wed by a ne)-.25
 F 1.026(wline in)-.25 F(place of a semicolon.)108 710.4 Q(GNU Bash 4.3)
-72 768 Q(2014 January 6)144.29 E(4)198.45 E 0 Cg EP
+72 768 Q(2014 February 2)141.79 E(4)195.95 E 0 Cg EP
 %%Page: 5 5
 %%BeginPageSetup
 BP
@@ -827,7 +827,7 @@ F0 .597(with inde)2.847 F 3.097(x0i)-.15 G(s)-3.097 E .049
 (ex)2.5 G(pr).2 E(ession2)-.37 E F0 -.35(Tr)180 716.4 S(ue if either).35
 E F1 -.2(ex)2.5 G(pr).2 E(ession1)-.37 E F0(or)2.5 E F1 -.2(ex)2.5 G(pr)
 .2 E(ession2)-.37 E F0(is true.)2.52 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(5)198.45 E 0 Cg EP
+(2014 February 2)141.79 E(5)195.95 E 0 Cg EP
 %%Page: 6 6
 %%BeginPageSetup
 BP
@@ -950,10 +950,10 @@ E F2(list)2.727 E F0 .227(on a successful match.)2.727 F .227(The e)
 5.227 F .227(xit status is zero)-.15 F(if no pattern matches.)144 547.2
 Q(Otherwise, it is the e)5 E(xit status of the last command e)-.15 E
 -.15(xe)-.15 G(cuted in).15 E F2(list)2.5 E F0(.)A F1(if)108 564 Q F2
-(list)2.5 E F0(;)A F1(then)2.5 E F2(list;)2.5 E F0([)2.5 E F1(elif)2.5 E
-F2(list)2.5 E F0(;)A F1(then)2.5 E F2(list)2.5 E F0 2.5(;].)C(.. [)-2.5
-E F1(else)2.5 E F2(list)2.5 E F0 2.5(;])C F1<8c>A F0(The)144 576 Q F1
-(if)2.978 E F2(list)3.068 E F0 .478(is e)3.658 F -.15(xe)-.15 G 2.978
+(list)2.5 E F0(;)A F1(then)2.5 E F2(list)2.5 E F0 2.5(;[)C F1(elif)A F2
+(list)2.5 E F0(;)A F1(then)2.5 E F2(list)2.5 E F0 2.5(;].)C(.. [)-2.5 E
+F1(else)2.5 E F2(list)2.5 E F0 2.5(;])C F1<8c>A F0(The)144 576 Q F1(if)
+2.978 E F2(list)3.068 E F0 .478(is e)3.658 F -.15(xe)-.15 G 2.978
 (cuted. If).15 F .478(its e)2.978 F .478(xit status is zero, the)-.15 F
 F1(then)2.978 E F2(list)2.978 E F0 .478(is e)2.978 F -.15(xe)-.15 G
 2.978(cuted. Otherwise,).15 F(each)2.978 E F1(elif)2.977 E F2(list)2.977
@@ -982,8 +982,8 @@ F .205(The e)5.205 F .205(xit status of the)-.15 F F1(while)2.705 E F0
 (and)2.705 E F1(until)2.704 E F0 .204(commands is the e)2.704 F .204
 (xit status of the last command)-.15 F -.15(exe)144 700.8 S(cuted in).15
 E F2(list-2)2.5 E F0 2.5(,o)C 2.5(rz)-2.5 G(ero if none w)-2.5 E(as e)
--.1 E -.15(xe)-.15 G(cuted.).15 E(GNU Bash 4.3)72 768 Q(2014 January 6)
-144.29 E(6)198.45 E 0 Cg EP
+-.1 E -.15(xe)-.15 G(cuted.).15 E(GNU Bash 4.3)72 768 Q(2014 February 2)
+141.79 E(6)195.95 E 0 Cg EP
 %%Page: 7 7
 %%BeginPageSetup
 BP
@@ -1118,7 +1118,7 @@ F0 1.336(option is on by def)3.836 F 1.336(ault in)-.1 F(interacti)108
 (There are three quoting mechanisms: the)108 724.8 Q F2(escape c)2.5 E
 (har)-.15 E(acter)-.15 E F0 2.5(,s).73 G
 (ingle quotes, and double quotes.)-2.5 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(7)198.45 E 0 Cg EP
+(2014 February 2)141.79 E(7)195.95 E 0 Cg EP
 %%Page: 8 8
 %%BeginPageSetup
 BP
@@ -1221,8 +1221,8 @@ F(may be unset only by using the)108 686.4 Q F1(unset)2.5 E F0 -.2(bu)
 2.5 G(iltin command \(see).2 E F3(SHELL B)2.5 E(UIL)-.09 E(TIN COMMANDS)
 -.828 E F0(belo)2.25 E(w\).)-.25 E(A)108 703.2 Q F2(variable)2.79 E F0
 (may be assigned to by a statement of the form)2.68 E F2(name)144 720 Q
-F0(=[)A F2(value)A F0(])A(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E
-(8)198.45 E 0 Cg EP
+F0(=[)A F2(value)A F0(])A(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E
+(8)195.95 E 0 Cg EP
 %%Page: 9 9
 %%BeginPageSetup
 BP
@@ -1348,373 +1348,379 @@ t is e)108 559.2 R 1.404(xpanded, it must be enclosed in)-.15 F
 (The shell treats se)108 600 R -.15(ve)-.25 G 1.675
 (ral parameters specially).15 F 6.675(.T)-.65 G 1.674
 (hese parameters may only be referenced; assignment to)-6.675 F
-(them is not allo)108 612 Q(wed.)-.25 E F3(*)108 624 Q F0 .605
-(Expands to the positional parameters, starting from one.)31 F .606
-(When the e)5.605 F .606(xpansion occurs within dou-)-.15 F .084
-(ble quotes, it e)144 636 R .084(xpands to a single w)-.15 F .084
-(ord with the v)-.1 F .084
-(alue of each parameter separated by the \214rst char)-.25 F(-)-.2 E
-.003(acter of the)144 648 R F2(IFS)2.503 E F0 .003(special v)2.253 F
-2.503(ariable. That)-.25 F .003(is, ")2.503 F F3($*)A F0 2.503("i)C
-2.503(se)-2.503 G(qui)-2.503 E -.25(va)-.25 G .003(lent to ").25 F F3
-($1)A F1(c)A F3($2)A F1(c)A F3(...)A F0 .003(", where)B F1(c)2.703 E F0
-.004(is the \214rst char)2.813 F(-)-.2 E .769(acter of the v)144 660 R
-.769(alue of the)-.25 F F2(IFS)3.269 E F0 -.25(va)3.019 G 3.269
-(riable. If).25 F F2(IFS)3.268 E F0 .768
-(is unset, the parameters are separated by spaces.)3.018 F(If)5.768 E F2
-(IFS)144 672 Q F0(is null, the parameters are joined without interv)2.25
-E(ening separators.)-.15 E F3(@)108 684 Q F0 .605
+(them is not allo)108 612 Q(wed.)-.25 E F3(*)108 624 Q F0 .223
+(Expands to the positional parameters, starting from one.)31 F .224
+(When the e)5.224 F .224(xpansion is not within double)-.15 F .663
+(quotes, each positional parameter e)144 636 R .662
+(xpands to a separate w)-.15 F 3.162(ord. In)-.1 F(conte)3.162 E .662
+(xts where it is performed,)-.15 F 1.081(those w)144 648 R 1.081
+(ords are subject to further w)-.1 F 1.082(ord splitting and pathname e)
+-.1 F 3.582(xpansion. When)-.15 F 1.082(the e)3.582 F(xpansion)-.15 E
+.915(occurs within double quotes, it e)144 660 R .914
+(xpands to a single w)-.15 F .914(ord with the v)-.1 F .914
+(alue of each parameter sepa-)-.25 F .89
+(rated by the \214rst character of the)144 672 R F2(IFS)3.39 E F0 .89
+(special v)3.14 F 3.39(ariable. That)-.25 F .891(is, ")3.391 F F3($*)A
+F0 3.391("i)C 3.391(se)-3.391 G(qui)-3.391 E -.25(va)-.25 G .891
+(lent to ").25 F F3($1)A F1(c)A F3($2)A F1(c)A F3(...)A F0(",)A(where)
+144 684 Q F1(c)3.533 E F0 .832(is the \214rst character of the v)3.643 F
+.832(alue of the)-.25 F F2(IFS)3.332 E F0 -.25(va)3.082 G 3.332
+(riable. If).25 F F2(IFS)3.332 E F0 .832(is unset, the parameters are)
+3.082 F(separated by spaces.)144 696 Q(If)5 E F2(IFS)2.5 E F0
+(is null, the parameters are joined without interv)2.25 E
+(ening separators.)-.15 E F3(@)108 708 Q F0 .605
 (Expands to the positional parameters, starting from one.)26.7 F .606
 (When the e)5.605 F .606(xpansion occurs within dou-)-.15 F .114
-(ble quotes, each parameter e)144 696 R .114(xpands to a separate w)-.15
+(ble quotes, each parameter e)144 720 R .114(xpands to a separate w)-.15
 F 2.614(ord. That)-.1 F .113(is, ")2.613 F F3($@)A F0 2.613("i)C 2.613
 (se)-2.613 G(qui)-2.613 E -.25(va)-.25 G .113(lent to ").25 F F3($1)A F0
-2.613("")C F3($2)-2.613 E F0 2.613(".)C(..)-2.613 E .134
-(If the double-quoted e)144 708 R .134(xpansion occurs within a w)-.15 F
-.135(ord, the e)-.1 F .135(xpansion of the \214rst parameter is joined)
--.15 F .151(with the be)144 720 R .151(ginning part of the original w)
--.15 F .151(ord, and the e)-.1 F .15
-(xpansion of the last parameter is joined with)-.15 F(GNU Bash 4.3)72
-768 Q(2014 January 6)144.29 E(9)198.45 E 0 Cg EP
+2.613("")C F3($2)-2.613 E F0 2.613(".)C(..)-2.613 E(GNU Bash 4.3)72 768
+Q(2014 February 2)141.79 E(9)195.95 E 0 Cg EP
 %%Page: 10 10
 %%BeginPageSetup
 BP
 %%EndPageSetup
 /F0 10/Times-Roman@0 SF -.35(BA)72 48 S 389.54(SH\(1\) B).35 F(ASH\(1\))
--.35 E .337(the last part of the original w)144 84 R 2.837(ord. When)-.1
-F .338(there are no positional parameters, ")2.837 F/F1 10/Times-Bold@0
-SF($@)A F0 2.838("a)C(nd)-2.838 E F1($@)2.838 E F0 -.15(ex)2.838 G(pand)
-.15 E(to nothing \(i.e., the)144 96 Q 2.5(ya)-.15 G(re remo)-2.5 E -.15
-(ve)-.15 G(d\).).15 E F1(#)108 108 Q F0
+-.35 E .134(If the double-quoted e)144 84 R .134
+(xpansion occurs within a w)-.15 F .135(ord, the e)-.1 F .135
+(xpansion of the \214rst parameter is joined)-.15 F .151(with the be)144
+96 R .151(ginning part of the original w)-.15 F .151(ord, and the e)-.1
+F .15(xpansion of the last parameter is joined with)-.15 F .337
+(the last part of the original w)144 108 R 2.837(ord. When)-.1 F .338
+(there are no positional parameters, ")2.837 F/F1 10/Times-Bold@0 SF($@)
+A F0 2.838("a)C(nd)-2.838 E F1($@)2.838 E F0 -.15(ex)2.838 G(pand).15 E
+(to nothing \(i.e., the)144 120 Q 2.5(ya)-.15 G(re remo)-2.5 E -.15(ve)
+-.15 G(d\).).15 E F1(#)108 132 Q F0
 (Expands to the number of positional parameters in decimal.)31 E F1(?)
-108 120 Q F0(Expands to the e)31 E(xit status of the most recently e)
+108 144 Q F0(Expands to the e)31 E(xit status of the most recently e)
 -.15 E -.15(xe)-.15 G(cuted fore).15 E(ground pipeline.)-.15 E F1<ad>108
-132 Q F0 .882
+156 Q F0 .882
 (Expands to the current option \215ags as speci\214ed upon in)30.3 F -.2
 (vo)-.4 G .881(cation, by the).2 F F1(set)3.381 E F0 -.2(bu)3.381 G .881
 (iltin command, or).2 F(those set by the shell itself \(such as the)144
-144 Q F1<ad69>2.5 E F0(option\).)2.5 E F1($)108 156 Q F0 .214
+168 Q F1<ad69>2.5 E F0(option\).)2.5 E F1($)108 180 Q F0 .214
 (Expands to the process ID of the shell.)31 F .214
 (In a \(\) subshell, it e)5.214 F .214
 (xpands to the process ID of the current)-.15 F
-(shell, not the subshell.)144 168 Q F1(!)108 180 Q F0 .499(Expands to t\
+(shell, not the subshell.)144 192 Q F1(!)108 204 Q F0 .499(Expands to t\
 he process ID of the job most recently placed into the background, whet\
 her e)32.67 F -.15(xe)-.15 G(cuted).15 E
-(as an asynchronous command or using the)144 192 Q F1(bg)2.5 E F0 -.2
+(as an asynchronous command or using the)144 216 Q F1(bg)2.5 E F0 -.2
 (bu)2.5 G(iltin \(see).2 E/F2 9/Times-Bold@0 SF(JOB CONTR)2.5 E(OL)-.27
-E F0(belo)2.25 E(w\).)-.25 E F1(0)108 204 Q F0 1.691
+E F0(belo)2.25 E(w\).)-.25 E F1(0)108 228 Q F0 1.691
 (Expands to the name of the shell or shell script.)31 F 1.692
 (This is set at shell initialization.)6.692 F(If)6.692 E F1(bash)4.192 E
-F0(is)4.192 E(in)144 216 Q -.2(vo)-.4 G -.1(ke).2 G 3.078(dw).1 G .578
+F0(is)4.192 E(in)144 240 Q -.2(vo)-.4 G -.1(ke).2 G 3.078(dw).1 G .578
 (ith a \214le of commands,)-3.078 F F1($0)3.078 E F0 .578
 (is set to the name of that \214le.)3.078 F(If)5.577 E F1(bash)3.077 E
 F0 .577(is started with the)3.077 F F1<ad63>3.077 E F0 .368
-(option, then)144 228 R F1($0)2.869 E F0 .369(is set to the \214rst ar)
+(option, then)144 252 R F1($0)2.869 E F0 .369(is set to the \214rst ar)
 2.869 F .369(gument after the string to be e)-.18 F -.15(xe)-.15 G .369
 (cuted, if one is present.).15 F(Other)5.369 E(-)-.2 E
-(wise, it is set to the \214lename used to in)144 240 Q -.2(vo)-.4 G -.1
+(wise, it is set to the \214lename used to in)144 264 Q -.2(vo)-.4 G -.1
 (ke).2 G F1(bash)2.6 E F0 2.5(,a)C 2.5(sg)-2.5 G -2.15 -.25(iv e)-2.5 H
-2.5(nb).25 G 2.5(ya)-2.5 G -.18(rg)-2.5 G(ument zero.).18 E F1(_)108 252
+2.5(nb).25 G 2.5(ya)-2.5 G -.18(rg)-2.5 G(ument zero.).18 E F1(_)108 276
 Q F0 .055(At shell startup, set to the absolute pathname used to in)31 F
 -.2(vo)-.4 G .255 -.1(ke t).2 H .054(he shell or shell script being e).1
-F -.15(xe)-.15 G(cuted).15 E .691(as passed in the en)144 264 R .691
+F -.15(xe)-.15 G(cuted).15 E .691(as passed in the en)144 288 R .691
 (vironment or ar)-.4 F .691(gument list.)-.18 F(Subsequently)5.691 E
 3.191(,e)-.65 G .692(xpands to the last ar)-3.341 F .692(gument to the)
--.18 F(pre)144 276 Q .571(vious command, after e)-.25 F 3.071
+-.18 F(pre)144 300 Q .571(vious command, after e)-.25 F 3.071
 (xpansion. Also)-.15 F .571(set to the full pathname used to in)3.071 F
--.2(vo)-.4 G .77 -.1(ke e).2 H .57(ach command).1 F -.15(exe)144 288 S
+-.2(vo)-.4 G .77 -.1(ke e).2 H .57(ach command).1 F -.15(exe)144 312 S
 1.6(cuted and placed in the en).15 F 1.6(vironment e)-.4 F 1.6
 (xported to that command.)-.15 F 1.6(When checking mail, this)6.6 F
 (parameter holds the name of the mail \214le currently being check)144
-300 Q(ed.)-.1 E F1(Shell V)87 316.8 Q(ariables)-.92 E F0(The follo)108
-328.8 Q(wing v)-.25 E(ariables are set by the shell:)-.25 E F1 -.3(BA)
-108 345.6 S(SH).3 E F0(Expands to the full \214lename used to in)9.07 E
+324 Q(ed.)-.1 E F1(Shell V)87 340.8 Q(ariables)-.92 E F0(The follo)108
+352.8 Q(wing v)-.25 E(ariables are set by the shell:)-.25 E F1 -.3(BA)
+108 369.6 S(SH).3 E F0(Expands to the full \214lename used to in)9.07 E
 -.2(vo)-.4 G .2 -.1(ke t).2 H(his instance of).1 E F1(bash)2.5 E F0(.)A
-F1 -.3(BA)108 357.6 S(SHOPTS).3 E F0 2.549(Ac)144 369.6 S .049
+F1 -.3(BA)108 381.6 S(SHOPTS).3 E F0 2.549(Ac)144 393.6 S .049
 (olon-separated list of enabled shell options.)-2.549 F .049(Each w)
 5.049 F .049(ord in the list is a v)-.1 F .049(alid ar)-.25 F .049
-(gument for the)-.18 F F1<ad73>2.548 E F0 1.398(option to the)144 381.6
+(gument for the)-.18 F F1<ad73>2.548 E F0 1.398(option to the)144 405.6
 R F1(shopt)3.898 E F0 -.2(bu)3.898 G 1.398(iltin command \(see).2 F F2
 1.398(SHELL B)3.898 F(UIL)-.09 E 1.398(TIN COMMANDS)-.828 F F0(belo)
 3.648 E 3.898(w\). The)-.25 F(options)3.898 E .477(appearing in)144
-393.6 R F2 -.27(BA)2.977 G(SHOPTS).27 E F0 .477(are those reported as)
+417.6 R F2 -.27(BA)2.977 G(SHOPTS).27 E F0 .477(are those reported as)
 2.727 F/F3 10/Times-Italic@0 SF(on)3.207 E F0(by)3.217 E F1(shopt)2.977
 E F0 5.476(.I)C 2.976(ft)-5.476 G .476(his v)-2.976 F .476
-(ariable is in the en)-.25 F(vironment)-.4 E(when)144 405.6 Q F1(bash)
+(ariable is in the en)-.25 F(vironment)-.4 E(when)144 429.6 Q F1(bash)
 3.141 E F0 .642(starts up, each shell option in the list will be enable\
 d before reading an)3.141 F 3.142(ys)-.15 G .642(tartup \214les.)-3.142
-F(This v)144 417.6 Q(ariable is read-only)-.25 E(.)-.65 E F1 -.3(BA)108
-429.6 S(SHPID).3 E F0 .188(Expands to the process ID of the current)144
-441.6 R F1(bash)2.688 E F0 2.687(process. This)2.687 F(dif)2.687 E .187
+F(This v)144 441.6 Q(ariable is read-only)-.25 E(.)-.65 E F1 -.3(BA)108
+453.6 S(SHPID).3 E F0 .188(Expands to the process ID of the current)144
+465.6 R F1(bash)2.688 E F0 2.687(process. This)2.687 F(dif)2.687 E .187
 (fers from)-.25 F F1($$)2.687 E F0 .187(under certain circum-)2.687 F
-(stances, such as subshells that do not require)144 453.6 Q F1(bash)2.5
-E F0(to be re-initialized.)2.5 E F1 -.3(BA)108 465.6 S(SH_ALIASES).3 E
-F0 1.195(An associati)144 477.6 R 1.495 -.15(ve a)-.25 H 1.195(rray v)
+(stances, such as subshells that do not require)144 477.6 Q F1(bash)2.5
+E F0(to be re-initialized.)2.5 E F1 -.3(BA)108 489.6 S(SH_ALIASES).3 E
+F0 1.195(An associati)144 501.6 R 1.495 -.15(ve a)-.25 H 1.195(rray v)
 .15 F 1.195(ariable whose members correspond to the internal list of al\
-iases as main-)-.25 F .025(tained by the)144 489.6 R F1(alias)2.524 E F0
+iases as main-)-.25 F .025(tained by the)144 513.6 R F1(alias)2.524 E F0
 -.2(bu)2.524 G 2.524(iltin. Elements).2 F .024
 (added to this array appear in the alias list; unsetting array ele-)
-2.524 F(ments cause aliases to be remo)144 501.6 Q -.15(ve)-.15 G 2.5
-(df).15 G(rom the alias list.)-2.5 E F1 -.3(BA)108 513.6 S(SH_ARGC).3 E
-F0 .934(An array v)144 525.6 R .934(ariable whose v)-.25 F .934
+2.524 F(ments cause aliases to be remo)144 525.6 Q -.15(ve)-.15 G 2.5
+(df).15 G(rom the alias list.)-2.5 E F1 -.3(BA)108 537.6 S(SH_ARGC).3 E
+F0 .934(An array v)144 549.6 R .934(ariable whose v)-.25 F .934
 (alues are the number of parameters in each frame of the current)-.25 F
-F1(bash)3.435 E F0 -.15(exe)144 537.6 S .535(cution call stack.).15 F
+F1(bash)3.435 E F0 -.15(exe)144 561.6 S .535(cution call stack.).15 F
 .535(The number of parameters to the current subroutine \(shell functio\
-n or script)5.535 F -.15(exe)144 549.6 S .141(cuted with).15 F F1(.)
+n or script)5.535 F -.15(exe)144 573.6 S .141(cuted with).15 F F1(.)
 2.641 E F0(or)2.641 E F1(sour)2.641 E(ce)-.18 E F0 2.641(\)i)C 2.641(sa)
 -2.641 G 2.641(tt)-2.641 G .142(he top of the stack.)-2.641 F .142
 (When a subroutine is e)5.142 F -.15(xe)-.15 G .142
 (cuted, the number of).15 F 2.631(parameters passed is pushed onto)144
-561.6 R F2 -.27(BA)5.13 G(SH_ARGC).27 E/F4 9/Times-Roman@0 SF(.)A F0
+585.6 R F2 -.27(BA)5.13 G(SH_ARGC).27 E/F4 9/Times-Roman@0 SF(.)A F0
 2.63(The shell sets)7.13 F F2 -.27(BA)5.13 G(SH_ARGC).27 E F0 2.63
-(only when in)4.88 F -.15(ex)144 573.6 S(tended deb).15 E
+(only when in)4.88 F -.15(ex)144 597.6 S(tended deb).15 E
 (ugging mode \(see the description of the)-.2 E F1(extdeb)2.5 E(ug)-.2 E
 F0(option to the)2.5 E F1(shopt)2.5 E F0 -.2(bu)2.5 G(iltin belo).2 E
-(w\))-.25 E F1 -.3(BA)108 585.6 S(SH_ARGV).3 E F0 .979(An array v)144
-597.6 R .979(ariable containing all of the parameters in the current)
+(w\))-.25 E F1 -.3(BA)108 609.6 S(SH_ARGV).3 E F0 .979(An array v)144
+621.6 R .979(ariable containing all of the parameters in the current)
 -.25 F F1(bash)3.48 E F0 -.15(exe)3.48 G .98(cution call stack.).15 F
 (The)5.98 E .275(\214nal parameter of the last subroutine call is at th\
-e top of the stack; the \214rst parameter of the initial)144 609.6 R
-1.424(call is at the bottom.)144 621.6 R 1.424(When a subroutine is e)
+e top of the stack; the \214rst parameter of the initial)144 633.6 R
+1.424(call is at the bottom.)144 645.6 R 1.424(When a subroutine is e)
 6.424 F -.15(xe)-.15 G 1.424
 (cuted, the parameters supplied are pushed onto).15 F F2 -.27(BA)144
-633.6 S(SH_ARGV).27 E F4(.)A F0 2.197(The shell sets)6.697 F F2 -.27(BA)
+657.6 S(SH_ARGV).27 E F4(.)A F0 2.197(The shell sets)6.697 F F2 -.27(BA)
 4.697 G(SH_ARGV).27 E F0 2.197(only when in e)4.447 F 2.197(xtended deb)
--.15 F 2.197(ugging mode \(see the)-.2 F(description of the)144 645.6 Q
+-.15 F 2.197(ugging mode \(see the)-.2 F(description of the)144 669.6 Q
 F1(extdeb)2.5 E(ug)-.2 E F0(option to the)2.5 E F1(shopt)2.5 E F0 -.2
-(bu)2.5 G(iltin belo).2 E(w\))-.25 E F1 -.3(BA)108 657.6 S(SH_CMDS).3 E
-F0 .667(An associati)144 669.6 R .967 -.15(ve a)-.25 H .667(rray v).15 F
+(bu)2.5 G(iltin belo).2 E(w\))-.25 E F1 -.3(BA)108 681.6 S(SH_CMDS).3 E
+F0 .667(An associati)144 693.6 R .967 -.15(ve a)-.25 H .667(rray v).15 F
 .668(ariable whose members correspond to the internal hash table of com\
-mands)-.25 F .147(as maintained by the)144 681.6 R F1(hash)2.647 E F0
+mands)-.25 F .147(as maintained by the)144 705.6 R F1(hash)2.647 E F0
 -.2(bu)2.646 G 2.646(iltin. Elements).2 F .146
 (added to this array appear in the hash table; unsetting)2.646 F
-(array elements cause commands to be remo)144 693.6 Q -.15(ve)-.15 G 2.5
-(df).15 G(rom the hash table.)-2.5 E F1 -.3(BA)108 705.6 S(SH_COMMAND).3
-E F0 1.242(The command currently being e)144 717.6 R -.15(xe)-.15 G
-1.243(cuted or about to be e).15 F -.15(xe)-.15 G 1.243
-(cuted, unless the shell is e).15 F -.15(xe)-.15 G 1.243(cuting a).15 F
-(command as the result of a trap, in which case it is the command e)144
-729.6 Q -.15(xe)-.15 G(cuting at the time of the trap.).15 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(10)193.45 E 0 Cg EP
+(array elements cause commands to be remo)144 717.6 Q -.15(ve)-.15 G 2.5
+(df).15 G(rom the hash table.)-2.5 E(GNU Bash 4.3)72 768 Q
+(2014 February 2)141.79 E(10)190.95 E 0 Cg EP
 %%Page: 11 11
 %%BeginPageSetup
 BP
 %%EndPageSetup
 /F0 10/Times-Roman@0 SF -.35(BA)72 48 S 389.54(SH\(1\) B).35 F(ASH\(1\))
--.35 E/F1 10/Times-Bold@0 SF -.3(BA)108 84 S(SH_EXECUTION_STRING).3 E F0
-(The command ar)144 96 Q(gument to the)-.18 E F1<ad63>2.5 E F0(in)2.5 E
--.2(vo)-.4 G(cation option.).2 E F1 -.3(BA)108 108 S(SH_LINENO).3 E F0
-.693(An array v)144 120 R .692(ariable whose members are the line numbe\
-rs in source \214les where each corresponding)-.25 F .969(member of)144
-132 R/F2 9/Times-Bold@0 SF(FUNCN)3.469 E(AME)-.18 E F0 -.1(wa)3.219 G
-3.469(si).1 G -1.9 -.4(nv o)-3.469 H -.1(ke).4 G(d.).1 E F1(${B)5.969 E
+-.35 E/F1 10/Times-Bold@0 SF -.3(BA)108 84 S(SH_COMMAND).3 E F0 1.242
+(The command currently being e)144 96 R -.15(xe)-.15 G 1.243
+(cuted or about to be e).15 F -.15(xe)-.15 G 1.243
+(cuted, unless the shell is e).15 F -.15(xe)-.15 G 1.243(cuting a).15 F
+(command as the result of a trap, in which case it is the command e)144
+108 Q -.15(xe)-.15 G(cuting at the time of the trap.).15 E F1 -.3(BA)108
+120 S(SH_EXECUTION_STRING).3 E F0(The command ar)144 132 Q
+(gument to the)-.18 E F1<ad63>2.5 E F0(in)2.5 E -.2(vo)-.4 G
+(cation option.).2 E F1 -.3(BA)108 144 S(SH_LINENO).3 E F0 .693
+(An array v)144 156 R .692(ariable whose members are the line numbers i\
+n source \214les where each corresponding)-.25 F .969(member of)144 168
+R/F2 9/Times-Bold@0 SF(FUNCN)3.469 E(AME)-.18 E F0 -.1(wa)3.219 G 3.469
+(si).1 G -1.9 -.4(nv o)-3.469 H -.1(ke).4 G(d.).1 E F1(${B)5.969 E
 (ASH_LINENO[)-.3 E/F3 10/Times-Italic@0 SF($i)A F1(]})A F0 .97
-(is the line number in the source)3.469 F 14.672(\214le \()144 144 R F1
+(is the line number in the source)3.469 F 14.672(\214le \()144 180 R F1
 (${B)A(ASH_SOURCE[)-.3 E F3($i+1)A F1(]})A F0 17.172(\)w)C(here)-17.172
 E F1(${FUNCN)17.172 E(AME[)-.2 E F3($i)A F1(]})A F0 -.1(wa)17.172 G
-17.171(sc).1 G 14.671(alled \(or)-17.171 F F1(${B)144 156 Q(ASH_LINENO[)
+17.171(sc).1 G 14.671(alled \(or)-17.171 F F1(${B)144 192 Q(ASH_LINENO[)
 -.3 E F3($i-1)A F1(]})A F0 .115
 (if referenced within another shell function\).)2.615 F(Use)5.115 E F2
 (LINENO)2.615 E F0 .115(to obtain the)2.365 F(current line number)144
-168 Q(.)-.55 E F1 -.3(BA)108 180 S(SH_REMA).3 E(TCH)-.95 E F0 .006
-(An array v)144 192 R .006(ariable whose members are assigned by the)
+204 Q(.)-.55 E F1 -.3(BA)108 216 S(SH_REMA).3 E(TCH)-.95 E F0 .006
+(An array v)144 228 R .006(ariable whose members are assigned by the)
 -.25 F F1(=~)2.506 E F0 .005(binary operator to the)2.506 F F1([[)2.505
-E F0 .005(conditional com-)2.505 F 2.506(mand. The)144 204 R .007
+E F0 .005(conditional com-)2.505 F 2.506(mand. The)144 240 R .007
 (element with inde)2.506 F 2.507(x0i)-.15 G 2.507(st)-2.507 G .007
 (he portion of the string matching the entire re)-2.507 F .007(gular e)
--.15 F(xpression.)-.15 E .998(The element with inde)144 216 R(x)-.15 E
+-.15 F(xpression.)-.15 E .998(The element with inde)144 252 R(x)-.15 E
 F3(n)3.498 E F0 .997(is the portion of the string matching the)3.498 F
 F3(n)3.497 E F0 .997(th parenthesized sube)B(xpres-)-.15 E 2.5
-(sion. This)144 228 R -.25(va)2.5 G(riable is read-only).25 E(.)-.65 E
-F1 -.3(BA)108 240 S(SH_SOURCE).3 E F0 .125(An array v)144 252 R .125(ar\
+(sion. This)144 264 R -.25(va)2.5 G(riable is read-only).25 E(.)-.65 E
+F1 -.3(BA)108 276 S(SH_SOURCE).3 E F0 .125(An array v)144 288 R .125(ar\
 iable whose members are the source \214lenames where the corresponding \
-shell function)-.25 F .781(names in the)144 264 R F2(FUNCN)3.28 E(AME)
+shell function)-.25 F .781(names in the)144 300 R F2(FUNCN)3.28 E(AME)
 -.18 E F0 .78(array v)3.03 F .78(ariable are de\214ned.)-.25 F .78
 (The shell function)5.78 F F1(${FUNCN)3.28 E(AME[)-.2 E F3($i)A F1(]})A
-F0(is)3.28 E(de\214ned in the \214le)144 276 Q F1(${B)2.5 E(ASH_SOURCE[)
+F0(is)3.28 E(de\214ned in the \214le)144 312 Q F1(${B)2.5 E(ASH_SOURCE[)
 -.3 E F3($i)A F1(]})A F0(and called from)2.5 E F1(${B)2.5 E(ASH_SOURCE[)
--.3 E F3($i+1)A F1(]})A F0(.)A F1 -.3(BA)108 288 S(SH_SUBSHELL).3 E F0
-.296(Incremented by one within each subshell or subshell en)144 300 R
+-.3 E F3($i+1)A F1(]})A F0(.)A F1 -.3(BA)108 324 S(SH_SUBSHELL).3 E F0
+.296(Incremented by one within each subshell or subshell en)144 336 R
 .296(vironment when the shell be)-.4 F .297(gins e)-.15 F -.15(xe)-.15 G
-(cuting).15 E(in that en)144 312 Q 2.5(vironment. The)-.4 F(initial v)
-2.5 E(alue is 0.)-.25 E F1 -.3(BA)108 324 S(SH_VERSINFO).3 E F0 2.645
-(Ar)144 336 S .145(eadonly array v)-2.645 F .144
+(cuting).15 E(in that en)144 348 Q 2.5(vironment. The)-.4 F(initial v)
+2.5 E(alue is 0.)-.25 E F1 -.3(BA)108 360 S(SH_VERSINFO).3 E F0 2.645
+(Ar)144 372 S .145(eadonly array v)-2.645 F .144
 (ariable whose members hold v)-.25 F .144
 (ersion information for this instance of)-.15 F F1(bash)2.644 E F0 5.144
-(.T)C(he)-5.144 E -.25(va)144 348 S
+(.T)C(he)-5.144 E -.25(va)144 384 S
 (lues assigned to the array members are as follo).25 E(ws:)-.25 E F1 -.3
-(BA)144 366 S(SH_VERSINFO[).3 E F0(0)A F1(])A F0(The major v)24.74 E
+(BA)144 402 S(SH_VERSINFO[).3 E F0(0)A F1(])A F0(The major v)24.74 E
 (ersion number \(the)-.15 E F3 -.37(re)2.5 G(lease).37 E F0(\).)A F1 -.3
-(BA)144 378 S(SH_VERSINFO[).3 E F0(1)A F1(])A F0(The minor v)24.74 E
+(BA)144 414 S(SH_VERSINFO[).3 E F0(1)A F1(])A F0(The minor v)24.74 E
 (ersion number \(the)-.15 E F3(ver)2.5 E(sion)-.1 E F0(\).)A F1 -.3(BA)
-144 390 S(SH_VERSINFO[).3 E F0(2)A F1(])A F0(The patch le)24.74 E -.15
-(ve)-.25 G(l.).15 E F1 -.3(BA)144 402 S(SH_VERSINFO[).3 E F0(3)A F1(])A
-F0(The b)24.74 E(uild v)-.2 E(ersion.)-.15 E F1 -.3(BA)144 414 S
+144 426 S(SH_VERSINFO[).3 E F0(2)A F1(])A F0(The patch le)24.74 E -.15
+(ve)-.25 G(l.).15 E F1 -.3(BA)144 438 S(SH_VERSINFO[).3 E F0(3)A F1(])A
+F0(The b)24.74 E(uild v)-.2 E(ersion.)-.15 E F1 -.3(BA)144 450 S
 (SH_VERSINFO[).3 E F0(4)A F1(])A F0(The release status \(e.g.,)24.74 E
-F3(beta1)2.5 E F0(\).)A F1 -.3(BA)144 426 S(SH_VERSINFO[).3 E F0(5)A F1
+F3(beta1)2.5 E F0(\).)A F1 -.3(BA)144 462 S(SH_VERSINFO[).3 E F0(5)A F1
 (])A F0(The v)24.74 E(alue of)-.25 E F2(MA)2.5 E(CHTYPE)-.495 E/F4 9
-/Times-Roman@0 SF(.)A F1 -.3(BA)108 438 S(SH_VERSION).3 E F0
-(Expands to a string describing the v)144 450 Q
+/Times-Roman@0 SF(.)A F1 -.3(BA)108 474 S(SH_VERSION).3 E F0
+(Expands to a string describing the v)144 486 Q
 (ersion of this instance of)-.15 E F1(bash)2.5 E F0(.)A F1(COMP_CW)108
-462 Q(ORD)-.1 E F0 .396(An inde)144 474 R 2.896(xi)-.15 G(nto)-2.896 E
+498 Q(ORD)-.1 E F0 .396(An inde)144 510 R 2.896(xi)-.15 G(nto)-2.896 E
 F1(${COMP_W)2.896 E(ORDS})-.1 E F0 .396(of the w)2.896 F .396
 (ord containing the current cursor position.)-.1 F .397(This v)5.397 F
-(ari-)-.25 E 1.181(able is a)144 486 R -.25(va)-.2 G 1.181
+(ari-)-.25 E 1.181(able is a)144 522 R -.25(va)-.2 G 1.181
 (ilable only in shell functions in).25 F -.2(vo)-.4 G -.1(ke).2 G 3.681
 (db).1 G 3.681(yt)-3.681 G 1.18(he programmable completion f)-3.681 F
-1.18(acilities \(see)-.1 F F1(Pr)144 498 Q(ogrammable Completion)-.18 E
-F0(belo)2.5 E(w\).)-.25 E F1(COMP_KEY)108 510 Q F0(The k)144 522 Q .3
+1.18(acilities \(see)-.1 F F1(Pr)144 534 Q(ogrammable Completion)-.18 E
+F0(belo)2.5 E(w\).)-.25 E F1(COMP_KEY)108 546 Q F0(The k)144 558 Q .3
 -.15(ey \()-.1 H(or \214nal k).15 E .3 -.15(ey o)-.1 H 2.5(fak).15 G .3
 -.15(ey s)-2.6 H(equence\) used to in).15 E -.2(vo)-.4 G .2 -.1(ke t).2
-H(he current completion function.).1 E F1(COMP_LINE)108 534 Q F0 1.207
-(The current command line.)144 546 R 1.208(This v)6.208 F 1.208
+H(he current completion function.).1 E F1(COMP_LINE)108 570 Q F0 1.207
+(The current command line.)144 582 R 1.208(This v)6.208 F 1.208
 (ariable is a)-.25 F -.25(va)-.2 G 1.208
 (ilable only in shell functions and e).25 F 1.208(xternal com-)-.15 F
-2.849(mands in)144 558 R -.2(vo)-.4 G -.1(ke).2 G 5.349(db).1 G 5.349
+2.849(mands in)144 594 R -.2(vo)-.4 G -.1(ke).2 G 5.349(db).1 G 5.349
 (yt)-5.349 G 2.849(he programmable completion f)-5.349 F 2.849
 (acilities \(see)-.1 F F1(Pr)5.349 E 2.848(ogrammable Completion)-.18 F
-F0(belo)144 570 Q(w\).)-.25 E F1(COMP_POINT)108 582 Q F0 .666(The inde)
-144 594 R 3.166(xo)-.15 G 3.166(ft)-3.166 G .666
+F0(belo)144 606 Q(w\).)-.25 E F1(COMP_POINT)108 618 Q F0 .666(The inde)
+144 630 R 3.166(xo)-.15 G 3.166(ft)-3.166 G .666
 (he current cursor position relati)-3.166 F .966 -.15(ve t)-.25 H 3.166
 (ot).15 G .666(he be)-3.166 F .666(ginning of the current command.)-.15
 F .667(If the)5.667 F .535
 (current cursor position is at the end of the current command, the v)144
-606 R .534(alue of this v)-.25 F .534(ariable is equal to)-.25 F F1
-(${#COMP_LINE})144 618 Q F0 7.005(.T)C 2.005(his v)-7.005 F 2.005
+642 R .534(alue of this v)-.25 F .534(ariable is equal to)-.25 F F1
+(${#COMP_LINE})144 654 Q F0 7.005(.T)C 2.005(his v)-7.005 F 2.005
 (ariable is a)-.25 F -.25(va)-.2 G 2.006
 (ilable only in shell functions and e).25 F 2.006(xternal commands)-.15
-F(in)144 630 Q -.2(vo)-.4 G -.1(ke).2 G 2.5(db).1 G 2.5(yt)-2.5 G
+F(in)144 666 Q -.2(vo)-.4 G -.1(ke).2 G 2.5(db).1 G 2.5(yt)-2.5 G
 (he programmable completion f)-2.5 E(acilities \(see)-.1 E F1(Pr)2.5 E
 (ogrammable Completion)-.18 E F0(belo)2.5 E(w\).)-.25 E F1(COMP_TYPE)108
-642 Q F0 .042(Set to an inte)144 654 R .042(ger v)-.15 F .041(alue corr\
+678 Q F0 .042(Set to an inte)144 690 R .042(ger v)-.15 F .041(alue corr\
 esponding to the type of completion attempted that caused a completion)
--.25 F .337(function to be called:)144 666 R F3 -.5(TA)2.837 G(B).5 E F0
+-.25 F .337(function to be called:)144 702 R F3 -.5(TA)2.837 G(B).5 E F0
 2.837(,f)C .337(or normal completion,)-2.837 F F3(?)2.837 E F0 2.837(,f)
 C .337(or listing completions after successi)-2.837 F .638 -.15(ve t)
--.25 H(abs,).15 E F3(!)144 678 Q F0 4.092(,f)C 1.592
+-.25 H(abs,).15 E F3(!)144 714 Q F0 4.092(,f)C 1.592
 (or listing alternati)-4.092 F -.15(ve)-.25 G 4.092(so).15 G 4.092(np)
 -4.092 G 1.592(artial w)-4.092 F 1.592(ord completion,)-.1 F F3(@)4.092
 E F0 4.092(,t)C 4.092(ol)-4.092 G 1.592(ist completions if the w)-4.092
-F 1.591(ord is not)-.1 F 1.552(unmodi\214ed, or)144 690 R F3(%)4.052 E
+F 1.591(ord is not)-.1 F 1.552(unmodi\214ed, or)144 726 R F3(%)4.052 E
 F0 4.052(,f)C 1.552(or menu completion.)-4.052 F 1.552(This v)6.552 F
 1.552(ariable is a)-.25 F -.25(va)-.2 G 1.552
-(ilable only in shell functions and).25 F -.15(ex)144 702 S 2.929
-(ternal commands in).15 F -.2(vo)-.4 G -.1(ke).2 G 5.429(db).1 G 5.429
-(yt)-5.429 G 2.929(he programmable completion f)-5.429 F 2.929
-(acilities \(see)-.1 F F1(Pr)5.428 E(ogrammable)-.18 E(Completion)144
-714 Q F0(belo)2.5 E(w\).)-.25 E(GNU Bash 4.3)72 768 Q(2014 January 6)
-144.29 E(11)193.45 E 0 Cg EP
+(ilable only in shell functions and).25 F(GNU Bash 4.3)72 768 Q
+(2014 February 2)141.79 E(11)190.95 E 0 Cg EP
 %%Page: 12 12
 %%BeginPageSetup
 BP
 %%EndPageSetup
 /F0 10/Times-Roman@0 SF -.35(BA)72 48 S 389.54(SH\(1\) B).35 F(ASH\(1\))
--.35 E/F1 10/Times-Bold@0 SF(COMP_W)108 84 Q(ORDBREAKS)-.1 E F0 1.335
-(The set of characters that the)144 96 R F1 -.18(re)3.836 G(adline).18 E
-F0 1.336(library treats as w)3.836 F 1.336
+-.35 E -.15(ex)144 84 S 2.929(ternal commands in).15 F -.2(vo)-.4 G -.1
+(ke).2 G 5.429(db).1 G 5.429(yt)-5.429 G 2.929
+(he programmable completion f)-5.429 F 2.929(acilities \(see)-.1 F/F1 10
+/Times-Bold@0 SF(Pr)5.428 E(ogrammable)-.18 E(Completion)144 96 Q F0
+(belo)2.5 E(w\).)-.25 E F1(COMP_W)108 108 Q(ORDBREAKS)-.1 E F0 1.335
+(The set of characters that the)144 120 R F1 -.18(re)3.836 G(adline).18
+E F0 1.336(library treats as w)3.836 F 1.336
 (ord separators when performing w)-.1 F(ord)-.1 E 3.126(completion. If)
-144 108 R/F2 9/Times-Bold@0 SF(COMP_W)3.126 E(ORDBREAKS)-.09 E F0 .626
+144 132 R/F2 9/Times-Bold@0 SF(COMP_W)3.126 E(ORDBREAKS)-.09 E F0 .626
 (is unset, it loses its special properties, e)2.876 F -.15(ve)-.25 G
 3.125(ni).15 G 3.125(fi)-3.125 G 3.125(ti)-3.125 G 3.125(ss)-3.125 G
-(ubse-)-3.125 E(quently reset.)144 120 Q F1(COMP_W)108 132 Q(ORDS)-.1 E
-F0 .653(An array v)144 144 R .653(ariable \(see)-.25 F F1(Arrays)3.153 E
+(ubse-)-3.125 E(quently reset.)144 144 Q F1(COMP_W)108 156 Q(ORDS)-.1 E
+F0 .653(An array v)144 168 R .653(ariable \(see)-.25 F F1(Arrays)3.153 E
 F0(belo)3.153 E .654(w\) consisting of the indi)-.25 F .654(vidual w)
--.25 F .654(ords in the current command)-.1 F 4.333(line. The)144 156 R
+-.25 F .654(ords in the current command)-.1 F 4.333(line. The)144 180 R
 1.832(line is split into w)4.332 F 1.832(ords as)-.1 F F1 -.18(re)4.332
 G(adline).18 E F0 -.1(wo)4.332 G 1.832(uld split it, using).1 F F2
 (COMP_W)4.332 E(ORDBREAKS)-.09 E F0(as)4.082 E .831(described abo)144
-168 R -.15(ve)-.15 G 5.831(.T).15 G .831(his v)-5.831 F .831
+192 R -.15(ve)-.15 G 5.831(.T).15 G .831(his v)-5.831 F .831
 (ariable is a)-.25 F -.25(va)-.2 G .832
 (ilable only in shell functions in).25 F -.2(vo)-.4 G -.1(ke).2 G 3.332
 (db).1 G 3.332(yt)-3.332 G .832(he programmable)-3.332 F(completion f)
-144 180 Q(acilities \(see)-.1 E F1(Pr)2.5 E(ogrammable Completion)-.18 E
-F0(belo)2.5 E(w\).)-.25 E F1(COPR)108 192 Q(OC)-.3 E F0 .169(An array v)
-144 204 R .169(ariable \(see)-.25 F F1(Arrays)2.669 E F0(belo)2.669 E
+144 204 Q(acilities \(see)-.1 E F1(Pr)2.5 E(ogrammable Completion)-.18 E
+F0(belo)2.5 E(w\).)-.25 E F1(COPR)108 216 Q(OC)-.3 E F0 .169(An array v)
+144 228 R .169(ariable \(see)-.25 F F1(Arrays)2.669 E F0(belo)2.669 E
 .169
 (w\) created to hold the \214le descriptors for output from and input)
--.25 F(to an unnamed coprocess \(see)144 216 Q F1(Copr)2.5 E(ocesses)
--.18 E F0(abo)2.5 E -.15(ve)-.15 G(\).).15 E F1(DIRST)108 228 Q -.55(AC)
--.9 G(K).55 E F0 2.26(An array v)144 240 R 2.26(ariable \(see)-.25 F F1
+-.25 F(to an unnamed coprocess \(see)144 240 Q F1(Copr)2.5 E(ocesses)
+-.18 E F0(abo)2.5 E -.15(ve)-.15 G(\).).15 E F1(DIRST)108 252 Q -.55(AC)
+-.9 G(K).55 E F0 2.26(An array v)144 264 R 2.26(ariable \(see)-.25 F F1
 (Arrays)4.76 E F0(belo)4.76 E 2.26
 (w\) containing the current contents of the directory stack.)-.25 F
-1.095(Directories appear in the stack in the order the)144 252 R 3.594
+1.095(Directories appear in the stack in the order the)144 276 R 3.594
 (ya)-.15 G 1.094(re displayed by the)-3.594 F F1(dirs)3.594 E F0 -.2(bu)
 3.594 G 3.594(iltin. Assigning).2 F(to)3.594 E 1.431
-(members of this array v)144 264 R 1.432
+(members of this array v)144 288 R 1.432
 (ariable may be used to modify directories already in the stack, b)-.25
-F 1.432(ut the)-.2 F F1(pushd)144 276 Q F0(and)2.746 E F1(popd)2.746 E
+F 1.432(ut the)-.2 F F1(pushd)144 300 Q F0(and)2.746 E F1(popd)2.746 E
 F0 -.2(bu)2.746 G .246(iltins must be used to add and remo).2 F .546
 -.15(ve d)-.15 H 2.746(irectories. Assignment).15 F .246(to this v)2.746
-F(ariable)-.25 E .35(will not change the current directory)144 288 R
+F(ariable)-.25 E .35(will not change the current directory)144 312 R
 5.35(.I)-.65 G(f)-5.35 E F2(DIRST)2.85 E -.495(AC)-.81 G(K).495 E F0 .35
 (is unset, it loses its special properties, e)2.6 F -.15(ve)-.25 G 2.851
-(ni).15 G(f)-2.851 E(it is subsequently reset.)144 300 Q F1(EUID)108 312
+(ni).15 G(f)-2.851 E(it is subsequently reset.)144 324 Q F1(EUID)108 336
 Q F0 1.104(Expands to the ef)11 F(fecti)-.25 E 1.403 -.15(ve u)-.25 H
 1.103(ser ID of the current user).15 F 3.603(,i)-.4 G 1.103
 (nitialized at shell startup.)-3.603 F 1.103(This v)6.103 F 1.103
-(ariable is)-.25 F(readonly)144 324 Q(.)-.65 E F1(FUNCN)108 336 Q(AME)
--.2 E F0 .478(An array v)144 348 R .479
+(ariable is)-.25 F(readonly)144 348 Q(.)-.65 E F1(FUNCN)108 360 Q(AME)
+-.2 E F0 .478(An array v)144 372 R .479
 (ariable containing the names of all shell functions currently in the e)
 -.25 F -.15(xe)-.15 G .479(cution call stack.).15 F .277
-(The element with inde)144 360 R 2.777(x0i)-.15 G 2.777(st)-2.777 G .276
+(The element with inde)144 384 R 2.777(x0i)-.15 G 2.777(st)-2.777 G .276
 (he name of an)-2.777 F 2.776(yc)-.15 G(urrently-e)-2.776 E -.15(xe)-.15
 G .276(cuting shell function.).15 F .276(The bottom-most)5.276 F .384
-(element \(the one with the highest inde)144 372 R .384(x\) is)-.15 F/F3
+(element \(the one with the highest inde)144 396 R .384(x\) is)-.15 F/F3
 10/Courier@0 SF("main")2.884 E F0 5.384(.T)C .384(his v)-5.384 F .385
 (ariable e)-.25 F .385(xists only when a shell func-)-.15 F .035
-(tion is e)144 384 R -.15(xe)-.15 G 2.535(cuting. Assignments).15 F(to)
+(tion is e)144 408 R -.15(xe)-.15 G 2.535(cuting. Assignments).15 F(to)
 2.535 E F2(FUNCN)2.535 E(AME)-.18 E F0(ha)2.285 E .335 -.15(ve n)-.2 H
 2.535(oe).15 G -.25(ff)-2.535 G .035(ect and return an error status.).25
-F(If)5.034 E F2(FUNC-)2.534 E -.18(NA)144 396 S(ME).18 E F0
+F(If)5.034 E F2(FUNC-)2.534 E -.18(NA)144 420 S(ME).18 E F0
 (is unset, it loses its special properties, e)2.25 E -.15(ve)-.25 G 2.5
 (ni).15 G 2.5(fi)-2.5 G 2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.)
--2.5 E .11(This v)144 414 R .111(ariable can be used with)-.25 F F1 -.3
+-2.5 E .11(This v)144 438 R .111(ariable can be used with)-.25 F F1 -.3
 (BA)2.611 G(SH_LINENO).3 E F0(and)2.611 E F1 -.3(BA)2.611 G(SH_SOURCE).3
 E F0 5.111(.E)C .111(ach element of)-5.111 F F1(FUNC-)2.611 E -.2(NA)144
-426 S(ME).2 E F0 1.404(has corresponding elements in)3.904 F F1 -.3(BA)
+450 S(ME).2 E F0 1.404(has corresponding elements in)3.904 F F1 -.3(BA)
 3.904 G(SH_LINENO).3 E F0(and)3.904 E F1 -.3(BA)3.904 G(SH_SOURCE).3 E
-F0 1.404(to describe the)3.904 F .012(call stack.)144 438 R -.15(Fo)
+F0 1.404(to describe the)3.904 F .012(call stack.)144 462 R -.15(Fo)
 5.012 G 2.512(ri).15 G(nstance,)-2.512 E F1(${FUNCN)2.512 E(AME[)-.2 E
 /F4 10/Times-Italic@0 SF($i)A F1(]})A F0 -.1(wa)2.512 G 2.512(sc).1 G
 .012(alled from the \214le)-2.512 F F1(${B)2.512 E(ASH_SOURCE[)-.3 E F4
-($i+1)A F1(]})A F0 1.184(at line number)144 450 R F1(${B)3.684 E
+($i+1)A F1(]})A F0 1.184(at line number)144 474 R F1(${B)3.684 E
 (ASH_LINENO[)-.3 E F4($i)A F1(]})A F0 6.184(.T)C(he)-6.184 E F1(caller)
 3.683 E F0 -.2(bu)3.683 G 1.183
 (iltin displays the current call stack using).2 F(this information.)144
-462 Q F1(GR)108 474 Q(OUPS)-.3 E F0 1.228(An array v)144 486 R 1.228(ar\
+486 Q F1(GR)108 498 Q(OUPS)-.3 E F0 1.228(An array v)144 510 R 1.228(ar\
 iable containing the list of groups of which the current user is a memb\
-er)-.25 F 6.229(.A)-.55 G(ssign-)-6.229 E .597(ments to)144 498 R F2(GR)
+er)-.25 F 6.229(.A)-.55 G(ssign-)-6.229 E .597(ments to)144 522 R F2(GR)
 3.097 E(OUPS)-.27 E F0(ha)2.847 E .897 -.15(ve n)-.2 H 3.097(oe).15 G
 -.25(ff)-3.097 G .597(ect and return an error status.).25 F(If)5.597 E
 F2(GR)3.097 E(OUPS)-.27 E F0 .597(is unset, it loses its spe-)2.847 F
-(cial properties, e)144 510 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(fi)-2.5 G
-2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.)-2.5 E F1(HISTCMD)108 522
-Q F0 .355(The history number)144 534 R 2.855(,o)-.4 G 2.855(ri)-2.855 G
+(cial properties, e)144 534 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(fi)-2.5 G
+2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.)-2.5 E F1(HISTCMD)108 546
+Q F0 .355(The history number)144 558 R 2.855(,o)-.4 G 2.855(ri)-2.855 G
 (nde)-2.855 E 2.856(xi)-.15 G 2.856(nt)-2.856 G .356
 (he history list, of the current command.)-2.856 F(If)5.356 E F2
 (HISTCMD)2.856 E F0 .356(is unset, it)2.606 F
-(loses its special properties, e)144 546 Q -.15(ve)-.25 G 2.5(ni).15 G
+(loses its special properties, e)144 570 Q -.15(ve)-.25 G 2.5(ni).15 G
 2.5(fi)-2.5 G 2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.)-2.5 E F1
-(HOSTN)108 558 Q(AME)-.2 E F0
-(Automatically set to the name of the current host.)144 570 Q F1
-(HOSTTYPE)108 582 Q F0 .223(Automatically set to a string that uniquely\
- describes the type of machine on which)144 594 R F1(bash)2.722 E F0
-.222(is e)2.722 F -.15(xe)-.15 G(cut-).15 E 2.5(ing. The)144 606 R(def)
-2.5 E(ault is system-dependent.)-.1 E F1(LINENO)108 618 Q F0 1.408(Each\
+(HOSTN)108 582 Q(AME)-.2 E F0
+(Automatically set to the name of the current host.)144 594 Q F1
+(HOSTTYPE)108 606 Q F0 .223(Automatically set to a string that uniquely\
+ describes the type of machine on which)144 618 R F1(bash)2.722 E F0
+.222(is e)2.722 F -.15(xe)-.15 G(cut-).15 E 2.5(ing. The)144 630 R(def)
+2.5 E(ault is system-dependent.)-.1 E F1(LINENO)108 642 Q F0 1.408(Each\
  time this parameter is referenced, the shell substitutes a decimal num\
-ber representing the)144 630 R .078(current sequential line number \(st\
-arting with 1\) within a script or function.)144 642 R .078
-(When not in a script or)5.078 F .306(function, the v)144 654 R .306
+ber representing the)144 654 R .078(current sequential line number \(st\
+arting with 1\) within a script or function.)144 666 R .078
+(When not in a script or)5.078 F .306(function, the v)144 678 R .306
 (alue substituted is not guaranteed to be meaningful.)-.25 F(If)5.307 E
 F2(LINENO)2.807 E F0 .307(is unset, it loses its)2.557 F
-(special properties, e)144 666 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(fi)-2.5
-G 2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.)-2.5 E F1(MA)108 678 Q
+(special properties, e)144 690 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(fi)-2.5
+G 2.5(ti)-2.5 G 2.5(ss)-2.5 G(ubsequently reset.)-2.5 E F1(MA)108 702 Q
 (CHTYPE)-.55 E F0 .898(Automatically set to a string that fully describ\
-es the system type on which)144 690 R F1(bash)3.398 E F0 .898(is e)3.398
-F -.15(xe)-.15 G .898(cuting, in).15 F(the standard GNU)144 702 Q F4
+es the system type on which)144 714 R F1(bash)3.398 E F0 .898(is e)3.398
+F -.15(xe)-.15 G .898(cuting, in).15 F(the standard GNU)144 726 Q F4
 (cpu-company-system)2.5 E F0 2.5(format. The)2.5 F(def)2.5 E
-(ault is system-dependent.)-.1 E(GNU Bash 4.3)72 768 Q(2014 January 6)
-144.29 E(12)193.45 E 0 Cg EP
+(ault is system-dependent.)-.1 E(GNU Bash 4.3)72 768 Q(2014 February 2)
+141.79 E(12)190.95 E 0 Cg EP
 %%Page: 13 13
 %%BeginPageSetup
 BP
@@ -1820,7 +1826,7 @@ F1 .371(SHELL B)2.871 F(UIL)-.1 E .371(TIN COMMANDS)-.92 F F0 .372
 4.028 E .248(set to a v)144 729.6 R .248(alue that is not one of the v)
 -.25 F .248(alid compatibility le)-.25 F -.15(ve)-.25 G .249
 (ls, the shell prints an error message and).15 F(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(13)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(13)190.95 E 0 Cg EP
 %%Page: 14 14
 %%BeginPageSetup
 BP
@@ -1936,7 +1942,7 @@ G .558(alue of)-3.308 F F2(ignor)3.068 E(edups)-.37 E F0 .558
 (all pre)144 720 R .698
 (vious lines matching the current line to be remo)-.25 F -.15(ve)-.15 G
 3.198(df).15 G .698(rom the history list before that line is)-3.198 F
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(14)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(14)190.95 E 0 Cg EP
 %%Page: 15 15
 %%BeginPageSetup
 BP
@@ -2060,7 +2066,7 @@ E F3(LANG)108 708 Q F0 1.239(Used to determine the locale cate)7.11 F
 1.239(gory for an)-.15 F 3.739(yc)-.15 G(ate)-3.739 E 1.24
 (gory not speci\214cally selected with a v)-.15 F(ariable)-.25 E
 (starting with)144 720 Q F3(LC_)2.5 E F0(.)A(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(15)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(15)190.95 E 0 Cg EP
 %%Page: 16 16
 %%BeginPageSetup
 BP
@@ -2168,7 +2174,7 @@ F F2(PR)2.565 E(OMPTING)-.27 E F0(belo)2.315 E .065
 (alue of this parameter is e)-.25 F .117(xpanded as with)-.15 F F2(PS1)
 2.617 E F0 .118(and used as the secondary prompt string.)2.368 F(The)
 5.118 E(def)144 720 Q(ault is `)-.1 E(`)-.74 E F1(>)A F0 -.74('')2.5 G
-(.).74 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(16)193.45 E 0 Cg
+(.).74 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(16)190.95 E 0 Cg
 EP
 %%Page: 17 17
 %%BeginPageSetup
@@ -2288,7 +2294,7 @@ E F1(histchars)108 668.4 Q F0 2.069(The tw)144 680.4 R 4.57(oo)-.1 G
 (ing one string for another in the command.)144 728.4 R .575(The def)
 5.575 F .575(ault is `)-.1 F F1(^)A F0 3.075('. The)B .576
 (optional third character is the)3.076 F(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(17)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(17)190.95 E 0 Cg EP
 %%Page: 18 18
 %%BeginPageSetup
 BP
@@ -2443,7 +2449,7 @@ F0 2.767(]d)C(estro)-2.767 E .267(ys the array element at inde)-.1 F(x)
 (name)108 724.8 Q F0([)A F2(subscript)A F0(], where)A F2(subscript)2.5 E
 F0(is)2.5 E F1(*)2.5 E F0(or)2.5 E F1(@)2.5 E F0 2.5(,r)C(emo)-2.5 E
 -.15(ve)-.15 G 2.5(st).15 G(he entire array)-2.5 E(.)-.65 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(18)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(18)190.95 E 0 Cg EP
 %%Page: 19 19
 %%BeginPageSetup
 BP
@@ -2580,7 +2586,7 @@ as shorthand when the common pre\214x of the strings to be generated is)
 (appears identically in the output.)3.015 F .515(The same w)5.515 F .515
 (ord is output as)-.1 F F3 .514(\214le1 \214le2)4.925 F F0 .514(after e)
 3.034 F .514(xpansion by)-.15 F F1(bash)3.014 E F0(.)A(GNU Bash 4.3)72
-768 Q(2014 January 6)144.29 E(19)193.45 E 0 Cg EP
+768 Q(2014 February 2)141.79 E(19)190.95 E 0 Cg EP
 %%Page: 20 20
 %%BeginPageSetup
 BP
@@ -2706,7 +2712,7 @@ G .278(he v)-5.278 F .278(alue of)-.25 F F3(par)4.028 E(ameter)-.15 E F0
 .278(is then substituted.)3.508 F .279
 (Positional parameters and special param-)5.278 F
 (eters may not be assigned to in this w)144 712.8 Q(ay)-.1 E(.)-.65 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(20)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(20)190.95 E 0 Cg EP
 %%Page: 21 21
 %%BeginPageSetup
 BP
@@ -2834,7 +2840,7 @@ A F0([)A F1(@)A F0(]})A(${)108 609.6 Q F2(!)A F1(name)A F0([)A F1(*)A F0
 -3.473 F 3.473(xo)-.15 G(f)-3.473 E F1(par)3.473 E(ameter)-.15 E F0
 3.472(,s)C 3.472(on)-3.472 G -2.25 -.15(eg a)-3.472 H(ti).15 E 1.272
 -.15(ve i)-.25 H .972(ndices count back).15 F(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(21)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(21)190.95 E 0 Cg EP
 %%Page: 22 22
 %%BeginPageSetup
 BP
@@ -2970,7 +2976,7 @@ F1 1.697(Command substitution)108 660 R F0(allo)4.197 E 1.697
 A F2<92>A(Bash)108 729.6 Q F0 1.709(performs the e)4.209 F 1.709
 (xpansion by e)-.15 F -.15(xe)-.15 G(cuting).15 E F1(command)4.209 E F0
 1.708(and replacing the command substitution with the)4.208 F
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(22)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(22)190.95 E 0 Cg EP
 %%Page: 23 23
 %%BeginPageSetup
 BP
@@ -3099,7 +3105,7 @@ F0 3.177(,a).24 G .677(nd replaced with an alphabeti-)-3.177 F .562
 (cally sorted list of \214lenames matching the pattern \(see)108 727.2 R
 F3 -.09(Pa)3.062 G(tter).09 E 2.812(nM)-.135 G(atching)-2.812 E F0(belo)
 2.812 E 3.062(w\). If)-.25 F .562(no matching \214lenames)3.062 F
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(23)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(23)190.95 E 0 Cg EP
 %%Page: 24 24
 %%BeginPageSetup
 BP
@@ -3233,7 +3239,7 @@ E F3(symbol)A F1(.])A F0(matches the collating symbol)2.5 E F3(symbol)
 (is a list of one or more patterns separated by a)2.755 F F1(|)2.756 E
 F0(.)A(Composite patterns may be formed using one or more of the follo)
 108 718.8 Q(wing sub-patterns:)-.25 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(24)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(24)190.95 E 0 Cg EP
 %%Page: 25 25
 %%BeginPageSetup
 BP
@@ -3326,7 +3332,7 @@ F2(host)2.997 E F0 .497(is a v)2.997 F .497
 (is an inte)2.996 F .496(ger port number or ser)-.15 F(-)-.2 E
 (vice name,)180 729.6 Q F1(bash)2.5 E F0
 (attempts to open the corresponding TCP sock)2.5 E(et.)-.1 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(25)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(25)190.95 E 0 Cg EP
 %%Page: 26 26
 %%BeginPageSetup
 BP
@@ -3415,7 +3421,7 @@ e descriptor 1\) and the standard error output \(\214le descrip-)-.25 F
 676.8 Q F1(&>>)144 693.6 Q F2(wor)A(d)-.37 E F0
 (This is semantically equi)108 710.4 Q -.25(va)-.25 G(lent to).25 E F1
 (>>)144 727.2 Q F2(wor)A(d)-.37 E F0(2)2.5 E F1(>&)A F0(1)A
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(26)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(26)190.95 E 0 Cg EP
 %%Page: 27 27
 %%BeginPageSetup
 BP
@@ -3508,7 +3514,7 @@ F2(n)A F0(])A F1(>&)A F2(digit)A F1<ad>A F0(mo)108 696 Q -.15(ve)-.15 G
 .285(to \214le descriptor)2.785 F F2(n)2.785 E F0 2.785(,o).24 G 2.785
 (rt)-2.785 G .286(he standard output \(\214le descriptor 1\) if)-2.785 F
 F2(n)2.786 E F0 .286(is not speci-)2.786 F(\214ed.)108 708 Q
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(27)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(27)190.95 E 0 Cg EP
 %%Page: 28 28
 %%BeginPageSetup
 BP
@@ -3646,7 +3652,8 @@ F(-)-.2 E(ited unless the)108 660 Q F1(\255o errtrace)2.5 E F0
 (alue greater than 0, de\214nes a maximum function nesting)-.25 F(le)108
 717.6 Q -.15(ve)-.25 G 2.5(l. Function).15 F(in)2.5 E -.2(vo)-.4 G
 (cations that e).2 E(xceed the limit cause the entire command to abort.)
--.15 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(28)193.45 E 0 Cg EP
+-.15 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(28)190.95 E 0 Cg
+EP
 %%Page: 29 29
 %%BeginPageSetup
 BP
@@ -3752,7 +3759,8 @@ A F3 -.2(ex)C(pr).2 E F1(:)A F3 -.2(ex)C(pr).2 E F0
 (xpression.)-.15 E 1.406
 (Constants with a leading 0 are interpreted as octal numbers.)108 724.8
 R 3.906(Al)6.406 G 1.406(eading 0x or 0X denotes he)-3.906 F(xadecimal.)
--.15 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(29)193.45 E 0 Cg EP
+-.15 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(29)190.95 E 0 Cg
+EP
 %%Page: 30 30
 %%BeginPageSetup
 BP
@@ -3868,7 +3876,7 @@ E F0 -.35(Tr)144 692.4 S(ue if the shell v).35 E(ariable)-.25 E F1
 F3<ad52>108 704.4 Q F1(varname)2.5 E F0 -.35(Tr)144 716.4 S
 (ue if the shell v).35 E(ariable)-.25 E F1(varname)2.79 E F0
 (is set and is a name reference.)2.68 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(30)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(30)190.95 E 0 Cg EP
 %%Page: 31 31
 %%BeginPageSetup
 BP
@@ -3962,7 +3970,7 @@ E F5(.)A F0 .246(If the name does not match a func-)4.746 F
 (tion, the shell searches for it in the list of shell b)108 720 Q 2.5
 (uiltins. If)-.2 F 2.5(am)2.5 G(atch is found, that b)-2.5 E
 (uiltin is in)-.2 E -.2(vo)-.4 G -.1(ke).2 G(d.).1 E(GNU Bash 4.3)72 768
-Q(2014 January 6)144.29 E(31)193.45 E 0 Cg EP
+Q(2014 February 2)141.79 E(31)190.95 E 0 Cg EP
 %%Page: 32 32
 %%BeginPageSetup
 BP
@@ -4074,7 +4082,7 @@ F2(PPID)2.5 E F0 .426(When a simple command other than a b)108 576 R
 (raps caught by the shell are reset to the v)-32.5 F .307
 (alues inherited from the shell')-.25 F 2.807(sp)-.55 G .307
 (arent, and traps ignored)-2.807 F(by the shell are ignored)144 720 Q
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(32)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(32)190.95 E 0 Cg EP
 %%Page: 33 33
 %%BeginPageSetup
 BP
@@ -4205,8 +4213,8 @@ Q(xits with a non-zero v)-.15 E 2.5(alue. See)-.25 F(also the)2.5 E F1
 F1(bash)108 720 Q F0(ignores)2.5 E F4(SIGQ)2.5 E(UIT)-.09 E F5(.)A F0
 (If job control is in ef)4.5 E(fect,)-.25 E F1(bash)2.5 E F0(ignores)2.5
 E F4(SIGTTIN)2.5 E F5(,)A F4(SIGTT)2.25 E(OU)-.162 E F5(,)A F0(and)2.25
-E F4(SIGTSTP)2.5 E F5(.)A F0(GNU Bash 4.3)72 768 Q(2014 January 6)144.29
-E(33)193.45 E 0 Cg EP
+E F4(SIGTSTP)2.5 E F5(.)A F0(GNU Bash 4.3)72 768 Q(2014 February 2)
+141.79 E(33)190.95 E 0 Cg EP
 %%Page: 34 34
 %%BeginPageSetup
 BP
@@ -4347,7 +4355,7 @@ F5(curr)2.518 E .018(ent job)-.37 F F0 2.518(,w).23 G .018(hich is)
 -2.518 F .494(the last job stopped while it w)108 720 R .495
 (as in the fore)-.1 F .495(ground or started in the background.)-.15 F
 (The)5.495 E F5(pr)4.245 E -.15(ev)-.37 G .495(ious job).15 F F0 .495
-(may be)3.225 F(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(34)193.45
+(may be)3.225 F(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(34)190.95
 E 0 Cg EP
 %%Page: 35 35
 %%BeginPageSetup
@@ -4451,7 +4459,7 @@ F0(be)29.89 E 1.257(gin a sequence of non-printing characters, which co\
 uld be used to embed a terminal)-.15 F(control sequence into the prompt)
 180 703.2 Q F1(\\])144 715.2 Q F0
 (end a sequence of non-printing characters)29.89 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(35)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(35)190.95 E 0 Cg EP
 %%Page: 36 36
 %%BeginPageSetup
 BP
@@ -4584,8 +4592,8 @@ F0(,).72 E F4(LFD)3.761 E F0(,).28 E F4(NEWLINE)3.76 E F0(,).73 E F4
 (ays: as a symbolic k)-3.453 F 1.153 -.15(ey n)-.1 H .853
 (ame, possibly with).15 F F4(Meta\255)3.353 E F0(or)3.353 E F4(Contr)
 3.353 E(ol\255)-.45 E F0(pre\214x)3.353 E .853(es, or as a k)-.15 F -.15
-(ey)-.1 G(sequence.)108 724.8 Q(GNU Bash 4.3)72 768 Q(2014 January 6)
-144.29 E(36)193.45 E 0 Cg EP
+(ey)-.1 G(sequence.)108 724.8 Q(GNU Bash 4.3)72 768 Q(2014 February 2)
+141.79 E(36)190.95 E 0 Cg EP
 %%Page: 37 37
 %%BeginPageSetup
 BP
@@ -4676,7 +4684,7 @@ F -.05(ga)-.15 G .79(rd to case\).).05 F(Unrecog-)5.79 E .449(nized v)
 2.968 E F0 5.468(.A)C .468(ll other v)-5.468 F .468(alues are equi)-.25
 F -.25(va)-.25 G .468(lent to).25 F F1(Off)2.968 E F0 5.468(.T)C .468
 (he v)-5.468 F .468(ariables and their def)-.25 F(ault)-.1 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(37)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(37)190.95 E 0 Cg EP
 %%Page: 38 38
 %%BeginPageSetup
 BP
@@ -4780,7 +4788,7 @@ E .483(history entries are deleted and no ne)144 712.8 R 2.983(we)-.25 G
 (set to a v)2.983 F .482(alue less than zero, the num-)-.25 F
 (ber of history entries is not limited.)144 724.8 Q(By def)5 E
 (ault, the number of history entries is not limited.)-.1 E(GNU Bash 4.3)
-72 768 Q(2014 January 6)144.29 E(38)193.45 E 0 Cg EP
+72 768 Q(2014 February 2)141.79 E(38)190.95 E 0 Cg EP
 %%Page: 39 39
 %%BeginPageSetup
 BP
@@ -4882,8 +4890,8 @@ F0 .698(If set to)144 672 R F1(On)3.198 E F0 3.198(,r)C .699
 2.686(cuted. By).15 F(def)2.686 E .186
 (ault, history lines may be modi\214ed and retain indi)-.1 F .186
 (vidual undo lists across calls to)-.25 F F1 -.18(re)144 696 S(adline)
-.18 E F0(.)A(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(39)193.45 E 0
-Cg EP
+.18 E F0(.)A(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(39)190.95 E
+Cg EP
 %%Page: 40 40
 %%BeginPageSetup
 BP
@@ -4983,7 +4991,7 @@ E F0(directi)2.5 E .3 -.15(ve a)-.25 H(re e).15 E -.15(xe)-.15 G
 (gument and reads commands and bindings from that)-.18 F 2.5(\214le. F)
 144 722.4 R(or e)-.15 E(xample, the follo)-.15 E(wing directi)-.25 E .3
 -.15(ve w)-.25 H(ould read).05 E F2(/etc/inputr)2.5 E(c)-.37 E F0(:)A
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(40)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(40)190.95 E 0 Cg EP
 %%Page: 41 41
 %%BeginPageSetup
 BP
@@ -5079,7 +5087,7 @@ F0(Mo)144 645.6 Q .908 -.15(ve b)-.15 H .609
 (current line without clearing the screen.)144 693.6 Q F1 -.18(re)108
 705.6 S(draw\255curr).18 E(ent\255line)-.18 E F0
 (Refresh the current line.)144 717.6 Q(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(41)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(41)190.95 E 0 Cg EP
 %%Page: 42 42
 %%BeginPageSetup
 BP
@@ -5181,8 +5189,8 @@ E(ANSION)-.666 E F0(belo)2.25 E 2.5(wf)-.25 G
 (xpansion on the current line and insert a space.)-.15 F(See)6.627 E F2
 (HIST)4.127 E(OR)-.162 E 3.877(YE)-.315 G(XP)-3.877 E(ANSION)-.666 E F0
 (belo)144 720 Q 2.5(wf)-.25 G(or a description of history e)-2.5 E
-(xpansion.)-.15 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(42)
-193.45 E 0 Cg EP
+(xpansion.)-.15 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(42)
+190.95 E 0 Cg EP
 %%Page: 43 43
 %%BeginPageSetup
 BP
@@ -5283,7 +5291,7 @@ E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F1(do)108 616.8 Q
 4.394 E F0 1.894(mode does o)4.394 F -.15(ve)-.15 G 1.894(rwrite dif).15
 F(ferently)-.25 E 6.894(.E)-.65 G 1.894(ach call to)-6.894 F F4 -.37(re)
 4.395 G(adline\(\)).37 E F0 1.895(starts in insert)4.395 F(GNU Bash 4.3)
-72 768 Q(2014 January 6)144.29 E(43)193.45 E 0 Cg EP
+72 768 Q(2014 February 2)141.79 E(43)190.95 E 0 Cg EP
 %%Page: 44 44
 %%BeginPageSetup
 BP
@@ -5372,8 +5380,8 @@ F0(or)2.5 E F1(yank\255pop)2.5 E F0(.)A F1(Numeric Ar)87 633.6 Q
 (ain ends the numeric ar)-.05 F 1.17(gument, b)-.18 F 1.17(ut is other)
 -.2 F(-)-.2 E .898(wise ignored.)144 729.6 R .898
 (As a special case, if this command is immediately follo)5.898 F .898
-(wed by a character that is)-.25 F(GNU Bash 4.3)72 768 Q(2014 January 6)
-144.29 E(44)193.45 E 0 Cg EP
+(wed by a character that is)-.25 F(GNU Bash 4.3)72 768 Q
+(2014 February 2)141.79 E(44)190.95 E 0 Cg EP
 %%Page: 45 45
 %%BeginPageSetup
 BP
@@ -5472,7 +5480,7 @@ F0(List the possible completions of the te)144 556.8 Q
 (xt before point, comparing the te)-.15 F .425(xt ag)-.15 F .424
 (ainst lines from the history list)-.05 F
 (for possible completion matches.)144 712.8 Q(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(45)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(45)190.95 E 0 Cg EP
 %%Page: 46 46
 %%BeginPageSetup
 BP
@@ -5562,7 +5570,7 @@ F0 1.095(command enough times to)3.595 F
 ing stray characters into the editing b)144 693.6 R(uf)-.2 E(fer)-.25 E
 5.026(.T)-.55 G(his)-5.026 E(is unbound by def)144 705.6 Q(ault, b)-.1 E
 (ut usually bound to ESC\255[.)-.2 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(46)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(46)190.95 E 0 Cg EP
 %%Page: 47 47
 %%BeginPageSetup
 BP
@@ -5675,7 +5683,7 @@ E F1(Completing)2.5 E F0(is performed.)2.5 E .464
 .321(xt, the string speci\214ed as the ar)-.15 F .321(gument to the)-.18
 F F1<ad57>2.821 E F0 .32(option is considered.)2.821 F .32
 (The string is \214rst split using the)5.32 F(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(47)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(47)190.95 E 0 Cg EP
 %%Page: 48 48
 %%BeginPageSetup
 BP
@@ -5819,7 +5827,7 @@ ompletion is attempted, rather than being loaded all at once.)-.2 E -.15
 .137(ept in a \214le corresponding to the name of)-.1 F
 (the command, the follo)108 724.8 Q(wing def)-.25 E
 (ault completion function w)-.1 E(ould load completions dynamically:)-.1
-E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(48)193.45 E 0 Cg EP
+E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(48)190.95 E 0 Cg EP
 %%Page: 49 49
 %%BeginPageSetup
 BP
@@ -5954,7 +5962,7 @@ tions of that line for inclusion into the current one.)4.368 F 1.867
 Q(s)-.1 E F0 .227(are a)2.727 F -.25(va)-.2 G .227
 (ilable to manipulate the selected w).25 F 2.727(ords. The)-.1 F .226
 (line is brok)2.726 F .226(en into w)-.1 F .226(ords in the same f)-.1 F
-(ashion)-.1 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(49)193.45 E
+(ashion)-.1 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(49)190.95 E
 0 Cg EP
 %%Page: 50 50
 %%BeginPageSetup
@@ -6072,7 +6080,7 @@ E(viates `0\255)-.25 E F1(y)A F0('.)A F2(*)108 681.6 Q F0 .315
 705.6 Q F0(Abbre)26 E(viates)-.25 E F1(x\255$)2.5 E F0(.)A F2<78ad>108
 717.6 Q F0(Abbre)25.3 E(viates)-.25 E F1(x\255$)2.5 E F0(lik)2.5 E(e)-.1
 E F2(x*)2.5 E F0 2.5(,b)C(ut omits the last w)-2.7 E(ord.)-.1 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(50)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(50)190.95 E 0 Cg EP
 %%Page: 51 51
 %%BeginPageSetup
 BP
@@ -6203,7 +6211,7 @@ F 1.314(plied, the name and v)144 702 R 1.314
 (returns true unless a)3.814 F F2(name)3.814 E F0 1.313(is gi)3.814 F
 -.15(ve)-.25 G 3.813(nf).15 G(or)-3.813 E
 (which no alias has been de\214ned.)144 714 Q(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(51)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(51)190.95 E 0 Cg EP
 %%Page: 52 52
 %%BeginPageSetup
 BP
@@ -6322,7 +6330,7 @@ F .792(xit status.)-.15 F .792(This is useful)5.792 F .615
 727.2 R .57(uiltin within the function.)-.2 F(The)5.57 E F1(cd)3.07 E F0
 -.2(bu)3.07 G .57(iltin is commonly rede\214ned this w).2 F(ay)-.1 E
 5.57(.T)-.65 G .57(he return status)-5.57 F(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(52)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(52)190.95 E 0 Cg EP
 %%Page: 53 53
 %%BeginPageSetup
 BP
@@ -6462,7 +6470,7 @@ E(dlist)-.37 E F0 3.728(][)C F2<ad46>-3.728 E F1(func-)3.728 E(tion)108
 <ad58>A F1(\214lterpat)2.5 E F0 2.5(][)C F2<ad50>-2.5 E F1(pr)2.5 E
 (e\214x)-.37 E F0 2.5(][)C F2<ad53>-2.5 E F1(suf)2.5 E<8c78>-.18 E F0(])
 A F1(name)2.5 E F0([)2.5 E F1(name ...)A F0(])A(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(53)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(53)190.95 E 0 Cg EP
 %%Page: 54 54
 %%BeginPageSetup
 BP
@@ -6545,7 +6553,7 @@ Q F0(Names of disabled shell b)224 684 Q(uiltins.)-.2 E F1(enabled)184
 696 Q F0(Names of enabled shell b)6.66 E(uiltins.)-.2 E F1(export)184
 708 Q F0(Names of e)12.23 E(xported shell v)-.15 E 2.5(ariables. May)
 -.25 F(also be speci\214ed as)2.5 E F1<ad65>2.5 E F0(.)A(GNU Bash 4.3)72
-768 Q(2014 January 6)144.29 E(54)193.45 E 0 Cg EP
+768 Q(2014 February 2)141.79 E(54)190.95 E 0 Cg EP
 %%Page: 55 55
 %%BeginPageSetup
 BP
@@ -6647,7 +6655,7 @@ F .724(alid for the)-.25 F F1(com-)3.224 E(plete)144 717.6 Q F0 -.2(bu)
 (option indicates that the remaining options should apply to)2.797 F
 1.227(the `)144 729.6 R(`def)-.74 E(ault')-.1 E 3.727('c)-.74 G 1.228(o\
 mmand completion; that is, completion attempted on a command for which \
-no)-3.727 F(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(55)193.45 E 0
+no)-3.727 F(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(55)190.95 E 0
 Cg EP
 %%Page: 56 56
 %%BeginPageSetup
@@ -6790,7 +6798,7 @@ F1(Arrays)144 698.4 Q F0(abo)2.86 E -.15(ve)-.15 G .36(\), one of the)
 (rray status for an array v)-2.557 F(ari-)-.25 E
 (able, or an attempt is made to display a non-e)144 722.4 Q
 (xistent function with)-.15 E F1<ad66>2.5 E F0(.)A(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(56)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(56)190.95 E 0 Cg EP
 %%Page: 57 57
 %%BeginPageSetup
 BP
@@ -6895,7 +6903,7 @@ F1(\255dnps)-2.5 E F0 2.5(][)C F1<ad66>-2.5 E F2(\214lename)2.5 E F0 2.5
 (the same name as a shell b)144 727.2 R .834(uiltin to be e)-.2 F -.15
 (xe)-.15 G .834(cuted without specifying a full pathname, e).15 F -.15
 (ve)-.25 G 3.334(nt).15 G(hough)-3.334 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(57)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(57)190.95 E 0 Cg EP
 %%Page: 58 58
 %%BeginPageSetup
 BP
@@ -7037,8 +7045,8 @@ F3(EDIT)3.131 E(OR)-.162 E F0(if)2.881 E F3(FCEDIT)3.131 E F0 .631
 (is not set.)2.881 F .631(If nei-)5.631 F .951(ther v)144 696 R .951
 (ariable is set,)-.25 F F2(vi)5.117 E F0 .951(is used.)5.117 F .95
 (When editing is complete, the edited commands are echoed and)5.951 F
--.15(exe)144 708 S(cuted.).15 E(GNU Bash 4.3)72 768 Q(2014 January 6)
-144.29 E(58)193.45 E 0 Cg EP
+-.15(exe)144 708 S(cuted.).15 E(GNU Bash 4.3)72 768 Q(2014 February 2)
+141.79 E(58)190.95 E 0 Cg EP
 %%Page: 59 59
 %%BeginPageSetup
 BP
@@ -7166,7 +7174,7 @@ R F3<ad70>2.742 E F0 .243
 (of the command.)144 722.4 R(The)6.712 E F3<ad72>4.212 E F0 1.711
 (option causes the shell to for)4.212 F 1.711
 (get all remembered locations.)-.18 F(The)6.711 E F3<ad64>4.211 E F0
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(59)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(59)190.95 E 0 Cg EP
 %%Page: 60 60
 %%BeginPageSetup
 BP
@@ -7274,7 +7282,7 @@ E F0(... ])2.5 E(The \214rst form lists the acti)144 696 Q .3 -.15(ve j)
 -.25 H 2.5(obs. The).15 F(options ha)2.5 E .3 -.15(ve t)-.2 H(he follo)
 .15 E(wing meanings:)-.25 E F2<ad6c>144 708 Q F0
 (List process IDs in addition to the normal information.)27.52 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(60)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(60)190.95 E 0 Cg EP
 %%Page: 61 61
 %%BeginPageSetup
 BP
@@ -7405,7 +7413,7 @@ F0 .275(is e)2.775 F -.25(va)-.25 G .274
 4.406 E(ay)-.15 E F0(is)4.406 E(in)144 708 Q -.25(va)-.4 G
 (lid or unassignable, or if).25 E F2(arr)2.5 E(ay)-.15 E F0
 (is not an inde)2.5 E -.15(xe)-.15 G 2.5(da).15 G(rray)-2.5 E(.)-.65 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(61)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(61)190.95 E 0 Cg EP
 %%Page: 62 62
 %%BeginPageSetup
 BP
@@ -7518,7 +7526,8 @@ adding directories to the stack, so that)24.74 F
 (Rotates the stack so that the)25.3 F F2(n)3.767 E F0 1.268
 (th directory \(counting from the left of the list sho)B 1.268(wn by)
 -.25 F F1(dirs)180 708 Q F0 2.5(,s)C(tarting with zero\) is at the top.)
--2.5 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(62)193.45 E 0 Cg EP
+-2.5 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(62)190.95 E 0 Cg
+EP
 %%Page: 63 63
 %%BeginPageSetup
 BP
@@ -7640,7 +7649,7 @@ F0(seconds.)3.061 E F2(timeout)5.561 E F0 .561(may be a decimal number)
 .3 -.15(ve i)-.25 H(f).15 E F1 -.18(re)2.5 G(ad).18 E F0 .506(is readin\
 g input from a terminal, pipe, or other special \214le; it has no ef)180
 722.4 R .506(fect when reading)-.25 F(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(63)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(63)190.95 E 0 Cg EP
 %%Page: 64 64
 %%BeginPageSetup
 BP
@@ -7788,7 +7797,7 @@ F1<ad65>3.612 E F0 -.1(wa)3.612 G 3.612(sb).1 G 1.112
 -.27 E F0(abo)2.893 E -.15(ve)-.15 G .643
 (\), and may cause subshells to e).15 F .643(xit before e)-.15 F -.15
 (xe)-.15 G .643(cuting all).15 F(the commands in the subshell.)184 727.2
-Q(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(64)193.45 E 0 Cg EP
+Q(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(64)190.95 E 0 Cg EP
 %%Page: 65 65
 %%BeginPageSetup
 BP
@@ -7869,7 +7878,7 @@ F0(.)A F1(pipefail)184 684 Q F0 1.029(If set, the return v)7.77 F 1.029
 (xit with a non-zero status, or zero if all commands in the pipeline)
 -.15 F -.15(ex)224 708 S(it successfully).15 E 5(.T)-.65 G
 (his option is disabled by def)-5 E(ault.)-.1 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(65)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(65)190.95 E 0 Cg EP
 %%Page: 66 66
 %%BeginPageSetup
 BP
@@ -7989,7 +7998,7 @@ F1<ad78>3.446 E F0(and)3.446 E F1<ad76>3.446 E F0 .945
 (to be turned of)144 730.8 R 2.678(f. The)-.25 F .178
 (options can also be speci\214ed as ar)2.678 F .178(guments to an in)
 -.18 F -.2(vo)-.4 G .177(cation of the shell.).2 F(The)5.177 E
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(66)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(66)190.95 E 0 Cg EP
 %%Page: 67 67
 %%BeginPageSetup
 BP
@@ -8103,7 +8112,7 @@ F .419(vior to that of v)-.2 F .42(ersion 3.1 with respect to quoted ar)
 -.15 F(guments)-.18 E .462(to the)184 726 R F1([[)2.962 E F0 .462
 (conditional command')2.962 F(s)-.55 E F1(=~)2.962 E F0 .462
 (operator and locale-speci\214c string comparison when)2.962 F
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(67)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(67)190.95 E 0 Cg EP
 %%Page: 68 68
 %%BeginPageSetup
 BP
@@ -8212,7 +8221,7 @@ Q -.15(xe)-.15 G(cuted.).15 E F1(3.)184 672 Q F0 .84
 F3 -.27(BA)28.5 G(SH_ARGC).27 E F0(and)3.153 E F3 -.27(BA)3.403 G
 (SH_ARGV).27 E F0 .904(are updated as described in their descriptions)
 3.154 F(abo)220 720 Q -.15(ve)-.15 G(.).15 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(68)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(68)190.95 E 0 Cg EP
 %%Page: 69 69
 %%BeginPageSetup
 BP
@@ -8316,7 +8325,7 @@ F1(cmdhist)3.154 E F0 .654
 (The shell sets this option if it is started as a login shell \(see)184
 708 R F3(INV)2.986 E(OCA)-.405 E(TION)-.855 E F0(abo)2.736 E -.15(ve)
 -.15 G 2.986(\). The).15 F -.25(va)184 720 S(lue may not be changed.).25
-E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(69)193.45 E 0 Cg EP
+E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(69)190.95 E 0 Cg EP
 %%Page: 70 70
 %%BeginPageSetup
 BP
@@ -8412,7 +8421,7 @@ F0 -.35(Tr)12.6 G(ue if).35 E F2 -.2(ex)2.5 G(pr).2 E F0(is f)3.23 E
 (ex)144 687.6 S(pr1).2 E F0<ad>2.5 E F1(a)A F2 -.2(ex)2.5 G(pr2).2 E F0
 -.35(Tr)180 699.6 S(ue if both).35 E F2 -.2(ex)2.5 G(pr1).2 E F0(and)2.5
 E F2 -.2(ex)2.5 G(pr2).2 E F0(are true.)2.52 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(70)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(70)190.95 E 0 Cg EP
 %%Page: 71 71
 %%BeginPageSetup
 BP
@@ -8535,7 +8544,7 @@ turns a non\255zero e)144 710.4 R .184(xit status, subject to)-.15 F
 1.92(the follo)144 722.4 R 1.92(wing conditions.)-.25 F(The)6.92 E F3
 (ERR)4.42 E F0 1.92(trap is not e)4.17 F -.15(xe)-.15 G 1.92
 (cuted if the f).15 F 1.92(ailed command is part of the)-.1 F
-(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(71)193.45 E 0 Cg EP
+(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(71)190.95 E 0 Cg EP
 %%Page: 72 72
 %%BeginPageSetup
 BP
@@ -8662,7 +8671,7 @@ F1<ad54>144 711.6 Q F0(The maximum number of threads)23.63 E(If)144
 (n, and the).15 F F1<ad61>2.968 E F0 .468(option is not used,)2.968 F F2
 (limit)2.968 E F0 .468(is the ne)2.968 F 2.968(wv)-.25 G .468
 (alue of the speci\214ed resource.)-3.218 F(If)5.468 E(GNU Bash 4.3)72
-768 Q(2014 January 6)144.29 E(72)193.45 E 0 Cg EP
+768 Q(2014 February 2)141.79 E(72)190.95 E 0 Cg EP
 %%Page: 73 73
 %%BeginPageSetup
 BP
@@ -8787,7 +8796,7 @@ ng the >, >|, <>, >&, &>, and >> redirection operators)-32.5 E 32.5
 108 708 S(dding or deleting b)-32.5 E(uiltin commands with the)-.2 E F1
 <ad66>2.5 E F0(and)2.5 E F1<ad64>2.5 E F0(options to the)2.5 E F1
 (enable)2.5 E F0 -.2(bu)2.5 G(iltin command).2 E(GNU Bash 4.3)72 768 Q
-(2014 January 6)144.29 E(73)193.45 E 0 Cg EP
+(2014 February 2)141.79 E(73)190.95 E 0 Cg EP
 %%Page: 74 74
 %%BeginPageSetup
 BP
@@ -8862,7 +8871,7 @@ G(rcises the b).15 E(ug)-.2 E F4(bashb)108.27 710.4 Q(ug)-.2 E F0
 2.72 E(vides for \214ling a b)-.15 E(ug report.)-.2 E(Comments and b)108
 727.2 Q(ug reports concerning this manual page should be directed to)-.2
 E F4 -.15(ch)2.5 G(et.r).15 E(ame)-.15 E(y@case)-.3 E(.edu)-.15 E F0(.)
-.25 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E(74)193.45 E 0 Cg EP
+.25 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79 E(74)190.95 E 0 Cg EP
 %%Page: 75 75
 %%BeginPageSetup
 BP
@@ -8887,8 +8896,8 @@ ommands between parentheses to force it into a)-.25 F
 (subshell, which may be stopped as a unit.)108 211.2 Q(Array v)108 228 Q
 (ariables may not \(yet\) be e)-.25 E(xported.)-.15 E
 (There may be only one acti)108 244.8 Q .3 -.15(ve c)-.25 H
-(oprocess at a time.).15 E(GNU Bash 4.3)72 768 Q(2014 January 6)144.29 E
-(75)193.45 E 0 Cg EP
+(oprocess at a time.).15 E(GNU Bash 4.3)72 768 Q(2014 February 2)141.79
+E(75)190.95 E 0 Cg EP
 %%Trailer
 end
 %%EOF
index 4dadc1b93c38a58253a0ee75b845ac4c9762de0b..3fbebc17f10765b20118e52f06b89d1d844e100a 100644 (file)
@@ -81,9 +81,9 @@
 @xrdef{Positional Parameters-pg}{19}
 @xrdef{Special Parameters-title}{Special Parameters}
 @xrdef{Special Parameters-snt}{Section@tie 3.4.2}
+@xrdef{Special Parameters-pg}{20}
 @xrdef{Shell Expansions-title}{Shell Expansions}
 @xrdef{Shell Expansions-snt}{Section@tie 3.5}
-@xrdef{Special Parameters-pg}{20}
 @xrdef{Brace Expansion-title}{Brace Expansion}
 @xrdef{Brace Expansion-snt}{Section@tie 3.5.1}
 @xrdef{Shell Expansions-pg}{21}
 @xrdef{Arithmetic Expansion-title}{Arithmetic Expansion}
 @xrdef{Arithmetic Expansion-snt}{Section@tie 3.5.5}
 @xrdef{Command Substitution-pg}{28}
-@xrdef{Arithmetic Expansion-pg}{28}
 @xrdef{Process Substitution-title}{Process Substitution}
 @xrdef{Process Substitution-snt}{Section@tie 3.5.6}
 @xrdef{Word Splitting-title}{Word Splitting}
 @xrdef{Word Splitting-snt}{Section@tie 3.5.7}
-@xrdef{Filename Expansion-title}{Filename Expansion}
-@xrdef{Filename Expansion-snt}{Section@tie 3.5.8}
+@xrdef{Arithmetic Expansion-pg}{29}
 @xrdef{Process Substitution-pg}{29}
 @xrdef{Word Splitting-pg}{29}
-@xrdef{Filename Expansion-pg}{29}
+@xrdef{Filename Expansion-title}{Filename Expansion}
+@xrdef{Filename Expansion-snt}{Section@tie 3.5.8}
 @xrdef{Pattern Matching-title}{Pattern Matching}
 @xrdef{Pattern Matching-snt}{Section@tie 3.5.8.1}
+@xrdef{Filename Expansion-pg}{30}
 @xrdef{Pattern Matching-pg}{30}
 @xrdef{Quote Removal-title}{Quote Removal}
 @xrdef{Quote Removal-snt}{Section@tie 3.5.9}
index a36156e1e1a53672ceddd08d7455628219f57ad8..e4c1a13a5a8a96d6fd73768931a61a8239b4b831 100644 (file)
 \entry{parameter expansion}{23}{parameter expansion}
 \entry{expansion, parameter}{23}{expansion, parameter}
 \entry{command substitution}{28}{command substitution}
-\entry{expansion, arithmetic}{28}{expansion, arithmetic}
-\entry{arithmetic expansion}{28}{arithmetic expansion}
+\entry{expansion, arithmetic}{29}{expansion, arithmetic}
+\entry{arithmetic expansion}{29}{arithmetic expansion}
 \entry{process substitution}{29}{process substitution}
 \entry{word splitting}{29}{word splitting}
-\entry{expansion, filename}{29}{expansion, filename}
-\entry{expansion, pathname}{29}{expansion, pathname}
-\entry{filename expansion}{29}{filename expansion}
-\entry{pathname expansion}{29}{pathname expansion}
+\entry{expansion, filename}{30}{expansion, filename}
+\entry{expansion, pathname}{30}{expansion, pathname}
+\entry{filename expansion}{30}{filename expansion}
+\entry{pathname expansion}{30}{pathname expansion}
 \entry{pattern matching}{30}{pattern matching}
 \entry{matching, pattern}{30}{matching, pattern}
 \entry{redirection}{31}{redirection}
index a4fb3bab38155fc2dd7254306f7d9621b2ebe44c..97c6c160bb150e755f72ea6ad072847e1e2ccd7a 100644 (file)
@@ -1,7 +1,7 @@
 \initial {A}
 \entry {alias expansion}{88}
 \entry {arithmetic evaluation}{87}
-\entry {arithmetic expansion}{28}
+\entry {arithmetic expansion}{29}
 \entry {arithmetic, shell}{87}
 \entry {arrays}{89}
 \initial {B}
 \entry {execution environment}{36}
 \entry {exit status}{3, 38}
 \entry {expansion}{21}
-\entry {expansion, arithmetic}{28}
+\entry {expansion, arithmetic}{29}
 \entry {expansion, brace}{21}
-\entry {expansion, filename}{29}
+\entry {expansion, filename}{30}
 \entry {expansion, parameter}{23}
-\entry {expansion, pathname}{29}
+\entry {expansion, pathname}{30}
 \entry {expansion, tilde}{22}
 \entry {expressions, arithmetic}{87}
 \entry {expressions, conditional}{85}
 \initial {F}
 \entry {field}{3}
 \entry {filename}{3}
-\entry {filename expansion}{29}
+\entry {filename expansion}{30}
 \entry {foreground}{97}
 \entry {functions, shell}{17}
 \initial {H}
@@ -92,7 +92,7 @@
 \entry {parameters}{18}
 \entry {parameters, positional}{19}
 \entry {parameters, special}{20}
-\entry {pathname expansion}{29}
+\entry {pathname expansion}{30}
 \entry {pattern matching}{30}
 \entry {pipeline}{8}
 \entry {POSIX}{3}
index ff50b4e2d228c19473f92ff0fa0882113f6f0f93..277804d9eea43a53a992f6141a048438c53d452b 100644 (file)
Binary files a/doc/bashref.dvi and b/doc/bashref.dvi differ
index 93eebe1e95405074aae6ae738b0ab2b9ffe84f18..5b4eec4cebdc144adc08521b3b03f00e69cc7785 100644 (file)
@@ -1,6 +1,6 @@
 <HTML>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<!-- Created on January, 23  2014 by texi2html 1.64 -->
+<!-- Created on February, 4  2014 by texi2html 1.64 -->
 <!-- 
 Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
             Karl Berry  <karl@freefriends.org>
@@ -33,11 +33,11 @@ Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
 <H1>Bash Reference Manual</H1></P><P>
 
 This text is a brief description of the features that are present in
-the Bash shell (version 4.3, 6 January 2014).
+the Bash shell (version 4.3, 2 February 2014).
 The Bash home page is <A HREF="http://www.gnu.org/software/bash/">http://www.gnu.org/software/bash/</A>.
 </P><P>
 
-This is Edition 4.3, last updated 6 January 2014,
+This is Edition 4.3, last updated 2 February 2014,
 of <CITE>The GNU Bash Reference Manual</CITE>,
 for <CODE>Bash</CODE>, Version 4.3.
 </P><P>
@@ -2042,8 +2042,12 @@ only be referenced; assignment to them is not allowed.
 <DT><CODE>*</CODE>
 <DD><A NAME="IDX47"></A>
 <A NAME="IDX48"></A>
-($*) Expands to the positional parameters, starting from one.  When the
-expansion occurs within double quotes, it expands to a single word
+($*) Expands to the positional parameters, starting from one.
+When the expansion is not within double quotes, each positional parameter
+expands to a separate word.
+In contexts where it is performed, those words
+are subject to further word splitting and pathname expansion.
+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 <CODE>IFS</CODE>
 special variable.  That is, <CODE>"$*"</CODE> is equivalent
@@ -17300,7 +17304,7 @@ to permit their use in free software.
 <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
 </TR></TABLE>
 <H1>About this document</H1>
-This document was generated by <I>Chet Ramey</I> on <I>January, 23  2014</I>
+This document was generated by <I>Chet Ramey</I> on <I>February, 4  2014</I>
 using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
 "><I>texi2html</I></A>
 <P></P>  
@@ -17462,7 +17466,7 @@ the following structure:
 <BR>  
 <FONT SIZE="-1">
 This document was generated
-by <I>Chet Ramey</I> on <I>January, 23  2014</I>
+by <I>Chet Ramey</I> on <I>February, 4  2014</I>
 using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
 "><I>texi2html</I></A>
 
index 1574c260762399bc192558f1012c46366bb58d95..328f883a04c60c40d3d4bf32b782496c60e4d322 100644 (file)
@@ -2,9 +2,9 @@ This is bashref.info, produced by makeinfo version 4.13 from
 /usr/homes/chet/src/bash/src/doc/bashref.texi.
 
 This text is a brief description of the features that are present in
-the Bash shell (version 4.3, 6 January 2014).
+the Bash shell (version 4.3, 2 February 2014).
 
-   This is Edition 4.3, last updated 6 January 2014, of `The GNU Bash
+   This is Edition 4.3, last updated 2 February 2014, of `The GNU Bash
 Reference Manual', for `Bash', Version 4.3.
 
    Copyright (C) 1988-2014 Free Software Foundation, Inc.
@@ -28,10 +28,10 @@ Bash Features
 *************
 
 This text is a brief description of the features that are present in
-the Bash shell (version 4.3, 6 January 2014).  The Bash home page is
+the Bash shell (version 4.3, 2 February 2014).  The Bash home page is
 `http://www.gnu.org/software/bash/'.
 
-   This is Edition 4.3, last updated 6 January 2014, of `The GNU Bash
+   This is Edition 4.3, last updated 2 February 2014, of `The GNU Bash
 Reference Manual', for `Bash', Version 4.3.
 
    Bash contains features that appear in other popular shells, and some
@@ -1351,13 +1351,16 @@ only be referenced; assignment to them is not allowed.
 
 `*'
      ($*) 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 `IFS' special variable.  That is, `"$*"' is
-     equivalent to `"$1C$2C..."', where C is the first character of the
-     value of the `IFS' variable.  If `IFS' is unset, the parameters
-     are separated by spaces.  If `IFS' is null, the parameters are
-     joined without intervening separators.
+     When the expansion is not within double quotes, each positional
+     parameter expands to a separate word.  In contexts where it is
+     performed, those words are subject to further word splitting and
+     pathname expansion.  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 `IFS' special
+     variable.  That is, `"$*"' is equivalent to `"$1C$2C..."', where C
+     is the first character of the value of the `IFS' variable.  If
+     `IFS' is unset, the parameters are separated by spaces.  If `IFS'
+     is null, the parameters are joined without intervening separators.
 
 `@'
      ($@) Expands to the positional parameters, starting from one.
@@ -10688,24 +10691,24 @@ D.3 Parameter and Variable Index
 \0\b[index\0\b]
 * Menu:
 
-* !:                                     Special Parameters.  (line  47)
-* #:                                     Special Parameters.  (line  30)
-* $:                                     Special Parameters.  (line  42)
-* $!:                                    Special Parameters.  (line  48)
-* $#:                                    Special Parameters.  (line  31)
-* $$:                                    Special Parameters.  (line  43)
+* !:                                     Special Parameters.  (line  50)
+* #:                                     Special Parameters.  (line  33)
+* $:                                     Special Parameters.  (line  45)
+* $!:                                    Special Parameters.  (line  51)
+* $#:                                    Special Parameters.  (line  34)
+* $$:                                    Special Parameters.  (line  46)
 * $*:                                    Special Parameters.  (line  10)
-* $-:                                    Special Parameters.  (line  38)
-* $0:                                    Special Parameters.  (line  53)
-* $?:                                    Special Parameters.  (line  34)
-* $@:                                    Special Parameters.  (line  20)
-* $_:                                    Special Parameters.  (line  62)
+* $-:                                    Special Parameters.  (line  41)
+* $0:                                    Special Parameters.  (line  56)
+* $?:                                    Special Parameters.  (line  37)
+* $@:                                    Special Parameters.  (line  23)
+* $_:                                    Special Parameters.  (line  65)
 * *:                                     Special Parameters.  (line   9)
-* -:                                     Special Parameters.  (line  37)
-* 0:                                     Special Parameters.  (line  52)
-* ?:                                     Special Parameters.  (line  33)
-* @:                                     Special Parameters.  (line  19)
-* _:                                     Special Parameters.  (line  61)
+* -:                                     Special Parameters.  (line  40)
+* 0:                                     Special Parameters.  (line  55)
+* ?:                                     Special Parameters.  (line  36)
+* @:                                     Special Parameters.  (line  22)
+* _:                                     Special Parameters.  (line  64)
 * auto_resume:                           Job Control Variables.
                                                               (line   6)
 * BASH:                                  Bash Variables.      (line  13)
@@ -11156,134 +11159,134 @@ D.5 Concept Index
 
 \1f
 Tag Table:
-Node: Top\7f928
-Node: Introduction\7f2844
-Node: What is Bash?\7f3072
-Node: What is a shell?\7f4185
-Node: Definitions\7f6724
-Node: Basic Shell Features\7f9642
-Node: Shell Syntax\7f10861
-Node: Shell Operation\7f11891
-Node: Quoting\7f13185
-Node: Escape Character\7f14488
-Node: Single Quotes\7f14973
-Node: Double Quotes\7f15321
-Node: ANSI-C Quoting\7f16446
-Node: Locale Translation\7f17690
-Node: Comments\7f18586
-Node: Shell Commands\7f19204
-Node: Simple Commands\7f20076
-Node: Pipelines\7f20707
-Node: Lists\7f23445
-Node: Compound Commands\7f25174
-Node: Looping Constructs\7f26180
-Node: Conditional Constructs\7f28643
-Node: Command Grouping\7f39573
-Node: Coprocesses\7f41052
-Node: GNU Parallel\7f42885
-Node: Shell Functions\7f46871
-Node: Shell Parameters\7f51955
-Node: Positional Parameters\7f56084
-Node: Special Parameters\7f56984
-Node: Shell Expansions\7f60095
-Node: Brace Expansion\7f62038
-Node: Tilde Expansion\7f64819
-Node: Shell Parameter Expansion\7f67168
-Node: Command Substitution\7f79462
-Node: Arithmetic Expansion\7f80795
-Node: Process Substitution\7f81727
-Node: Word Splitting\7f82777
-Node: Filename Expansion\7f84425
-Node: Pattern Matching\7f86590
-Node: Quote Removal\7f90290
-Node: Redirections\7f90585
-Node: Executing Commands\7f99749
-Node: Simple Command Expansion\7f100419
-Node: Command Search and Execution\7f102349
-Node: Command Execution Environment\7f104686
-Node: Environment\7f107672
-Node: Exit Status\7f109331
-Node: Signals\7f110953
-Node: Shell Scripts\7f112921
-Node: Shell Builtin Commands\7f115439
-Node: Bourne Shell Builtins\7f117467
-Node: Bash Builtins\7f137374
-Node: Modifying Shell Behavior\7f164827
-Node: The Set Builtin\7f165172
-Node: The Shopt Builtin\7f175498
-Node: Special Builtins\7f189919
-Node: Shell Variables\7f190898
-Node: Bourne Shell Variables\7f191338
-Node: Bash Variables\7f193369
-Node: Bash Features\7f220244
-Node: Invoking Bash\7f221143
-Node: Bash Startup Files\7f226921
-Node: Interactive Shells\7f231950
-Node: What is an Interactive Shell?\7f232360
-Node: Is this Shell Interactive?\7f233009
-Node: Interactive Shell Behavior\7f233824
-Node: Bash Conditional Expressions\7f237112
-Node: Shell Arithmetic\7f241114
-Node: Aliases\7f243890
-Node: Arrays\7f246446
-Node: The Directory Stack\7f251427
-Node: Directory Stack Builtins\7f252146
-Node: Controlling the Prompt\7f255102
-Node: The Restricted Shell\7f257874
-Node: Bash POSIX Mode\7f259711
-Node: Job Control\7f269098
-Node: Job Control Basics\7f269558
-Node: Job Control Builtins\7f274277
-Node: Job Control Variables\7f278748
-Node: Command Line Editing\7f279906
-Node: Introduction and Notation\7f281578
-Node: Readline Interaction\7f283200
-Node: Readline Bare Essentials\7f284391
-Node: Readline Movement Commands\7f286180
-Node: Readline Killing Commands\7f287145
-Node: Readline Arguments\7f289065
-Node: Searching\7f290109
-Node: Readline Init File\7f292295
-Node: Readline Init File Syntax\7f293442
-Node: Conditional Init Constructs\7f310279
-Node: Sample Init File\7f312812
-Node: Bindable Readline Commands\7f315930
-Node: Commands For Moving\7f317137
-Node: Commands For History\7f318281
-Node: Commands For Text\7f322466
-Node: Commands For Killing\7f325395
-Node: Numeric Arguments\7f327852
-Node: Commands For Completion\7f328991
-Node: Keyboard Macros\7f333183
-Node: Miscellaneous Commands\7f333871
-Node: Readline vi Mode\7f339677
-Node: Programmable Completion\7f340584
-Node: Programmable Completion Builtins\7f347860
-Node: A Programmable Completion Example\7f357606
-Node: Using History Interactively\7f362856
-Node: Bash History Facilities\7f363540
-Node: Bash History Builtins\7f366539
-Node: History Interaction\7f370467
-Node: Event Designators\7f373172
-Node: Word Designators\7f374394
-Node: Modifiers\7f376033
-Node: Installing Bash\7f377437
-Node: Basic Installation\7f378574
-Node: Compilers and Options\7f381266
-Node: Compiling For Multiple Architectures\7f382007
-Node: Installation Names\7f383671
-Node: Specifying the System Type\7f384489
-Node: Sharing Defaults\7f385205
-Node: Operation Controls\7f385878
-Node: Optional Features\7f386836
-Node: Reporting Bugs\7f396900
-Node: Major Differences From The Bourne Shell\7f398098
-Node: GNU Free Documentation License\7f414957
-Node: Indexes\7f440153
-Node: Builtin Index\7f440607
-Node: Reserved Word Index\7f447434
-Node: Variable Index\7f449882
-Node: Function Index\7f464062
-Node: Concept Index\7f471363
+Node: Top\7f930
+Node: Introduction\7f2848
+Node: What is Bash?\7f3076
+Node: What is a shell?\7f4189
+Node: Definitions\7f6728
+Node: Basic Shell Features\7f9646
+Node: Shell Syntax\7f10865
+Node: Shell Operation\7f11895
+Node: Quoting\7f13189
+Node: Escape Character\7f14492
+Node: Single Quotes\7f14977
+Node: Double Quotes\7f15325
+Node: ANSI-C Quoting\7f16450
+Node: Locale Translation\7f17694
+Node: Comments\7f18590
+Node: Shell Commands\7f19208
+Node: Simple Commands\7f20080
+Node: Pipelines\7f20711
+Node: Lists\7f23449
+Node: Compound Commands\7f25178
+Node: Looping Constructs\7f26184
+Node: Conditional Constructs\7f28647
+Node: Command Grouping\7f39577
+Node: Coprocesses\7f41056
+Node: GNU Parallel\7f42889
+Node: Shell Functions\7f46875
+Node: Shell Parameters\7f51959
+Node: Positional Parameters\7f56088
+Node: Special Parameters\7f56988
+Node: Shell Expansions\7f60327
+Node: Brace Expansion\7f62270
+Node: Tilde Expansion\7f65051
+Node: Shell Parameter Expansion\7f67400
+Node: Command Substitution\7f79694
+Node: Arithmetic Expansion\7f81027
+Node: Process Substitution\7f81959
+Node: Word Splitting\7f83009
+Node: Filename Expansion\7f84657
+Node: Pattern Matching\7f86822
+Node: Quote Removal\7f90522
+Node: Redirections\7f90817
+Node: Executing Commands\7f99981
+Node: Simple Command Expansion\7f100651
+Node: Command Search and Execution\7f102581
+Node: Command Execution Environment\7f104918
+Node: Environment\7f107904
+Node: Exit Status\7f109563
+Node: Signals\7f111185
+Node: Shell Scripts\7f113153
+Node: Shell Builtin Commands\7f115671
+Node: Bourne Shell Builtins\7f117699
+Node: Bash Builtins\7f137606
+Node: Modifying Shell Behavior\7f165059
+Node: The Set Builtin\7f165404
+Node: The Shopt Builtin\7f175730
+Node: Special Builtins\7f190151
+Node: Shell Variables\7f191130
+Node: Bourne Shell Variables\7f191570
+Node: Bash Variables\7f193601
+Node: Bash Features\7f220476
+Node: Invoking Bash\7f221375
+Node: Bash Startup Files\7f227153
+Node: Interactive Shells\7f232182
+Node: What is an Interactive Shell?\7f232592
+Node: Is this Shell Interactive?\7f233241
+Node: Interactive Shell Behavior\7f234056
+Node: Bash Conditional Expressions\7f237344
+Node: Shell Arithmetic\7f241346
+Node: Aliases\7f244122
+Node: Arrays\7f246678
+Node: The Directory Stack\7f251659
+Node: Directory Stack Builtins\7f252378
+Node: Controlling the Prompt\7f255334
+Node: The Restricted Shell\7f258106
+Node: Bash POSIX Mode\7f259943
+Node: Job Control\7f269330
+Node: Job Control Basics\7f269790
+Node: Job Control Builtins\7f274509
+Node: Job Control Variables\7f278980
+Node: Command Line Editing\7f280138
+Node: Introduction and Notation\7f281810
+Node: Readline Interaction\7f283432
+Node: Readline Bare Essentials\7f284623
+Node: Readline Movement Commands\7f286412
+Node: Readline Killing Commands\7f287377
+Node: Readline Arguments\7f289297
+Node: Searching\7f290341
+Node: Readline Init File\7f292527
+Node: Readline Init File Syntax\7f293674
+Node: Conditional Init Constructs\7f310511
+Node: Sample Init File\7f313044
+Node: Bindable Readline Commands\7f316162
+Node: Commands For Moving\7f317369
+Node: Commands For History\7f318513
+Node: Commands For Text\7f322698
+Node: Commands For Killing\7f325627
+Node: Numeric Arguments\7f328084
+Node: Commands For Completion\7f329223
+Node: Keyboard Macros\7f333415
+Node: Miscellaneous Commands\7f334103
+Node: Readline vi Mode\7f339909
+Node: Programmable Completion\7f340816
+Node: Programmable Completion Builtins\7f348092
+Node: A Programmable Completion Example\7f357838
+Node: Using History Interactively\7f363088
+Node: Bash History Facilities\7f363772
+Node: Bash History Builtins\7f366771
+Node: History Interaction\7f370699
+Node: Event Designators\7f373404
+Node: Word Designators\7f374626
+Node: Modifiers\7f376265
+Node: Installing Bash\7f377669
+Node: Basic Installation\7f378806
+Node: Compilers and Options\7f381498
+Node: Compiling For Multiple Architectures\7f382239
+Node: Installation Names\7f383903
+Node: Specifying the System Type\7f384721
+Node: Sharing Defaults\7f385437
+Node: Operation Controls\7f386110
+Node: Optional Features\7f387068
+Node: Reporting Bugs\7f397132
+Node: Major Differences From The Bourne Shell\7f398330
+Node: GNU Free Documentation License\7f415189
+Node: Indexes\7f440385
+Node: Builtin Index\7f440839
+Node: Reserved Word Index\7f447666
+Node: Variable Index\7f450114
+Node: Function Index\7f464294
+Node: Concept Index\7f471595
 \1f
 End Tag Table
index 11c97f7f2f2479acde2d1b9f6c2e0c80a104e7de..2f101d042bd5e97429690e04f0b0795c20b7d992 100644 (file)
@@ -1,4 +1,4 @@
-This is TeX, Version 3.1415926 (TeX Live 2011/Fink) (format=tex 2012.4.18)  9 JAN 2014 16:24
+This is TeX, Version 3.1415926 (TeX Live 2011/Fink) (format=tex 2012.4.18)  4 FEB 2014 09:39
 **/usr/homes/chet/src/bash/src/doc/bashref.texi
 (/usr/homes/chet/src/bash/src/doc/bashref.texi (./texinfo.tex
 Loading texinfo [version 2013-09-11.11]:
@@ -238,11 +238,11 @@ arallel -k traceroute[]
 .etc.
 
 [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]
-[31] [32] [33] [34] [35] [36] [37] [38] Chapter 4 [39] [40] [41] [42] [43]
+[31] [32] [33] [34] [35] [36] [37] [38] [39] Chapter 4 [40] [41] [42] [43]
 [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58]
 [59] [60] [61] [62] [63] [64] [65] [66] [67] Chapter 5 [68] [69] [70] [71]
 [72] [73] [74] [75] [76] [77] [78] Chapter 6 [79]
-Overfull \hbox (49.43388pt too wide) in paragraph at lines 5996--5996
+Overfull \hbox (49.43388pt too wide) in paragraph at lines 5999--5999
  []@texttt bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@t
 exttt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar-
 
@@ -255,7 +255,7 @@ exttt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar-
 .etc.
 
 
-Overfull \hbox (72.42863pt too wide) in paragraph at lines 5997--5997
+Overfull \hbox (72.42863pt too wide) in paragraph at lines 6000--6000
  []@texttt bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@texttt 
 ] [-O @textttsl shopt_option@texttt ] -c @textttsl string @texttt [@textttsl ar
 -
@@ -269,7 +269,7 @@ Overfull \hbox (72.42863pt too wide) in paragraph at lines 5997--5997
 .etc.
 
 
-Overfull \hbox (32.18782pt too wide) in paragraph at lines 5998--5998
+Overfull \hbox (32.18782pt too wide) in paragraph at lines 6001--6001
  []@texttt bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@text
 tt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar-
 
@@ -379,10 +379,10 @@ Overfull \vbox (10.81442pt too high) has occurred while \output is active
 Here is how much of TeX's memory you used:
  2225 strings out of 497974
  30407 string characters out of 3220833
- 68772 words of memory out of 3000000
+ 68774 words of memory out of 3000000
  3040 multiletter control sequences out of 15000+200000
  32896 words of font info for 113 fonts, out of 3000000 for 9000
  51 hyphenation exceptions out of 8191
  16i,6n,14p,319b,749s stack positions out of 5000i,500n,10000p,200000b,50000s
 
-Output written on bashref.dvi (172 pages, 721324 bytes).
+Output written on bashref.dvi (172 pages, 721588 bytes).
index ccc62a80fe72e7ab717dec25756fdf6b6c0b503a..055025e1078c128ee72eaa77083be3ada76f23ca 100644 (file)
Binary files a/doc/bashref.pdf and b/doc/bashref.pdf differ
index 31a1ed898338da1f742f3fc7e3a6983815fb77ba..e080c0fafed6cf1bbd155ca64852a9ac50b70b7d 100644 (file)
@@ -1,7 +1,7 @@
 %!PS-Adobe-2.0
 %%Creator: dvips(k) 5.991 Copyright 2011 Radical Eye Software
 %%Title: bashref.dvi
-%%CreationDate: Thu Jan 23 15:52:08 2014
+%%CreationDate: Tue Feb  4 09:39:05 2014
 %%Pages: 172
 %%PageOrder: Ascend
 %%BoundingBox: 0 0 612 792
@@ -12,7 +12,7 @@
 %DVIPSWebPage: (www.radicaleye.com)
 %DVIPSCommandLine: dvips -D 600 -t letter -o bashref.ps bashref.dvi
 %DVIPSParameters: dpi=600
-%DVIPSSource:  TeX output 2014.01.09:1624
+%DVIPSSource:  TeX output 2014.02.04:0939
 %%BeginProcSet: tex.pro 0 0
 %!
 /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
@@ -7528,23 +7528,24 @@ ifelse
 TeXDict begin 1 0 bop 150 1318 a Fv(Bash)64 b(Reference)j(Man)-5
 b(ual)p 150 1385 3600 34 v 2361 1481 a Fu(Reference)31
 b(Do)s(cumen)m(tation)i(for)d(Bash)2428 1589 y(Edition)h(4.3,)g(for)f
-Ft(Bash)g Fu(V)-8 b(ersion)31 b(4.3.)3218 1697 y(Jan)m(uary)f(2014)150
-4935 y Fs(Chet)45 b(Ramey)-11 b(,)46 b(Case)g(W)-11 b(estern)46
-b(Reserv)l(e)g(Univ)l(ersit)l(y)150 5068 y(Brian)f(F)-11
-b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)-11
-b(oundation)p 150 5141 3600 17 v eop end
+Ft(Bash)g Fu(V)-8 b(ersion)31 b(4.3.)3180 1697 y(F)-8
+b(ebruary)30 b(2014)150 4935 y Fs(Chet)45 b(Ramey)-11
+b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150
+5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)
+-11 b(oundation)p 150 5141 3600 17 v eop end
 %%Page: 2 2
 TeXDict begin 2 1 bop 150 4279 a Fu(This)35 b(text)h(is)g(a)g(brief)f
 (description)h(of)f(the)h(features)g(that)g(are)g(presen)m(t)g(in)f
-(the)h(Bash)f(shell)h(\(v)m(ersion)150 4389 y(4.3,)c(6)e(Jan)m(uary)g
-(2014\).)150 4523 y(This)e(is)i(Edition)f(4.3,)i(last)f(up)s(dated)e(6)
-h(Jan)m(uary)g(2014,)i(of)f Fr(The)e(GNU)i(Bash)g(Reference)g(Man)m
-(ual)p Fu(,)g(for)150 4633 y Ft(Bash)p Fu(,)f(V)-8 b(ersion)31
-b(4.3.)150 4767 y(Cop)m(yrigh)m(t)602 4764 y(c)577 4767
-y Fq(\015)f Fu(1988{2014)35 b(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8
-b(oundation,)31 b(Inc.)390 4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h
-(to)g(cop)m(y)-8 b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s
-(cumen)m(t)f(under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8
+(the)h(Bash)f(shell)h(\(v)m(ersion)150 4389 y(4.3,)c(2)e(F)-8
+b(ebruary)31 b(2014\).)150 4523 y(This)26 b(is)g(Edition)h(4.3,)i(last)
+e(up)s(dated)e(2)i(F)-8 b(ebruary)26 b(2014,)k(of)d Fr(The)f(GNU)h
+(Bash)f(Reference)i(Man)m(ual)p Fu(,)g(for)150 4633 y
+Ft(Bash)p Fu(,)h(V)-8 b(ersion)31 b(4.3.)150 4767 y(Cop)m(yrigh)m(t)602
+4764 y(c)577 4767 y Fq(\015)f Fu(1988{2014)35 b(F)-8
+b(ree)31 b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390
+4902 y(P)m(ermission)21 b(is)f(gran)m(ted)h(to)g(cop)m(y)-8
+b(,)24 b(distribute)c(and/or)h(mo)s(dify)e(this)i(do)s(cumen)m(t)f
+(under)f(the)390 5011 y(terms)25 b(of)h(the)f(GNU)h(F)-8
 b(ree)27 b(Do)s(cumen)m(tation)g(License,)g(V)-8 b(ersion)26
 b(1.3)g(or)f(an)m(y)h(later)g(v)m(ersion)390 5121 y(published)43
 b(b)m(y)h(the)h(F)-8 b(ree)46 b(Soft)m(w)m(are)g(F)-8
@@ -7671,7 +7672,7 @@ h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g
 (:)42 b Fu(28)399 4605 y(3.5.5)93 b(Arithmetic)31 b(Expansion)19
 b Fn(:)c(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)
 f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
-(:)h(:)48 b Fu(28)399 4715 y(3.5.6)93 b(Pro)s(cess)30
+(:)h(:)48 b Fu(29)399 4715 y(3.5.6)93 b(Pro)s(cess)30
 b(Substitution)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h
 (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)
 h(:)f(:)h(:)f(:)g(:)h(:)f(:)57 b Fu(29)399 4824 y(3.5.7)93
@@ -7681,7 +7682,7 @@ f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)49
 b Fu(29)399 4934 y(3.5.8)93 b(Filename)32 b(Expansion)13
 b Fn(:)i(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)
 f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h
-(:)f(:)h(:)f(:)43 b Fu(29)524 5044 y(3.5.8.1)93 b(P)m(attern)31
+(:)f(:)h(:)f(:)43 b Fu(30)524 5044 y(3.5.8.1)93 b(P)m(attern)31
 b(Matc)m(hing)d Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
 (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)
 h(:)f(:)g(:)h(:)f(:)56 b Fu(30)399 5153 y(3.5.9)93 b(Quote)31
@@ -7708,7 +7709,7 @@ b(Redirected)k(Output)12 b Fn(:)h(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f
 (and)f(Standard)h(Error)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)58
 b Fu(33)399 521 y(3.6.5)93 b(App)s(ending)28 b(Standard)i(Output)f(and)
 h(Standard)f(Error)19 b Fn(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)48
-b Fu(33)399 631 y(3.6.6)93 b(Here)31 b(Do)s(cumen)m(ts)c
+b Fu(34)399 631 y(3.6.6)93 b(Here)31 b(Do)s(cumen)m(ts)c
 Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f
 (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)
 h(:)f(:)g(:)h(:)f(:)h(:)f(:)56 b Fu(34)399 741 y(3.6.7)93
@@ -8264,7 +8265,7 @@ b(the)h(v)-5 b(arious)40 b(shell)h(expansions)f(\(see)h(Section)g(3.5)g
 ([Shell)g(Expansions],)h(page)f(21\),)330 4550 y(breaking)35
 b(the)g(expanded)g(tok)m(ens)h(in)m(to)g(lists)f(of)g(\014lenames)h
 (\(see)g(Section)f(3.5.8)i([Filename)g(Ex-)330 4660 y(pansion],)30
-b(page)h(29\))h(and)e(commands)g(and)g(argumen)m(ts.)199
+b(page)h(30\))h(and)e(commands)g(and)g(argumen)m(ts.)199
 4806 y(5.)61 b(P)m(erforms)36 b(an)m(y)i(necessary)f(redirections)g
 (\(see)h(Section)f(3.6)h([Redirections],)i(page)e(31\))g(and)e(re-)330
 4915 y(mo)m(v)m(es)c(the)e(redirection)h(op)s(erators)g(and)f(their)g
@@ -9306,7 +9307,7 @@ b Fu(is)33 b(ev)-5 b(aluated)34 b(as)f(an)g(arithmetic)h(expression)f
 TeXDict begin 19 24 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(19)150 299
 y(\(see)31 b(Section)g(3.5.5)i([Arithmetic)e(Expansion],)f(page)h
-(28\).)42 b(W)-8 b(ord)31 b(splitting)g(is)g(not)f(p)s(erformed,)f
+(29\).)42 b(W)-8 b(ord)31 b(splitting)g(is)g(not)f(p)s(erformed,)f
 (with)150 408 y(the)35 b(exception)h(of)f Ft("$@")f Fu(as)h(explained)g
 (b)s(elo)m(w.)54 b(Filename)36 b(expansion)f(is)g(not)g(p)s(erformed.)
 53 b(Assign-)150 518 y(men)m(t)33 b(statemen)m(ts)h(ma)m(y)f(also)g
@@ -9413,1531 +9414,1531 @@ TeXDict begin 20 25 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(20)275 299
 y(When)27 b(a)i(p)s(ositional)g(parameter)g(consisting)f(of)h(more)f
 (than)g(a)g(single)h(digit)g(is)f(expanded,)g(it)h(m)m(ust)150
-408 y(b)s(e)h(enclosed)h(in)f(braces.)150 614 y Fk(3.4.2)63
-b(Sp)s(ecial)41 b(P)m(arameters)150 761 y Fu(The)d(shell)g(treats)h
+408 y(b)s(e)h(enclosed)h(in)f(braces.)150 605 y Fk(3.4.2)63
+b(Sp)s(ecial)41 b(P)m(arameters)150 752 y Fu(The)d(shell)g(treats)h
 (sev)m(eral)g(parameters)f(sp)s(ecially)-8 b(.)65 b(These)38
 b(parameters)h(ma)m(y)f(only)g(b)s(e)g(referenced;)150
-870 y(assignmen)m(t)31 b(to)g(them)g(is)f(not)h(allo)m(w)m(ed.)150
-1039 y Ft(*)432 b Fu(\($*\))38 b(Expands)d(to)i(the)f(p)s(ositional)h
+862 y(assignmen)m(t)31 b(to)g(them)g(is)f(not)h(allo)m(w)m(ed.)150
+1018 y Ft(*)432 b Fu(\($*\))38 b(Expands)d(to)i(the)f(p)s(ositional)h
 (parameters,)h(starting)f(from)f(one.)59 b(When)36 b(the)g(ex-)630
-1149 y(pansion)25 b(o)s(ccurs)h(within)f(double)h(quotes,)h(it)g
-(expands)e(to)h(a)h(single)f(w)m(ord)g(with)f(the)h(v)-5
-b(alue)630 1258 y(of)33 b(eac)m(h)i(parameter)e(separated)h(b)m(y)f
-(the)h(\014rst)e(c)m(haracter)j(of)e(the)h Ft(IFS)e Fu(sp)s(ecial)i(v)
--5 b(ariable.)630 1368 y(That)37 b(is,)j Ft("$*")c Fu(is)h(equiv)-5
-b(alen)m(t)39 b(to)f Ft("$1)p Fj(c)p Ft($2)p Fj(c)p Ft(...)n(")p
-Fu(,)h(where)e Fr(c)43 b Fu(is)37 b(the)h(\014rst)f(c)m(haracter)i(of)
-630 1477 y(the)31 b(v)-5 b(alue)32 b(of)f(the)g Ft(IFS)f
-Fu(v)-5 b(ariable.)43 b(If)31 b Ft(IFS)f Fu(is)h(unset,)g(the)g
-(parameters)g(are)h(separated)f(b)m(y)630 1587 y(spaces.)40
-b(If)25 b Ft(IFS)g Fu(is)h(n)m(ull,)h(the)f(parameters)g(are)h(joined)e
-(without)h(in)m(terv)m(ening)h(separators.)150 1753 y
-Ft(@)432 b Fu(\($@\))35 b(Expands)e(to)i(the)g(p)s(ositional)g
-(parameters,)h(starting)f(from)f(one.)53 b(When)34 b(the)g(ex-)630
-1862 y(pansion)41 b(o)s(ccurs)g(within)f(double)h(quotes,)k(eac)m(h)d
-(parameter)g(expands)e(to)i(a)g(separate)630 1972 y(w)m(ord.)50
-b(That)34 b(is,)g Ft("$@")f Fu(is)g(equiv)-5 b(alen)m(t)35
-b(to)g Ft("$1")29 b("$2")g(...)o Fu(.)51 b(If)33 b(the)h(double-quoted)
-f(ex-)630 2081 y(pansion)38 b(o)s(ccurs)h(within)f(a)h(w)m(ord,)i(the)e
+1128 y(pansion)h(is)h(not)g(within)f(double)g(quotes,)j(eac)m(h)f(p)s
+(ositional)f(parameter)g(expands)f(to)i(a)630 1237 y(separate)e(w)m
+(ord.)56 b(In)35 b(con)m(texts)i(where)e(it)h(is)g(p)s(erformed,)g
+(those)g(w)m(ords)f(are)h(sub)5 b(ject)35 b(to)630 1347
+y(further)h(w)m(ord)h(splitting)h(and)f(pathname)g(expansion.)61
+b(When)38 b(the)f(expansion)g(o)s(ccurs)630 1457 y(within)25
+b(double)h(quotes,)h(it)f(expands)f(to)i(a)f(single)g(w)m(ord)f(with)h
+(the)g(v)-5 b(alue)26 b(of)g(eac)m(h)h(param-)630 1566
+y(eter)32 b(separated)h(b)m(y)e(the)h(\014rst)f(c)m(haracter)i(of)f
+(the)g Ft(IFS)f Fu(sp)s(ecial)h(v)-5 b(ariable.)45 b(That)32
+b(is,)g Ft("$*")630 1676 y Fu(is)f(equiv)-5 b(alen)m(t)32
+b(to)g Ft("$1)p Fj(c)p Ft($2)p Fj(c)p Ft(...)m(")p Fu(,)f(where)g
+Fr(c)37 b Fu(is)31 b(the)g(\014rst)f(c)m(haracter)j(of)e(the)g(v)-5
+b(alue)32 b(of)f(the)630 1785 y Ft(IFS)e Fu(v)-5 b(ariable.)41
+b(If)29 b Ft(IFS)g Fu(is)h(unset,)f(the)h(parameters)g(are)g(separated)
+g(b)m(y)g(spaces.)41 b(If)29 b Ft(IFS)g Fu(is)630 1895
+y(n)m(ull,)i(the)f(parameters)h(are)g(joined)f(without)g(in)m(terv)m
+(ening)i(separators.)150 2052 y Ft(@)432 b Fu(\($@\))35
+b(Expands)e(to)i(the)g(p)s(ositional)g(parameters,)h(starting)f(from)f
+(one.)53 b(When)34 b(the)g(ex-)630 2161 y(pansion)41
+b(o)s(ccurs)g(within)f(double)h(quotes,)k(eac)m(h)d(parameter)g
+(expands)e(to)i(a)g(separate)630 2271 y(w)m(ord.)50 b(That)34
+b(is,)g Ft("$@")f Fu(is)g(equiv)-5 b(alen)m(t)35 b(to)g
+Ft("$1")29 b("$2")g(...)o Fu(.)51 b(If)33 b(the)h(double-quoted)f(ex-)
+630 2380 y(pansion)38 b(o)s(ccurs)h(within)f(a)h(w)m(ord,)i(the)e
 (expansion)g(of)g(the)g(\014rst)f(parameter)h(is)g(joined)630
-2191 y(with)i(the)h(b)s(eginning)e(part)i(of)f(the)h(original)g(w)m
-(ord,)i(and)d(the)h(expansion)f(of)g(the)h(last)630 2300
+2490 y(with)i(the)h(b)s(eginning)e(part)i(of)f(the)h(original)g(w)m
+(ord,)i(and)d(the)h(expansion)f(of)g(the)h(last)630 2600
 y(parameter)31 b(is)f(joined)g(with)f(the)i(last)g(part)e(of)i(the)f
 (original)h(w)m(ord.)40 b(When)30 b(there)h(are)f(no)630
-2410 y(p)s(ositional)e(parameters,)h Ft("$@")d Fu(and)h
+2709 y(p)s(ositional)e(parameters,)h Ft("$@")d Fu(and)h
 Ft($@)f Fu(expand)h(to)h(nothing)f(\(i.e.,)j(they)e(are)f(remo)m(v)m
-(ed\).)150 2576 y Ft(#)432 b Fu(\($#\))31 b(Expands)e(to)i(the)g(n)m
+(ed\).)150 2866 y Ft(#)432 b Fu(\($#\))31 b(Expands)e(to)i(the)g(n)m
 (um)m(b)s(er)e(of)h(p)s(ositional)i(parameters)e(in)g(decimal.)150
-2741 y Ft(?)432 b Fu(\($?\))88 b(Expands)45 b(to)h(the)g(exit)h(status)
+3022 y Ft(?)432 b Fu(\($?\))88 b(Expands)45 b(to)h(the)g(exit)h(status)
 f(of)g(the)g(most)h(recen)m(tly)g(executed)g(foreground)630
-2851 y(pip)s(eline.)150 3016 y Ft(-)432 b Fu(\($-,)24
+3132 y(pip)s(eline.)150 3289 y Ft(-)432 b Fu(\($-,)24
 b(a)e(h)m(yphen.\))37 b(Expands)20 b(to)i(the)f(curren)m(t)h(option)f
 (\015ags)h(as)f(sp)s(eci\014ed)g(up)s(on)f(in)m(v)m(o)s(cation,)630
-3126 y(b)m(y)38 b(the)h Ft(set)f Fu(builtin)g(command,)j(or)d(those)i
+3398 y(b)m(y)38 b(the)h Ft(set)f Fu(builtin)g(command,)j(or)d(those)i
 (set)f(b)m(y)f(the)h(shell)g(itself)g(\(suc)m(h)g(as)g(the)g
-Ft(-i)630 3235 y Fu(option\).)150 3401 y Ft($)432 b Fu(\($$\))31
+Ft(-i)630 3508 y Fu(option\).)150 3665 y Ft($)432 b Fu(\($$\))31
 b(Expands)d(to)j(the)e(pro)s(cess)h Fm(id)f Fu(of)h(the)g(shell.)41
 b(In)28 b(a)i Ft(\(\))f Fu(subshell,)h(it)g(expands)e(to)j(the)630
-3511 y(pro)s(cess)f Fm(id)g Fu(of)h(the)g(in)m(v)m(oking)g(shell,)g
-(not)g(the)f(subshell.)150 3676 y Ft(!)432 b Fu(\($!\))51
+3774 y(pro)s(cess)f Fm(id)g Fu(of)h(the)g(in)m(v)m(oking)g(shell,)g
+(not)g(the)f(subshell.)150 3931 y Ft(!)432 b Fu(\($!\))51
 b(Expands)32 b(to)i(the)g(pro)s(cess)f Fm(id)h Fu(of)f(the)h(job)f
 (most)h(recen)m(tly)h(placed)f(in)m(to)g(the)g(bac)m(k-)630
-3786 y(ground,)26 b(whether)g(executed)g(as)h(an)f(async)m(hronous)f
+4040 y(ground,)26 b(whether)g(executed)g(as)h(an)f(async)m(hronous)f
 (command)h(or)g(using)g(the)g Ft(bg)f Fu(builtin)630
-3895 y(\(see)31 b(Section)h(7.2)f([Job)f(Con)m(trol)h(Builtins],)g
-(page)h(98\).)150 4061 y Ft(0)432 b Fu(\($0\))46 b(Expands)d(to)i(the)g
+4150 y(\(see)31 b(Section)h(7.2)f([Job)f(Con)m(trol)h(Builtins],)g
+(page)h(98\).)150 4307 y Ft(0)432 b Fu(\($0\))46 b(Expands)d(to)i(the)g
 (name)g(of)f(the)h(shell)g(or)f(shell)h(script.)83 b(This)44
-b(is)g(set)h(at)h(shell)630 4170 y(initialization.)d(If)27
+b(is)g(set)h(at)h(shell)630 4416 y(initialization.)d(If)27
 b(Bash)h(is)g(in)m(v)m(ok)m(ed)h(with)e(a)i(\014le)e(of)h(commands)g
-(\(see)g(Section)h(3.8)g([Shell)630 4280 y(Scripts],)g(page)g(39\),)h
+(\(see)g(Section)h(3.8)g([Shell)630 4526 y(Scripts],)g(page)g(39\),)h
 Ft($0)e Fu(is)h(set)g(to)g(the)f(name)h(of)f(that)h(\014le.)41
-b(If)28 b(Bash)g(is)h(started)g(with)f(the)630 4390 y
+b(If)28 b(Bash)g(is)h(started)g(with)f(the)630 4635 y
 Ft(-c)i Fu(option)h(\(see)h(Section)g(6.1)f([In)m(v)m(oking)h(Bash],)g
 (page)f(80\),)i(then)d Ft($0)g Fu(is)h(set)g(to)h(the)f(\014rst)630
-4499 y(argumen)m(t)g(after)g(the)g(string)g(to)g(b)s(e)f(executed,)i
+4745 y(argumen)m(t)g(after)g(the)g(string)g(to)g(b)s(e)f(executed,)i
 (if)f(one)g(is)f(presen)m(t.)42 b(Otherwise,)31 b(it)g(is)f(set)630
-4609 y(to)h(the)g(\014lename)f(used)g(to)h(in)m(v)m(ok)m(e)h(Bash,)f
-(as)g(giv)m(en)g(b)m(y)f(argumen)m(t)h(zero.)150 4774
-y Ft(_)432 b Fu(\($)p 716 4774 28 4 v 41 w(,)41 b(an)e(underscore.\))67
+4855 y(to)h(the)g(\014lename)f(used)g(to)h(in)m(v)m(ok)m(e)h(Bash,)f
+(as)g(giv)m(en)g(b)m(y)f(argumen)m(t)h(zero.)150 5011
+y Ft(_)432 b Fu(\($)p 716 5011 28 4 v 41 w(,)41 b(an)e(underscore.\))67
 b(A)m(t)40 b(shell)f(startup,)i(set)f(to)g(the)f(absolute)h(pathname)f
-(used)f(to)630 4884 y(in)m(v)m(ok)m(e)43 b(the)e(shell)g(or)g(shell)g
+(used)f(to)630 5121 y(in)m(v)m(ok)m(e)43 b(the)e(shell)g(or)g(shell)g
 (script)g(b)s(eing)f(executed)i(as)f(passed)g(in)f(the)h(en)m(vironmen)
-m(t)630 4994 y(or)34 b(argumen)m(t)g(list.)52 b(Subsequen)m(tly)-8
+m(t)630 5230 y(or)34 b(argumen)m(t)g(list.)52 b(Subsequen)m(tly)-8
 b(,)34 b(expands)f(to)i(the)f(last)h(argumen)m(t)f(to)g(the)g(previous)
-630 5103 y(command,)g(after)f(expansion.)48 b(Also)34
+630 5340 y(command,)g(after)f(expansion.)48 b(Also)34
 b(set)g(to)f(the)g(full)g(pathname)g(used)f(to)i(in)m(v)m(ok)m(e)h(eac)
-m(h)630 5213 y(command)29 b(executed)h(and)f(placed)g(in)g(the)h(en)m
-(vironmen)m(t)f(exp)s(orted)g(to)h(that)g(command.)630
-5322 y(When)g(c)m(hec)m(king)i(mail,)g(this)e(parameter)h(holds)f(the)g
-(name)h(of)f(the)h(mail)g(\014le.)p eop end
+m(h)p eop end
 %%Page: 21 27
 TeXDict begin 21 26 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(21)150 299
-y Fs(3.5)68 b(Shell)45 b(Expansions)150 458 y Fu(Expansion)27
-b(is)i(p)s(erformed)d(on)i(the)g(command)g(line)h(after)f(it)h(has)f(b)
-s(een)f(split)h(in)m(to)i Ft(token)p Fu(s.)38 b(There)28
-b(are)150 568 y(sev)m(en)j(kinds)e(of)i(expansion)f(p)s(erformed:)225
-702 y Fq(\017)60 b Fu(brace)31 b(expansion)225 837 y
-Fq(\017)60 b Fu(tilde)31 b(expansion)225 971 y Fq(\017)60
-b Fu(parameter)31 b(and)f(v)-5 b(ariable)31 b(expansion)225
-1105 y Fq(\017)60 b Fu(command)30 b(substitution)225
-1240 y Fq(\017)60 b Fu(arithmetic)32 b(expansion)225
-1374 y Fq(\017)60 b Fu(w)m(ord)30 b(splitting)225 1508
-y Fq(\017)60 b Fu(\014lename)31 b(expansion)275 1667
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(21)630 299
+y(command)29 b(executed)h(and)f(placed)g(in)g(the)h(en)m(vironmen)m(t)f
+(exp)s(orted)g(to)h(that)g(command.)630 408 y(When)g(c)m(hec)m(king)i
+(mail,)g(this)e(parameter)h(holds)f(the)g(name)h(of)f(the)h(mail)g
+(\014le.)150 639 y Fs(3.5)68 b(Shell)45 b(Expansions)150
+799 y Fu(Expansion)27 b(is)i(p)s(erformed)d(on)i(the)g(command)g(line)h
+(after)f(it)h(has)f(b)s(een)f(split)h(in)m(to)i Ft(token)p
+Fu(s.)38 b(There)28 b(are)150 908 y(sev)m(en)j(kinds)e(of)i(expansion)f
+(p)s(erformed:)225 1042 y Fq(\017)60 b Fu(brace)31 b(expansion)225
+1176 y Fq(\017)60 b Fu(tilde)31 b(expansion)225 1309
+y Fq(\017)60 b Fu(parameter)31 b(and)f(v)-5 b(ariable)31
+b(expansion)225 1443 y Fq(\017)60 b Fu(command)30 b(substitution)225
+1577 y Fq(\017)60 b Fu(arithmetic)32 b(expansion)225
+1710 y Fq(\017)60 b Fu(w)m(ord)30 b(splitting)225 1844
+y Fq(\017)60 b Fu(\014lename)31 b(expansion)275 2002
 y(The)24 b(order)h(of)h(expansions)f(is:)39 b(brace)25
 b(expansion;)j(tilde)e(expansion,)g(parameter)g(and)f(v)-5
-b(ariable)26 b(ex-)150 1777 y(pansion,)j(arithmetic)i(expansion,)f(and)
+b(ariable)26 b(ex-)150 2111 y(pansion,)j(arithmetic)i(expansion,)f(and)
 f(command)g(substitution)g(\(done)g(in)h(a)f(left-to-righ)m(t)k
-(fashion\);)150 1887 y(w)m(ord)d(splitting;)h(and)f(\014lename)h
-(expansion.)275 2021 y(On)42 b(systems)h(that)h(can)g(supp)s(ort)e(it,)
+(fashion\);)150 2221 y(w)m(ord)d(splitting;)h(and)f(\014lename)h
+(expansion.)275 2355 y(On)42 b(systems)h(that)h(can)g(supp)s(ort)e(it,)
 47 b(there)d(is)f(an)h(additional)g(expansion)f(a)m(v)-5
-b(ailable:)69 b Fr(pro)s(cess)150 2131 y(substitution)p
+b(ailable:)69 b Fr(pro)s(cess)150 2464 y(substitution)p
 Fu(.)50 b(This)33 b(is)h(p)s(erformed)e(at)j(the)f(same)g(time)g(as)g
 (tilde,)i(parameter,)f(v)-5 b(ariable,)35 b(and)f(arith-)150
-2240 y(metic)d(expansion)g(and)e(command)i(substitution.)275
-2374 y(Only)k(brace)i(expansion,)h(w)m(ord)e(splitting,)j(and)d
+2574 y(metic)d(expansion)g(and)e(command)i(substitution.)275
+2707 y(Only)k(brace)i(expansion,)h(w)m(ord)e(splitting,)j(and)d
 (\014lename)g(expansion)g(can)h(c)m(hange)h(the)e(n)m(um)m(b)s(er)150
-2484 y(of)h(w)m(ords)f(of)g(the)h(expansion;)i(other)e(expansions)f
+2817 y(of)h(w)m(ords)f(of)g(the)h(expansion;)i(other)e(expansions)f
 (expand)g(a)h(single)g(w)m(ord)f(to)h(a)g(single)g(w)m(ord.)58
-b(The)150 2594 y(only)32 b(exceptions)i(to)f(this)f(are)h(the)f
+b(The)150 2927 y(only)32 b(exceptions)i(to)f(this)f(are)h(the)f
 (expansions)g(of)h Ft("$@")e Fu(\(see)i(Section)g(3.4.2)h([Sp)s(ecial)f
-(P)m(arameters],)150 2703 y(page)e(20\))h(and)d Ft("${)p
+(P)m(arameters],)150 3036 y(page)e(20\))h(and)d Ft("${)p
 Fj(name)p Ft([@]}")e Fu(\(see)32 b(Section)f(6.7)g([Arra)m(ys],)h(page)
-f(89\).)275 2838 y(After)41 b(all)i(expansions,)h Ft(quote)29
+f(89\).)275 3170 y(After)41 b(all)i(expansions,)h Ft(quote)29
 b(removal)40 b Fu(\(see)i(Section)h(3.5.9)g([Quote)f(Remo)m(v)-5
-b(al],)47 b(page)42 b(31\))h(is)150 2947 y(p)s(erformed.)150
-3146 y Fk(3.5.1)63 b(Brace)40 b(Expansion)150 3293 y
+b(al],)47 b(page)42 b(31\))h(is)150 3279 y(p)s(erformed.)150
+3477 y Fk(3.5.1)63 b(Brace)40 b(Expansion)150 3624 y
 Fu(Brace)32 b(expansion)f(is)f(a)i(mec)m(hanism)f(b)m(y)f(whic)m(h)h
 (arbitrary)f(strings)h(ma)m(y)g(b)s(e)f(generated.)43
-b(This)30 b(mec)m(h-)150 3403 y(anism)35 b(is)h(similar)f(to)h
+b(This)30 b(mec)m(h-)150 3733 y(anism)35 b(is)h(similar)f(to)h
 Fr(\014lename)g(expansion)f Fu(\(see)i(Section)f(3.5.8)h([Filename)g
-(Expansion],)f(page)g(29\),)150 3512 y(but)26 b(the)h(\014lenames)g
+(Expansion],)f(page)g(30\),)150 3843 y(but)26 b(the)h(\014lenames)g
 (generated)h(need)f(not)g(exist.)40 b(P)m(atterns)28
 b(to)f(b)s(e)g(brace)g(expanded)f(tak)m(e)i(the)f(form)g(of)150
-3622 y(an)j(optional)h Fr(pream)m(ble)p Fu(,)g(follo)m(w)m(ed)g(b)m(y)f
+3953 y(an)j(optional)h Fr(pream)m(ble)p Fu(,)g(follo)m(w)m(ed)g(b)m(y)f
 (either)g(a)h(series)f(of)g(comma-separated)i(strings)d(or)h(a)h
-(sequence)150 3731 y(expression)36 b(b)s(et)m(w)m(een)g(a)h(pair)e(of)i
+(sequence)150 4062 y(expression)36 b(b)s(et)m(w)m(een)g(a)h(pair)e(of)i
 (braces,)g(follo)m(w)m(ed)h(b)m(y)e(an)g(optional)h Fr(p)s(ostscript)p
-Fu(.)57 b(The)36 b(pream)m(ble)g(is)150 3841 y(pre\014xed)28
+Fu(.)57 b(The)36 b(pream)m(ble)g(is)150 4172 y(pre\014xed)28
 b(to)h(eac)m(h)h(string)f(con)m(tained)h(within)e(the)h(braces,)g(and)g
 (the)g(p)s(ostscript)f(is)h(then)f(app)s(ended)f(to)150
-3951 y(eac)m(h)32 b(resulting)e(string,)h(expanding)e(left)j(to)f(righ)
-m(t.)275 4085 y(Brace)37 b(expansions)f(ma)m(y)h(b)s(e)f(nested.)59
+4281 y(eac)m(h)32 b(resulting)e(string,)h(expanding)e(left)j(to)f(righ)
+m(t.)275 4415 y(Brace)37 b(expansions)f(ma)m(y)h(b)s(e)f(nested.)59
 b(The)36 b(results)g(of)h(eac)m(h)g(expanded)f(string)g(are)h(not)g
-(sorted;)150 4195 y(left)31 b(to)g(righ)m(t)g(order)f(is)g(preserv)m
-(ed.)41 b(F)-8 b(or)31 b(example,)390 4329 y Ft(bash$)46
-b(echo)h(a{d,c,b}e)390 4439 y(ade)g(ace)g(abe)275 4573
+(sorted;)150 4525 y(left)31 b(to)g(righ)m(t)g(order)f(is)g(preserv)m
+(ed.)41 b(F)-8 b(or)31 b(example,)390 4658 y Ft(bash$)46
+b(echo)h(a{d,c,b}e)390 4768 y(ade)g(ace)g(abe)275 4902
 y Fu(A)23 b(sequence)g(expression)g(tak)m(es)i(the)e(form)g
 Ft({)p Fj(x)p Ft(..)p Fj(y)p Ft([..)p Fj(incr)p Ft(]})p
 Fu(,)e(where)i Fr(x)29 b Fu(and)23 b Fr(y)30 b Fu(are)24
-b(either)g(in)m(tegers)150 4682 y(or)42 b(single)h(c)m(haracters,)48
+b(either)g(in)m(tegers)150 5011 y(or)42 b(single)h(c)m(haracters,)48
 b(and)41 b Fr(incr)p Fu(,)46 b(an)c(optional)i(incremen)m(t,)i(is)c(an)
-h(in)m(teger.)78 b(When)42 b(in)m(tegers)i(are)150 4792
+h(in)m(teger.)78 b(When)42 b(in)m(tegers)i(are)150 5121
 y(supplied,)f(the)f(expression)f(expands)f(to)i(eac)m(h)h(n)m(um)m(b)s
 (er)d(b)s(et)m(w)m(een)i Fr(x)47 b Fu(and)41 b Fr(y)p
-Fu(,)j(inclusiv)m(e.)75 b(Supplied)150 4902 y(in)m(tegers)33
+Fu(,)j(inclusiv)m(e.)75 b(Supplied)150 5230 y(in)m(tegers)33
 b(ma)m(y)e(b)s(e)g(pre\014xed)f(with)h(`)p Ft(0)p Fu(')h(to)g(force)g
 (eac)m(h)g(term)g(to)g(ha)m(v)m(e)g(the)g(same)g(width.)42
-b(When)31 b(either)150 5011 y Fr(x)43 b Fu(or)36 b Fr(y)44
+b(When)31 b(either)150 5340 y Fr(x)43 b Fu(or)36 b Fr(y)44
 b Fu(b)s(egins)36 b(with)g(a)h(zero,)i(the)e(shell)g(attempts)g(to)g
-(force)g(all)h(generated)f(terms)g(to)g(con)m(tain)h(the)150
-5121 y(same)e(n)m(um)m(b)s(er)e(of)i(digits,)i(zero-padding)d(where)h
-(necessary)-8 b(.)57 b(When)35 b(c)m(haracters)i(are)f(supplied,)g(the)
-150 5230 y(expression)24 b(expands)g(to)h(eac)m(h)h(c)m(haracter)g
-(lexicographically)h(b)s(et)m(w)m(een)e Fr(x)30 b Fu(and)24
-b Fr(y)p Fu(,)i(inclusiv)m(e,)h(using)d(the)150 5340
-y(default)32 b(C)g(lo)s(cale.)48 b(Note)34 b(that)f(b)s(oth)e
-Fr(x)39 b Fu(and)31 b Fr(y)40 b Fu(m)m(ust)32 b(b)s(e)g(of)g(the)h
-(same)f(t)m(yp)s(e.)47 b(When)32 b(the)g(incremen)m(t)p
+(force)g(all)h(generated)f(terms)g(to)g(con)m(tain)h(the)p
 eop end
 %%Page: 22 28
 TeXDict begin 22 27 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(22)150 299
-y(is)29 b(supplied,)g(it)h(is)f(used)f(as)i(the)f(di\013erence)h(b)s
-(et)m(w)m(een)g(eac)m(h)g(term.)41 b(The)29 b(default)g(incremen)m(t)h
-(is)f(1)h(or)f(-1)150 408 y(as)i(appropriate.)275 544
-y(Brace)36 b(expansion)g(is)f(p)s(erformed)f(b)s(efore)h(an)m(y)h
-(other)g(expansions,)h(and)e(an)m(y)g(c)m(haracters)i(sp)s(ecial)150
-654 y(to)32 b(other)g(expansions)g(are)g(preserv)m(ed)f(in)h(the)f
-(result.)45 b(It)32 b(is)g(strictly)g(textual.)46 b(Bash)32
-b(do)s(es)f(not)h(apply)150 764 y(an)m(y)27 b(syn)m(tactic)i(in)m
-(terpretation)g(to)f(the)f(con)m(text)i(of)e(the)g(expansion)g(or)g
-(the)h(text)g(b)s(et)m(w)m(een)f(the)h(braces.)150 873
-y(T)-8 b(o)37 b(a)m(v)m(oid)g(con\015icts)g(with)f(parameter)h
-(expansion,)g(the)g(string)f(`)p Ft(${)p Fu(')g(is)g(not)g(considered)g
-(eligible)i(for)150 983 y(brace)31 b(expansion.)275 1119
-y(A)e(correctly-formed)i(brace)f(expansion)f(m)m(ust)h(con)m(tain)h
-(unquoted)e(op)s(ening)g(and)g(closing)i(braces,)150
-1228 y(and)h(at)i(least)g(one)f(unquoted)g(comma)g(or)g(a)h(v)-5
-b(alid)33 b(sequence)g(expression.)48 b(An)m(y)33 b(incorrectly)h
-(formed)150 1338 y(brace)d(expansion)f(is)g(left)h(unc)m(hanged.)275
-1474 y(A)25 b Fi({)h Fu(or)f(`)p Ft(,)p Fu(')g(ma)m(y)h(b)s(e)f(quoted)
-h(with)f(a)g(bac)m(kslash)h(to)g(prev)m(en)m(t)g(its)g(b)s(eing)f
-(considered)g(part)g(of)h(a)g(brace)150 1583 y(expression.)51
-b(T)-8 b(o)34 b(a)m(v)m(oid)i(con\015icts)e(with)g(parameter)g
-(expansion,)h(the)f(string)g(`)p Ft(${)p Fu(')g(is)g(not)g(considered)
-150 1693 y(eligible)e(for)e(brace)h(expansion.)275 1829
-y(This)f(construct)h(is)g(t)m(ypically)i(used)d(as)h(shorthand)f(when)g
-(the)h(common)g(pre\014x)f(of)h(the)g(strings)g(to)150
-1939 y(b)s(e)f(generated)h(is)g(longer)g(than)f(in)g(the)g(ab)s(o)m(v)m
-(e)i(example:)390 2074 y Ft(mkdir)46 b(/usr/local/src/bash/{old,n)o
-(ew,)o(dist)o(,bug)o(s})275 2210 y Fu(or)390 2346 y Ft(chown)g(root)h
-(/usr/{ucb/{ex,edit},lib/)o({ex?)o(.?*,)o(how)o(_ex})o(})150
-2547 y Fk(3.5.2)63 b(Tilde)41 b(Expansion)150 2694 y
-Fu(If)29 b(a)h(w)m(ord)g(b)s(egins)f(with)g(an)h(unquoted)f(tilde)h(c)m
-(haracter)h(\(`)p Ft(~)p Fu('\),)g(all)g(of)f(the)g(c)m(haracters)h(up)
-d(to)j(the)f(\014rst)150 2804 y(unquoted)24 b(slash)g(\(or)h(all)h(c)m
-(haracters,)h(if)e(there)g(is)f(no)h(unquoted)e(slash\))i(are)g
-(considered)g(a)g Fr(tilde-pre\014x)p Fu(.)150 2913 y(If)38
-b(none)g(of)g(the)h(c)m(haracters)g(in)f(the)h(tilde-pre\014x)f(are)h
-(quoted,)h(the)f(c)m(haracters)h(in)d(the)i(tilde-pre\014x)150
-3023 y(follo)m(wing)28 b(the)g(tilde)f(are)h(treated)g(as)f(a)g(p)s
-(ossible)g Fr(login)h(name)p Fu(.)39 b(If)27 b(this)g(login)h(name)f
-(is)g(the)g(n)m(ull)g(string,)150 3132 y(the)35 b(tilde)g(is)g
-(replaced)g(with)f(the)h(v)-5 b(alue)35 b(of)g(the)g
-Ft(HOME)e Fu(shell)i(v)-5 b(ariable.)54 b(If)34 b Ft(HOME)g
-Fu(is)h(unset,)g(the)g(home)150 3242 y(directory)e(of)g(the)f(user)g
-(executing)i(the)e(shell)h(is)f(substituted)g(instead.)47
-b(Otherwise,)33 b(the)g(tilde-pre\014x)150 3352 y(is)d(replaced)h(with)
-f(the)h(home)f(directory)h(asso)s(ciated)h(with)e(the)h(sp)s(eci\014ed)
-e(login)j(name.)275 3487 y(If)g(the)h(tilde-pre\014x)f(is)h(`)p
-Ft(~+)p Fu(',)g(the)g(v)-5 b(alue)33 b(of)g(the)g(shell)g(v)-5
-b(ariable)34 b Ft(PWD)d Fu(replaces)j(the)f(tilde-pre\014x.)47
-b(If)150 3597 y(the)31 b(tilde-pre\014x)f(is)g(`)p Ft(~-)p
-Fu(',)h(the)f(v)-5 b(alue)31 b(of)g(the)f(shell)h(v)-5
-b(ariable)31 b Ft(OLDPWD)p Fu(,)e(if)h(it)h(is)g(set,)g(is)f
-(substituted.)275 3733 y(If)f(the)h(c)m(haracters)h(follo)m(wing)h(the)
-e(tilde)g(in)g(the)g(tilde-pre\014x)g(consist)g(of)g(a)h(n)m(um)m(b)s
-(er)d Fr(N)p Fu(,)j(optionally)150 3843 y(pre\014xed)22
-b(b)m(y)h(a)h(`)p Ft(+)p Fu(')f(or)h(a)f(`)p Ft(-)p Fu(',)j(the)d
-(tilde-pre\014x)g(is)h(replaced)f(with)g(the)h(corresp)s(onding)e
-(elemen)m(t)j(from)e(the)150 3952 y(directory)36 b(stac)m(k,)i(as)e(it)
-g(w)m(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m(y)g(the)f
-Ft(dirs)g Fu(builtin)g(in)m(v)m(ok)m(ed)i(with)e(the)g(c)m(haracters)
-150 4062 y(follo)m(wing)40 b(tilde)f(in)g(the)f(tilde-pre\014x)h(as)g
-(an)f(argumen)m(t)h(\(see)h(Section)f(6.8)h([The)e(Directory)i(Stac)m
-(k],)150 4171 y(page)c(90\).)57 b(If)35 b(the)g(tilde-pre\014x,)i(sans)
-e(the)h(tilde,)h(consists)f(of)g(a)f(n)m(um)m(b)s(er)f(without)i(a)f
-(leading)h(`)p Ft(+)p Fu(')g(or)150 4281 y(`)p Ft(-)p
-Fu(',)31 b(`)p Ft(+)p Fu(')f(is)h(assumed.)275 4417 y(If)e(the)i(login)
-g(name)g(is)f(in)m(v)-5 b(alid,)31 b(or)g(the)f(tilde)h(expansion)f
-(fails,)i(the)e(w)m(ord)g(is)h(left)g(unc)m(hanged.)275
-4553 y(Eac)m(h)38 b(v)-5 b(ariable)38 b(assignmen)m(t)h(is)e(c)m(hec)m
-(k)m(ed)j(for)d(unquoted)g(tilde-pre\014xes)h(immediately)g(follo)m
-(wing)150 4662 y(a)d(`)p Ft(:)p Fu(')g(or)g(the)g(\014rst)f(`)p
-Ft(=)p Fu('.)54 b(In)34 b(these)h(cases,)i(tilde)e(expansion)g(is)g
-(also)h(p)s(erformed.)52 b(Consequen)m(tly)-8 b(,)37
-b(one)150 4772 y(ma)m(y)29 b(use)e(\014lenames)h(with)g(tildes)g(in)g
-(assignmen)m(ts)g(to)h Ft(PATH)p Fu(,)f Ft(MAILPATH)p
-Fu(,)e(and)h Ft(CDPATH)p Fu(,)g(and)h(the)g(shell)150
-4882 y(assigns)j(the)f(expanded)g(v)-5 b(alue.)275 5018
-y(The)29 b(follo)m(wing)j(table)g(sho)m(ws)e(ho)m(w)g(Bash)h(treats)g
-(unquoted)e(tilde-pre\014xes:)150 5179 y Ft(~)432 b Fu(The)30
-b(v)-5 b(alue)31 b(of)f Ft($HOME)150 5340 y(~/foo)240
-b($HOME/foo)p eop end
+y(same)36 b(n)m(um)m(b)s(er)e(of)i(digits,)i(zero-padding)d(where)h
+(necessary)-8 b(.)57 b(When)35 b(c)m(haracters)i(are)f(supplied,)g(the)
+150 408 y(expression)24 b(expands)g(to)h(eac)m(h)h(c)m(haracter)g
+(lexicographically)h(b)s(et)m(w)m(een)e Fr(x)30 b Fu(and)24
+b Fr(y)p Fu(,)i(inclusiv)m(e,)h(using)d(the)150 518 y(default)32
+b(C)g(lo)s(cale.)48 b(Note)34 b(that)f(b)s(oth)e Fr(x)39
+b Fu(and)31 b Fr(y)40 b Fu(m)m(ust)32 b(b)s(e)g(of)g(the)h(same)f(t)m
+(yp)s(e.)47 b(When)32 b(the)g(incremen)m(t)150 628 y(is)d(supplied,)g
+(it)h(is)f(used)f(as)i(the)f(di\013erence)h(b)s(et)m(w)m(een)g(eac)m(h)
+g(term.)41 b(The)29 b(default)g(incremen)m(t)h(is)f(1)h(or)f(-1)150
+737 y(as)i(appropriate.)275 873 y(Brace)36 b(expansion)g(is)f(p)s
+(erformed)f(b)s(efore)h(an)m(y)h(other)g(expansions,)h(and)e(an)m(y)g
+(c)m(haracters)i(sp)s(ecial)150 982 y(to)32 b(other)g(expansions)g(are)
+g(preserv)m(ed)f(in)h(the)f(result.)45 b(It)32 b(is)g(strictly)g
+(textual.)46 b(Bash)32 b(do)s(es)f(not)h(apply)150 1092
+y(an)m(y)27 b(syn)m(tactic)i(in)m(terpretation)g(to)f(the)f(con)m(text)
+i(of)e(the)g(expansion)g(or)g(the)h(text)g(b)s(et)m(w)m(een)f(the)h
+(braces.)150 1201 y(T)-8 b(o)37 b(a)m(v)m(oid)g(con\015icts)g(with)f
+(parameter)h(expansion,)g(the)g(string)f(`)p Ft(${)p
+Fu(')g(is)g(not)g(considered)g(eligible)i(for)150 1311
+y(brace)31 b(expansion.)275 1446 y(A)e(correctly-formed)i(brace)f
+(expansion)f(m)m(ust)h(con)m(tain)h(unquoted)e(op)s(ening)g(and)g
+(closing)i(braces,)150 1556 y(and)h(at)i(least)g(one)f(unquoted)g
+(comma)g(or)g(a)h(v)-5 b(alid)33 b(sequence)g(expression.)48
+b(An)m(y)33 b(incorrectly)h(formed)150 1666 y(brace)d(expansion)f(is)g
+(left)h(unc)m(hanged.)275 1801 y(A)25 b Fi({)h Fu(or)f(`)p
+Ft(,)p Fu(')g(ma)m(y)h(b)s(e)f(quoted)h(with)f(a)g(bac)m(kslash)h(to)g
+(prev)m(en)m(t)g(its)g(b)s(eing)f(considered)g(part)g(of)h(a)g(brace)
+150 1911 y(expression.)51 b(T)-8 b(o)34 b(a)m(v)m(oid)i(con\015icts)e
+(with)g(parameter)g(expansion,)h(the)f(string)g(`)p Ft(${)p
+Fu(')g(is)g(not)g(considered)150 2020 y(eligible)e(for)e(brace)h
+(expansion.)275 2156 y(This)f(construct)h(is)g(t)m(ypically)i(used)d
+(as)h(shorthand)f(when)g(the)h(common)g(pre\014x)f(of)h(the)g(strings)g
+(to)150 2265 y(b)s(e)f(generated)h(is)g(longer)g(than)f(in)g(the)g(ab)s
+(o)m(v)m(e)i(example:)390 2401 y Ft(mkdir)46 b
+(/usr/local/src/bash/{old,n)o(ew,)o(dist)o(,bug)o(s})275
+2536 y Fu(or)390 2672 y Ft(chown)g(root)h(/usr/{ucb/{ex,edit},lib/)o
+({ex?)o(.?*,)o(how)o(_ex})o(})150 2872 y Fk(3.5.2)63
+b(Tilde)41 b(Expansion)150 3019 y Fu(If)29 b(a)h(w)m(ord)g(b)s(egins)f
+(with)g(an)h(unquoted)f(tilde)h(c)m(haracter)h(\(`)p
+Ft(~)p Fu('\),)g(all)g(of)f(the)g(c)m(haracters)h(up)d(to)j(the)f
+(\014rst)150 3128 y(unquoted)24 b(slash)g(\(or)h(all)h(c)m(haracters,)h
+(if)e(there)g(is)f(no)h(unquoted)e(slash\))i(are)g(considered)g(a)g
+Fr(tilde-pre\014x)p Fu(.)150 3238 y(If)38 b(none)g(of)g(the)h(c)m
+(haracters)g(in)f(the)h(tilde-pre\014x)f(are)h(quoted,)h(the)f(c)m
+(haracters)h(in)d(the)i(tilde-pre\014x)150 3348 y(follo)m(wing)28
+b(the)g(tilde)f(are)h(treated)g(as)f(a)g(p)s(ossible)g
+Fr(login)h(name)p Fu(.)39 b(If)27 b(this)g(login)h(name)f(is)g(the)g(n)
+m(ull)g(string,)150 3457 y(the)35 b(tilde)g(is)g(replaced)g(with)f(the)
+h(v)-5 b(alue)35 b(of)g(the)g Ft(HOME)e Fu(shell)i(v)-5
+b(ariable.)54 b(If)34 b Ft(HOME)g Fu(is)h(unset,)g(the)g(home)150
+3567 y(directory)e(of)g(the)f(user)g(executing)i(the)e(shell)h(is)f
+(substituted)g(instead.)47 b(Otherwise,)33 b(the)g(tilde-pre\014x)150
+3676 y(is)d(replaced)h(with)f(the)h(home)f(directory)h(asso)s(ciated)h
+(with)e(the)h(sp)s(eci\014ed)e(login)j(name.)275 3812
+y(If)g(the)h(tilde-pre\014x)f(is)h(`)p Ft(~+)p Fu(',)g(the)g(v)-5
+b(alue)33 b(of)g(the)g(shell)g(v)-5 b(ariable)34 b Ft(PWD)d
+Fu(replaces)j(the)f(tilde-pre\014x.)47 b(If)150 3921
+y(the)31 b(tilde-pre\014x)f(is)g(`)p Ft(~-)p Fu(',)h(the)f(v)-5
+b(alue)31 b(of)g(the)f(shell)h(v)-5 b(ariable)31 b Ft(OLDPWD)p
+Fu(,)e(if)h(it)h(is)g(set,)g(is)f(substituted.)275 4057
+y(If)f(the)h(c)m(haracters)h(follo)m(wing)h(the)e(tilde)g(in)g(the)g
+(tilde-pre\014x)g(consist)g(of)g(a)h(n)m(um)m(b)s(er)d
+Fr(N)p Fu(,)j(optionally)150 4166 y(pre\014xed)22 b(b)m(y)h(a)h(`)p
+Ft(+)p Fu(')f(or)h(a)f(`)p Ft(-)p Fu(',)j(the)d(tilde-pre\014x)g(is)h
+(replaced)f(with)g(the)h(corresp)s(onding)e(elemen)m(t)j(from)e(the)150
+4276 y(directory)36 b(stac)m(k,)i(as)e(it)g(w)m(ould)f(b)s(e)g(displa)m
+(y)m(ed)h(b)m(y)g(the)f Ft(dirs)g Fu(builtin)g(in)m(v)m(ok)m(ed)i(with)
+e(the)g(c)m(haracters)150 4386 y(follo)m(wing)40 b(tilde)f(in)g(the)f
+(tilde-pre\014x)h(as)g(an)f(argumen)m(t)h(\(see)h(Section)f(6.8)h([The)
+e(Directory)i(Stac)m(k],)150 4495 y(page)c(90\).)57 b(If)35
+b(the)g(tilde-pre\014x,)i(sans)e(the)h(tilde,)h(consists)f(of)g(a)f(n)m
+(um)m(b)s(er)f(without)i(a)f(leading)h(`)p Ft(+)p Fu(')g(or)150
+4605 y(`)p Ft(-)p Fu(',)31 b(`)p Ft(+)p Fu(')f(is)h(assumed.)275
+4740 y(If)e(the)i(login)g(name)g(is)f(in)m(v)-5 b(alid,)31
+b(or)g(the)f(tilde)h(expansion)f(fails,)i(the)e(w)m(ord)g(is)h(left)g
+(unc)m(hanged.)275 4876 y(Eac)m(h)38 b(v)-5 b(ariable)38
+b(assignmen)m(t)h(is)e(c)m(hec)m(k)m(ed)j(for)d(unquoted)g
+(tilde-pre\014xes)h(immediately)g(follo)m(wing)150 4985
+y(a)d(`)p Ft(:)p Fu(')g(or)g(the)g(\014rst)f(`)p Ft(=)p
+Fu('.)54 b(In)34 b(these)h(cases,)i(tilde)e(expansion)g(is)g(also)h(p)s
+(erformed.)52 b(Consequen)m(tly)-8 b(,)37 b(one)150 5095
+y(ma)m(y)29 b(use)e(\014lenames)h(with)g(tildes)g(in)g(assignmen)m(ts)g
+(to)h Ft(PATH)p Fu(,)f Ft(MAILPATH)p Fu(,)e(and)h Ft(CDPATH)p
+Fu(,)g(and)h(the)g(shell)150 5205 y(assigns)j(the)f(expanded)g(v)-5
+b(alue.)275 5340 y(The)29 b(follo)m(wing)j(table)g(sho)m(ws)e(ho)m(w)g
+(Bash)h(treats)g(unquoted)e(tilde-pre\014xes:)p eop end
 %%Page: 23 29
 TeXDict begin 23 28 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(23)150 299
-y Ft(~fred/foo)630 408 y Fu(The)30 b(sub)s(directory)f
-Ft(foo)h Fu(of)g(the)h(home)f(directory)h(of)g(the)f(user)g
-Ft(fred)150 572 y(~+/foo)192 b($PWD/foo)150 736 y(~-/foo)g
-(${OLDPWD-'~-'}/foo)150 899 y(~)p Fj(N)384 b Fu(The)30
-b(string)g(that)h(w)m(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m(y)f(`)p
-Ft(dirs)g(+)p Fj(N)p Fu(')150 1063 y Ft(~+)p Fj(N)336
-b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m
-(y)f(`)p Ft(dirs)g(+)p Fj(N)p Fu(')150 1227 y Ft(~-)p
-Fj(N)336 b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g(displa)m(y)m
-(ed)h(b)m(y)f(`)p Ft(dirs)g(-)p Fj(N)p Fu(')150 1430
-y Fk(3.5.3)63 b(Shell)41 b(P)m(arameter)f(Expansion)150
-1577 y Fu(The)g(`)p Ft($)p Fu(')h(c)m(haracter)i(in)m(tro)s(duces)d
-(parameter)h(expansion,)j(command)d(substitution,)i(or)e(arithmetic)150
-1687 y(expansion.)d(The)22 b(parameter)h(name)f(or)g(sym)m(b)s(ol)h(to)
-g(b)s(e)e(expanded)h(ma)m(y)h(b)s(e)f(enclosed)h(in)f(braces,)i(whic)m
-(h)150 1796 y(are)31 b(optional)g(but)f(serv)m(e)h(to)h(protect)f(the)g
-(v)-5 b(ariable)31 b(to)g(b)s(e)f(expanded)g(from)g(c)m(haracters)i
-(immediately)150 1906 y(follo)m(wing)g(it)f(whic)m(h)f(could)g(b)s(e)g
-(in)m(terpreted)h(as)f(part)h(of)f(the)h(name.)275 2045
-y(When)44 b(braces)i(are)f(used,)j(the)e(matc)m(hing)g(ending)f(brace)g
-(is)g(the)g(\014rst)g(`)p Ft(})p Fu(')g(not)g(escap)s(ed)h(b)m(y)f(a)
-150 2154 y(bac)m(kslash)40 b(or)f(within)g(a)g(quoted)g(string,)j(and)c
-(not)i(within)e(an)h(em)m(b)s(edded)f(arithmetic)j(expansion,)150
-2264 y(command)30 b(substitution,)g(or)h(parameter)g(expansion.)275
-2403 y(The)40 b(basic)i(form)f(of)g(parameter)h(expansion)f(is)h($)p
+y Ft(~)432 b Fu(The)30 b(v)-5 b(alue)31 b(of)f Ft($HOME)150
+474 y(~/foo)240 b($HOME/foo)150 649 y(~fred/foo)630 759
+y Fu(The)30 b(sub)s(directory)f Ft(foo)h Fu(of)g(the)h(home)f
+(directory)h(of)g(the)f(user)g Ft(fred)150 934 y(~+/foo)192
+b($PWD/foo)150 1109 y(~-/foo)g(${OLDPWD-'~-'}/foo)150
+1284 y(~)p Fj(N)384 b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)g
+(displa)m(y)m(ed)h(b)m(y)f(`)p Ft(dirs)g(+)p Fj(N)p Fu(')150
+1459 y Ft(~+)p Fj(N)336 b Fu(The)30 b(string)g(that)h(w)m(ould)f(b)s(e)
+g(displa)m(y)m(ed)h(b)m(y)f(`)p Ft(dirs)g(+)p Fj(N)p
+Fu(')150 1634 y Ft(~-)p Fj(N)336 b Fu(The)30 b(string)g(that)h(w)m
+(ould)f(b)s(e)g(displa)m(y)m(ed)h(b)m(y)f(`)p Ft(dirs)g(-)p
+Fj(N)p Fu(')150 1849 y Fk(3.5.3)63 b(Shell)41 b(P)m(arameter)f
+(Expansion)150 1996 y Fu(The)g(`)p Ft($)p Fu(')h(c)m(haracter)i(in)m
+(tro)s(duces)d(parameter)h(expansion,)j(command)d(substitution,)i(or)e
+(arithmetic)150 2105 y(expansion.)d(The)22 b(parameter)h(name)f(or)g
+(sym)m(b)s(ol)h(to)g(b)s(e)e(expanded)h(ma)m(y)h(b)s(e)f(enclosed)h(in)
+f(braces,)i(whic)m(h)150 2215 y(are)31 b(optional)g(but)f(serv)m(e)h
+(to)h(protect)f(the)g(v)-5 b(ariable)31 b(to)g(b)s(e)f(expanded)g(from)
+g(c)m(haracters)i(immediately)150 2324 y(follo)m(wing)g(it)f(whic)m(h)f
+(could)g(b)s(e)g(in)m(terpreted)h(as)f(part)h(of)f(the)h(name.)275
+2474 y(When)44 b(braces)i(are)f(used,)j(the)e(matc)m(hing)g(ending)f
+(brace)g(is)g(the)g(\014rst)g(`)p Ft(})p Fu(')g(not)g(escap)s(ed)h(b)m
+(y)f(a)150 2584 y(bac)m(kslash)40 b(or)f(within)g(a)g(quoted)g(string,)
+j(and)c(not)i(within)e(an)h(em)m(b)s(edded)f(arithmetic)j(expansion,)
+150 2694 y(command)30 b(substitution,)g(or)h(parameter)g(expansion.)275
+2844 y(The)40 b(basic)i(form)f(of)g(parameter)h(expansion)f(is)h($)p
 Fi({)p Fr(parameter)7 b Fi(})p Fu(.)74 b(The)41 b(v)-5
-b(alue)42 b(of)g Fr(parameter)48 b Fu(is)150 2512 y(substituted.)43
+b(alue)42 b(of)g Fr(parameter)48 b Fu(is)150 2953 y(substituted.)43
 b(The)31 b Fr(parameter)39 b Fu(is)31 b(a)h(shell)f(parameter)h(as)g
 (describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)f(Section)g(3.4)h([Shell)150
-2622 y(P)m(arameters],)e(page)f(18\))h(or)e(an)g(arra)m(y)h(reference)f
+3063 y(P)m(arameters],)e(page)f(18\))h(or)e(an)g(arra)m(y)h(reference)f
 (\(see)i(Section)f(6.7)g([Arra)m(ys],)g(page)g(89\).)42
-b(The)29 b(braces)150 2731 y(are)j(required)g(when)f
+b(The)29 b(braces)150 3172 y(are)j(required)g(when)f
 Fr(parameter)39 b Fu(is)32 b(a)h(p)s(ositional)f(parameter)h(with)f
-(more)g(than)g(one)g(digit,)i(or)e(when)150 2841 y Fr(parameter)37
+(more)g(than)g(one)g(digit,)i(or)e(when)150 3282 y Fr(parameter)37
 b Fu(is)31 b(follo)m(w)m(ed)h(b)m(y)e(a)h(c)m(haracter)h(that)f(is)f
 (not)h(to)g(b)s(e)f(in)m(terpreted)g(as)h(part)f(of)h(its)f(name.)275
-2980 y(If)36 b(the)h(\014rst)f(c)m(haracter)i(of)f Fr(parameter)44
+3432 y(If)36 b(the)h(\014rst)f(c)m(haracter)i(of)f Fr(parameter)44
 b Fu(is)37 b(an)f(exclamation)j(p)s(oin)m(t)e(\(!\),)i(it)f(in)m(tro)s
-(duces)e(a)h(lev)m(el)i(of)150 3089 y(v)-5 b(ariable)30
+(duces)e(a)h(lev)m(el)i(of)150 3542 y(v)-5 b(ariable)30
 b(indirection.)41 b(Bash)30 b(uses)f(the)g(v)-5 b(alue)30
 b(of)g(the)f(v)-5 b(ariable)30 b(formed)f(from)g(the)h(rest)f(of)h
-Fr(parameter)150 3199 y Fu(as)c(the)g(name)g(of)g(the)h(v)-5
+Fr(parameter)150 3651 y Fu(as)c(the)g(name)g(of)g(the)h(v)-5
 b(ariable;)28 b(this)e(v)-5 b(ariable)27 b(is)f(then)f(expanded)g(and)h
 (that)g(v)-5 b(alue)27 b(is)f(used)f(in)h(the)g(rest)150
-3308 y(of)34 b(the)f(substitution,)i(rather)e(than)g(the)h(v)-5
+3761 y(of)34 b(the)f(substitution,)i(rather)e(than)g(the)h(v)-5
 b(alue)34 b(of)g Fr(parameter)40 b Fu(itself.)51 b(This)33
-b(is)g(kno)m(wn)g(as)h Ft(indirect)150 3418 y(expansion)p
+b(is)g(kno)m(wn)g(as)h Ft(indirect)150 3871 y(expansion)p
 Fu(.)78 b(The)43 b(exceptions)i(to)f(this)f(are)h(the)g(expansions)g
 (of)f($)p Fi({)p Fu(!)p Fr(pre\014x)6 b Fu(*)p Fi(})45
 b Fu(and)e($)p Fi({)p Fu(!)p Fr(name)5 b Fu([@])p Fi(})150
-3528 y Fu(describ)s(ed)28 b(b)s(elo)m(w.)41 b(The)28
+3980 y Fu(describ)s(ed)28 b(b)s(elo)m(w.)41 b(The)28
 b(exclamation)j(p)s(oin)m(t)f(m)m(ust)f(immediately)h(follo)m(w)g(the)g
-(left)f(brace)h(in)f(order)f(to)150 3637 y(in)m(tro)s(duce)i
-(indirection.)275 3776 y(In)39 b(eac)m(h)i(of)g(the)f(cases)h(b)s(elo)m
+(left)f(brace)h(in)f(order)f(to)150 4090 y(in)m(tro)s(duce)i
+(indirection.)275 4240 y(In)39 b(eac)m(h)i(of)g(the)f(cases)h(b)s(elo)m
 (w,)i Fr(w)m(ord)h Fu(is)c(sub)5 b(ject)40 b(to)h(tilde)f(expansion,)j
-(parameter)e(expansion,)150 3886 y(command)30 b(substitution,)g(and)g
-(arithmetic)i(expansion.)275 4024 y(When)h(not)h(p)s(erforming)e
+(parameter)e(expansion,)150 4349 y(command)30 b(substitution,)g(and)g
+(arithmetic)i(expansion.)275 4500 y(When)h(not)h(p)s(erforming)e
 (substring)h(expansion,)h(using)g(the)f(form)h(describ)s(ed)e(b)s(elo)m
-(w)i(\(e.g.,)i(`)p Ft(:-)p Fu('\),)150 4134 y(Bash)d(tests)h(for)e(a)i
+(w)i(\(e.g.,)i(`)p Ft(:-)p Fu('\),)150 4609 y(Bash)d(tests)h(for)e(a)i
 (parameter)f(that)h(is)e(unset)h(or)g(n)m(ull.)48 b(Omitting)33
-b(the)h(colon)f(results)g(in)g(a)g(test)h(only)150 4243
+b(the)h(colon)f(results)g(in)g(a)g(test)h(only)150 4719
 y(for)c(a)i(parameter)f(that)g(is)g(unset.)41 b(Put)31
 b(another)f(w)m(a)m(y)-8 b(,)33 b(if)e(the)f(colon)i(is)f(included,)f
-(the)h(op)s(erator)g(tests)150 4353 y(for)36 b(b)s(oth)g
+(the)h(op)s(erator)g(tests)150 4828 y(for)36 b(b)s(oth)g
 Fr(parameter)7 b Fu('s)37 b(existence)h(and)e(that)i(its)f(v)-5
 b(alue)37 b(is)g(not)f(n)m(ull;)k(if)d(the)g(colon)h(is)e(omitted,)k
-(the)150 4463 y(op)s(erator)31 b(tests)g(only)f(for)g(existence.)150
-4628 y Ft(${)p Fj(parameter)p Ft(:)p Fq(\000)p Fj(word)p
-Ft(})630 4738 y Fu(If)g Fr(parameter)37 b Fu(is)30 b(unset)g(or)h(n)m
+(the)150 4938 y(op)s(erator)31 b(tests)g(only)f(for)g(existence.)150
+5121 y Ft(${)p Fj(parameter)p Ft(:)p Fq(\000)p Fj(word)p
+Ft(})630 5230 y Fu(If)g Fr(parameter)37 b Fu(is)30 b(unset)g(or)h(n)m
 (ull,)f(the)h(expansion)f(of)g Fr(w)m(ord)k Fu(is)c(substituted.)40
-b(Otherwise,)630 4848 y(the)31 b(v)-5 b(alue)30 b(of)h
-Fr(parameter)37 b Fu(is)31 b(substituted.)150 5011 y
-Ft(${)p Fj(parameter)p Ft(:=)p Fj(word)p Ft(})630 5121
-y Fu(If)i Fr(parameter)40 b Fu(is)33 b(unset)f(or)h(n)m(ull,)h(the)f
-(expansion)g(of)g Fr(w)m(ord)j Fu(is)d(assigned)g(to)h
-Fr(parameter)p Fu(.)630 5230 y(The)c(v)-5 b(alue)32 b(of)f
-Fr(parameter)38 b Fu(is)31 b(then)g(substituted.)42 b(P)m(ositional)33
-b(parameters)e(and)f(sp)s(ecial)630 5340 y(parameters)h(ma)m(y)g(not)f
-(b)s(e)g(assigned)h(to)g(in)f(this)g(w)m(a)m(y)-8 b(.)p
-eop end
+b(Otherwise,)630 5340 y(the)31 b(v)-5 b(alue)30 b(of)h
+Fr(parameter)37 b Fu(is)31 b(substituted.)p eop end
 %%Page: 24 30
 TeXDict begin 24 29 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(24)150 299
-y Ft(${)p Fj(parameter)p Ft(:?)p Fj(word)p Ft(})630 408
-y Fu(If)26 b Fr(parameter)33 b Fu(is)26 b(n)m(ull)g(or)g(unset,)h(the)f
-(expansion)g(of)g Fr(w)m(ord)k Fu(\(or)c(a)h(message)g(to)g(that)f
-(e\013ect)630 518 y(if)i Fr(w)m(ord)j Fu(is)d(not)g(presen)m(t\))h(is)f
-(written)g(to)h(the)f(standard)f(error)h(and)f(the)h(shell,)h(if)f(it)h
-(is)f(not)630 628 y(in)m(teractiv)m(e,)33 b(exits.)42
+y Ft(${)p Fj(parameter)p Ft(:=)p Fj(word)p Ft(})630 408
+y Fu(If)33 b Fr(parameter)40 b Fu(is)33 b(unset)f(or)h(n)m(ull,)h(the)f
+(expansion)g(of)g Fr(w)m(ord)j Fu(is)d(assigned)g(to)h
+Fr(parameter)p Fu(.)630 518 y(The)c(v)-5 b(alue)32 b(of)f
+Fr(parameter)38 b Fu(is)31 b(then)g(substituted.)42 b(P)m(ositional)33
+b(parameters)e(and)f(sp)s(ecial)630 628 y(parameters)h(ma)m(y)g(not)f
+(b)s(e)g(assigned)h(to)g(in)f(this)g(w)m(a)m(y)-8 b(.)150
+786 y Ft(${)p Fj(parameter)p Ft(:?)p Fj(word)p Ft(})630
+896 y Fu(If)26 b Fr(parameter)33 b Fu(is)26 b(n)m(ull)g(or)g(unset,)h
+(the)f(expansion)g(of)g Fr(w)m(ord)k Fu(\(or)c(a)h(message)g(to)g(that)
+f(e\013ect)630 1005 y(if)i Fr(w)m(ord)j Fu(is)d(not)g(presen)m(t\))h
+(is)f(written)g(to)h(the)f(standard)f(error)h(and)f(the)h(shell,)h(if)f
+(it)h(is)f(not)630 1115 y(in)m(teractiv)m(e,)33 b(exits.)42
 b(Otherwise,)30 b(the)h(v)-5 b(alue)31 b(of)f Fr(parameter)38
-b Fu(is)30 b(substituted.)150 800 y Ft(${)p Fj(parameter)p
-Ft(:+)p Fj(word)p Ft(})630 909 y Fu(If)35 b Fr(parameter)42
+b Fu(is)30 b(substituted.)150 1273 y Ft(${)p Fj(parameter)p
+Ft(:+)p Fj(word)p Ft(})630 1383 y Fu(If)35 b Fr(parameter)42
 b Fu(is)36 b(n)m(ull)f(or)h(unset,)g(nothing)g(is)f(substituted,)i
-(otherwise)e(the)h(expansion)630 1019 y(of)31 b Fr(w)m(ord)i
-Fu(is)e(substituted.)150 1191 y Ft(${)p Fj(parameter)p
-Ft(:)p Fj(offset)p Ft(})150 1301 y(${)p Fj(parameter)p
-Ft(:)p Fj(offset)p Ft(:)p Fj(lengt)o(h)p Ft(})630 1410
+(otherwise)e(the)h(expansion)630 1492 y(of)31 b Fr(w)m(ord)i
+Fu(is)e(substituted.)150 1650 y Ft(${)p Fj(parameter)p
+Ft(:)p Fj(offset)p Ft(})150 1760 y(${)p Fj(parameter)p
+Ft(:)p Fj(offset)p Ft(:)p Fj(lengt)o(h)p Ft(})630 1870
 y Fu(This)f(is)h(referred)f(to)h(as)g(Substring)f(Expansion.)41
 b(It)31 b(expands)f(to)h(up)f(to)h Fr(length)g Fu(c)m(harac-)630
-1520 y(ters)k(of)g(the)h(v)-5 b(alue)35 b(of)g Fr(parameter)42
+1979 y(ters)k(of)g(the)h(v)-5 b(alue)35 b(of)g Fr(parameter)42
 b Fu(starting)36 b(at)g(the)f(c)m(haracter)i(sp)s(eci\014ed)d(b)m(y)h
-Fr(o\013set)p Fu(.)55 b(If)630 1630 y Fr(parameter)32
+Fr(o\013set)p Fu(.)55 b(If)630 2089 y Fr(parameter)32
 b Fu(is)26 b(`)p Ft(@)p Fu(',)g(an)f(indexed)g(arra)m(y)h(subscripted)e
 (b)m(y)h(`)p Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)g(or)g(an)f(asso)s
-(ciativ)m(e)j(ar-)630 1739 y(ra)m(y)g(name,)h(the)f(results)g(di\013er)
+(ciativ)m(e)j(ar-)630 2198 y(ra)m(y)g(name,)h(the)f(results)g(di\013er)
 g(as)g(describ)s(ed)f(b)s(elo)m(w.)40 b(If)28 b Fr(length)g
-Fu(is)g(omitted,)i(it)f(expands)630 1849 y(to)e(the)g(substring)f(of)g
+Fu(is)g(omitted,)i(it)f(expands)630 2308 y(to)e(the)g(substring)f(of)g
 (the)h(v)-5 b(alue)27 b(of)g Fr(parameter)33 b Fu(starting)28
 b(at)f(the)g(c)m(haracter)h(sp)s(eci\014ed)e(b)m(y)630
-1958 y Fr(o\013set)37 b Fu(and)d(extending)g(to)h(the)f(end)g(of)g(the)
+2418 y Fr(o\013set)37 b Fu(and)d(extending)g(to)h(the)f(end)g(of)g(the)
 g(v)-5 b(alue.)53 b Fr(length)34 b Fu(and)g Fr(o\013set)j
-Fu(are)e(arithmetic)630 2068 y(expressions)30 b(\(see)h(Section)g(6.5)h
-([Shell)e(Arithmetic],)i(page)f(87\).)630 2209 y(If)39
+Fu(are)e(arithmetic)630 2527 y(expressions)30 b(\(see)h(Section)g(6.5)h
+([Shell)e(Arithmetic],)i(page)f(87\).)630 2661 y(If)39
 b Fr(o\013set)k Fu(ev)-5 b(aluates)41 b(to)f(a)g(n)m(um)m(b)s(er)f
 (less)h(than)f(zero,)k(the)d(v)-5 b(alue)40 b(is)g(used)e(as)i(an)g
-(o\013set)630 2318 y(in)33 b(c)m(haracters)i(from)f(the)f(end)g(of)h
+(o\013set)630 2771 y(in)33 b(c)m(haracters)i(from)f(the)f(end)g(of)h
 (the)g(v)-5 b(alue)34 b(of)g Fr(parameter)p Fu(.)51 b(If)33
-b Fr(length)h Fu(ev)-5 b(aluates)35 b(to)g(a)630 2428
+b Fr(length)h Fu(ev)-5 b(aluates)35 b(to)g(a)630 2880
 y(n)m(um)m(b)s(er)23 b(less)h(than)g(zero,)j(it)d(is)h(in)m(terpreted)f
 (as)g(an)h(o\013set)g(in)f(c)m(haracters)h(from)f(the)g(end)g(of)630
-2538 y(the)31 b(v)-5 b(alue)31 b(of)g Fr(parameter)38
+2990 y(the)31 b(v)-5 b(alue)31 b(of)g Fr(parameter)38
 b Fu(rather)30 b(than)h(a)g(n)m(um)m(b)s(er)f(of)g(c)m(haracters,)j
-(and)d(the)h(expansion)630 2647 y(is)39 b(the)g(c)m(haracters)i(b)s(et)
+(and)d(the)h(expansion)630 3099 y(is)39 b(the)g(c)m(haracters)i(b)s(et)
 m(w)m(een)f Fr(o\013set)i Fu(and)c(that)i(result.)67
-b(Note)40 b(that)g(a)g(negativ)m(e)h(o\013set)630 2757
+b(Note)40 b(that)g(a)g(negativ)m(e)h(o\013set)630 3209
 y(m)m(ust)27 b(b)s(e)g(separated)g(from)g(the)g(colon)i(b)m(y)e(at)h
 (least)g(one)f(space)h(to)g(a)m(v)m(oid)h(b)s(eing)e(confused)630
-2866 y(with)j(the)h(`)p Ft(:-)p Fu(')f(expansion.)630
-3007 y(Here)43 b(are)g(some)f(examples)h(illustrating)g(substring)f
-(expansion)g(on)g(parameters)h(and)630 3117 y(subscripted)29
-b(arra)m(ys:)630 3258 y Ft($)47 b(string=01234567890abcdefgh)630
-3367 y($)g(echo)g(${string:7})630 3477 y(7890abcdefgh)630
-3587 y($)g(echo)g(${string:7:0})630 3806 y($)g(echo)g(${string:7:2})630
-3915 y(78)630 4025 y($)g(echo)g(${string:7:-2})630 4134
-y(7890abcdef)630 4244 y($)g(echo)g(${string:)e(-7})630
-4354 y(bcdefgh)630 4463 y($)i(echo)g(${string:)e(-7:0})630
-4682 y($)i(echo)g(${string:)e(-7:2})630 4792 y(bc)630
-4902 y($)i(echo)g(${string:)e(-7:-2})630 5011 y(bcdef)630
-5121 y($)i(set)g(--)h(01234567890abcdefgh)630 5230 y($)f(echo)g(${1:7})
-630 5340 y(7890abcdefgh)p eop end
+3319 y(with)j(the)h(`)p Ft(:-)p Fu(')f(expansion.)630
+3453 y(Here)43 b(are)g(some)f(examples)h(illustrating)g(substring)f
+(expansion)g(on)g(parameters)h(and)630 3562 y(subscripted)29
+b(arra)m(ys:)630 3696 y Ft($)47 b(string=01234567890abcdefgh)630
+3806 y($)g(echo)g(${string:7})630 3915 y(7890abcdefgh)630
+4025 y($)g(echo)g(${string:7:0})630 4244 y($)g(echo)g(${string:7:2})630
+4354 y(78)630 4463 y($)g(echo)g(${string:7:-2})630 4573
+y(7890abcdef)630 4682 y($)g(echo)g(${string:)e(-7})630
+4792 y(bcdefgh)630 4902 y($)i(echo)g(${string:)e(-7:0})630
+5121 y($)i(echo)g(${string:)e(-7:2})630 5230 y(bc)630
+5340 y($)i(echo)g(${string:)e(-7:-2})p eop end
 %%Page: 25 31
 TeXDict begin 25 30 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(25)630 299
-y Ft($)47 b(echo)g(${1:7:0})630 518 y($)g(echo)g(${1:7:2})630
-628 y(78)630 737 y($)g(echo)g(${1:7:-2})630 847 y(7890abcdef)630
-956 y($)g(echo)g(${1:)g(-7})630 1066 y(bcdefgh)630 1176
-y($)g(echo)g(${1:)g(-7:0})630 1395 y($)g(echo)g(${1:)g(-7:2})630
-1504 y(bc)630 1614 y($)g(echo)g(${1:)g(-7:-2})630 1724
-y(bcdef)630 1833 y($)g(array[0]=01234567890abcdef)o(gh)630
-1943 y($)g(echo)g(${array[0]:7})630 2052 y(7890abcdefgh)630
-2162 y($)g(echo)g(${array[0]:7:0})630 2381 y($)g(echo)g
-(${array[0]:7:2})630 2491 y(78)630 2600 y($)g(echo)g(${array[0]:7:-2})
-630 2710 y(7890abcdef)630 2819 y($)g(echo)g(${array[0]:)e(-7})630
-2929 y(bcdefgh)630 3039 y($)i(echo)g(${array[0]:)e(-7:0})630
-3258 y($)i(echo)g(${array[0]:)e(-7:2})630 3367 y(bc)630
-3477 y($)i(echo)g(${array[0]:)e(-7:-2})630 3587 y(bcdef)630
-3733 y Fu(If)22 b Fr(parameter)30 b Fu(is)23 b(`)p Ft(@)p
+y Ft(bcdef)630 408 y($)47 b(set)g(--)h(01234567890abcdefgh)630
+518 y($)f(echo)g(${1:7})630 628 y(7890abcdefgh)630 737
+y($)g(echo)g(${1:7:0})630 956 y($)g(echo)g(${1:7:2})630
+1066 y(78)630 1176 y($)g(echo)g(${1:7:-2})630 1285 y(7890abcdef)630
+1395 y($)g(echo)g(${1:)g(-7})630 1504 y(bcdefgh)630 1614
+y($)g(echo)g(${1:)g(-7:0})630 1833 y($)g(echo)g(${1:)g(-7:2})630
+1943 y(bc)630 2052 y($)g(echo)g(${1:)g(-7:-2})630 2162
+y(bcdef)630 2271 y($)g(array[0]=01234567890abcdef)o(gh)630
+2381 y($)g(echo)g(${array[0]:7})630 2491 y(7890abcdefgh)630
+2600 y($)g(echo)g(${array[0]:7:0})630 2819 y($)g(echo)g
+(${array[0]:7:2})630 2929 y(78)630 3039 y($)g(echo)g(${array[0]:7:-2})
+630 3148 y(7890abcdef)630 3258 y($)g(echo)g(${array[0]:)e(-7})630
+3367 y(bcdefgh)630 3477 y($)i(echo)g(${array[0]:)e(-7:0})630
+3696 y($)i(echo)g(${array[0]:)e(-7:2})630 3806 y(bc)630
+3915 y($)i(echo)g(${array[0]:)e(-7:-2})630 4025 y(bcdef)630
+4171 y Fu(If)22 b Fr(parameter)30 b Fu(is)23 b(`)p Ft(@)p
 Fu(',)i(the)e(result)g(is)g Fr(length)h Fu(p)s(ositional)f(parameters)h
-(b)s(eginning)e(at)i Fr(o\013set)p Fu(.)630 3842 y(A)36
+(b)s(eginning)e(at)i Fr(o\013set)p Fu(.)630 4281 y(A)36
 b(negativ)m(e)j Fr(o\013set)g Fu(is)e(tak)m(en)g(relativ)m(e)i(to)e
 (one)g(greater)g(than)f(the)h(greatest)h(p)s(ositional)630
-3952 y(parameter,)29 b(so)f(an)g(o\013set)h(of)f(-1)g(ev)-5
+4390 y(parameter,)29 b(so)f(an)g(o\013set)h(of)f(-1)g(ev)-5
 b(aluates)30 b(to)e(the)g(last)h(p)s(ositional)g(parameter.)40
-b(It)28 b(is)g(an)630 4061 y(expansion)i(error)g(if)h
+b(It)28 b(is)g(an)630 4500 y(expansion)i(error)g(if)h
 Fr(length)f Fu(ev)-5 b(aluates)32 b(to)f(a)g(n)m(um)m(b)s(er)e(less)i
-(than)f(zero.)630 4208 y(The)i(follo)m(wing)i(examples)f(illustrate)h
+(than)f(zero.)630 4646 y(The)i(follo)m(wing)i(examples)f(illustrate)h
 (substring)d(expansion)i(using)f(p)s(ositional)h(param-)630
-4317 y(eters:)630 4463 y Ft($)47 b(set)g(--)h(1)f(2)g(3)h(4)f(5)h(6)f
-(7)h(8)f(9)h(0)f(a)h(b)f(c)g(d)h(e)f(f)h(g)f(h)630 4573
-y($)g(echo)g(${@:7})630 4682 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h(e)f(f)h
-(g)f(h)630 4792 y($)g(echo)g(${@:7:0})630 5011 y($)g(echo)g(${@:7:2})
-630 5121 y(7)g(8)630 5230 y($)g(echo)g(${@:7:-2})630
-5340 y(bash:)f(-2:)h(substring)f(expression)f(<)i(0)p
-eop end
+4755 y(eters:)630 4902 y Ft($)47 b(set)g(--)h(1)f(2)g(3)h(4)f(5)h(6)f
+(7)h(8)f(9)h(0)f(a)h(b)f(c)g(d)h(e)f(f)h(g)f(h)630 5011
+y($)g(echo)g(${@:7})630 5121 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h(e)f(f)h
+(g)f(h)630 5230 y($)g(echo)g(${@:7:0})p eop end
 %%Page: 26 32
 TeXDict begin 26 31 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(26)630 299
-y Ft($)47 b(echo)g(${@:)g(-7:2})630 408 y(b)g(c)630 518
-y($)g(echo)g(${@:0})630 628 y(./bash)f(1)i(2)f(3)g(4)h(5)f(6)h(7)f(8)h
-(9)f(0)h(a)f(b)h(c)f(d)g(e)h(f)f(g)h(h)630 737 y($)f(echo)g(${@:0:2})
-630 847 y(./bash)f(1)630 956 y($)h(echo)g(${@:)g(-7:0})630
-1200 y Fu(If)36 b Fr(parameter)43 b Fu(is)36 b(an)g(indexed)g(arra)m(y)
+y Ft($)47 b(echo)g(${@:7:2})630 408 y(7)g(8)630 518 y($)g(echo)g
+(${@:7:-2})630 628 y(bash:)f(-2:)h(substring)f(expression)f(<)i(0)630
+737 y($)g(echo)g(${@:)g(-7:2})630 847 y(b)g(c)630 956
+y($)g(echo)g(${@:0})630 1066 y(./bash)f(1)i(2)f(3)g(4)h(5)f(6)h(7)f(8)h
+(9)f(0)h(a)f(b)h(c)f(d)g(e)h(f)f(g)h(h)630 1176 y($)f(echo)g(${@:0:2})
+630 1285 y(./bash)f(1)630 1395 y($)h(echo)g(${@:)g(-7:0})630
+1677 y Fu(If)36 b Fr(parameter)43 b Fu(is)36 b(an)g(indexed)g(arra)m(y)
 g(name)g(subscripted)f(b)m(y)h(`)p Ft(@)p Fu(')g(or)h(`)p
-Ft(*)p Fu(',)h(the)e(result)g(is)630 1310 y(the)j Fr(length)g
+Ft(*)p Fu(',)h(the)e(result)g(is)630 1786 y(the)j Fr(length)g
 Fu(mem)m(b)s(ers)f(of)h(the)f(arra)m(y)i(b)s(eginning)d(with)i
 Ft(${)p Fj(parameter)p Ft([)p Fj(offset)p Ft(]})p Fu(.)60
-b(A)630 1419 y(negativ)m(e)33 b Fr(o\013set)g Fu(is)e(tak)m(en)h
+b(A)630 1896 y(negativ)m(e)33 b Fr(o\013set)g Fu(is)e(tak)m(en)h
 (relativ)m(e)g(to)g(one)f(greater)g(than)g(the)f(maxim)m(um)h(index)f
-(of)h(the)630 1529 y(sp)s(eci\014ed)38 b(arra)m(y)-8
+(of)h(the)630 2005 y(sp)s(eci\014ed)38 b(arra)m(y)-8
 b(.)65 b(It)38 b(is)g(an)h(expansion)f(error)f(if)i Fr(length)f
 Fu(ev)-5 b(aluates)40 b(to)f(a)g(n)m(um)m(b)s(er)e(less)630
-1638 y(than)30 b(zero.)630 1772 y(These)23 b(examples)i(sho)m(w)e(ho)m
+2115 y(than)30 b(zero.)630 2287 y(These)23 b(examples)i(sho)m(w)e(ho)m
 (w)h(y)m(ou)g(can)g(use)f(substring)f(expansion)i(with)f(indexed)g
-(arra)m(ys:)630 1906 y Ft($)47 b(array=\(0)f(1)h(2)h(3)f(4)h(5)f(6)h(7)
-f(8)h(9)f(0)h(a)f(b)g(c)h(d)f(e)h(f)f(g)h(h\))630 2016
-y($)f(echo)g(${array[@]:7})630 2125 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h
-(e)f(f)h(g)f(h)630 2235 y($)g(echo)g(${array[@]:7:2})630
-2345 y(7)g(8)630 2454 y($)g(echo)g(${array[@]:)e(-7:2})630
-2564 y(b)i(c)630 2673 y($)g(echo)g(${array[@]:)e(-7:-2})630
-2783 y(bash:)h(-2:)h(substring)f(expression)f(<)i(0)630
-2892 y($)g(echo)g(${array[@]:0})630 3002 y(0)g(1)h(2)f(3)h(4)f(5)h(6)f
-(7)h(8)f(9)h(0)f(a)g(b)h(c)f(d)h(e)f(f)h(g)f(h)630 3112
-y($)g(echo)g(${array[@]:0:2})630 3221 y(0)g(1)630 3331
-y($)g(echo)g(${array[@]:)e(-7:0})630 3574 y Fu(Substring)25
+(arra)m(ys:)630 2459 y Ft($)47 b(array=\(0)f(1)h(2)h(3)f(4)h(5)f(6)h(7)
+f(8)h(9)f(0)h(a)f(b)g(c)h(d)f(e)h(f)f(g)h(h\))630 2569
+y($)f(echo)g(${array[@]:7})630 2679 y(7)g(8)h(9)f(0)h(a)f(b)h(c)f(d)h
+(e)f(f)h(g)f(h)630 2788 y($)g(echo)g(${array[@]:7:2})630
+2898 y(7)g(8)630 3007 y($)g(echo)g(${array[@]:)e(-7:2})630
+3117 y(b)i(c)630 3226 y($)g(echo)g(${array[@]:)e(-7:-2})630
+3336 y(bash:)h(-2:)h(substring)f(expression)f(<)i(0)630
+3446 y($)g(echo)g(${array[@]:0})630 3555 y(0)g(1)h(2)f(3)h(4)f(5)h(6)f
+(7)h(8)f(9)h(0)f(a)g(b)h(c)f(d)h(e)f(f)h(g)f(h)630 3665
+y($)g(echo)g(${array[@]:0:2})630 3774 y(0)g(1)630 3884
+y($)g(echo)g(${array[@]:)e(-7:0})630 4166 y Fu(Substring)25
 b(expansion)g(applied)h(to)h(an)f(asso)s(ciativ)m(e)j(arra)m(y)d(pro)s
-(duces)f(unde\014ned)f(results.)630 3708 y(Substring)32
+(duces)f(unde\014ned)f(results.)630 4338 y(Substring)32
 b(indexing)i(is)f(zero-based)i(unless)e(the)h(p)s(ositional)g
-(parameters)g(are)g(used,)g(in)630 3818 y(whic)m(h)29
+(parameters)g(are)g(used,)g(in)630 4448 y(whic)m(h)29
 b(case)i(the)f(indexing)g(starts)g(at)g(1)g(b)m(y)g(default.)41
 b(If)29 b Fr(o\013set)k Fu(is)d(0,)g(and)f(the)h(p)s(ositional)630
-3927 y(parameters)h(are)f(used,)g Ft($@)g Fu(is)g(pre\014xed)g(to)h
-(the)f(list.)150 4086 y Ft(${!)p Fj(prefix)p Ft(*})150
-4195 y(${!)p Fj(prefix)p Ft(@})630 4305 y Fu(Expands)24
+4557 y(parameters)h(are)f(used,)g Ft($@)g Fu(is)g(pre\014xed)g(to)h
+(the)f(list.)150 4792 y Ft(${!)p Fj(prefix)p Ft(*})150
+4902 y(${!)p Fj(prefix)p Ft(@})630 5011 y Fu(Expands)24
 b(to)h(the)g(names)g(of)g(v)-5 b(ariables)26 b(whose)f(names)f(b)s
 (egin)h(with)f Fr(pre\014x)p Fu(,)i(separated)f(b)m(y)630
-4415 y(the)k(\014rst)f(c)m(haracter)j(of)e(the)g Ft(IFS)f
+5121 y(the)k(\014rst)f(c)m(haracter)j(of)e(the)g Ft(IFS)f
 Fu(sp)s(ecial)i(v)-5 b(ariable.)41 b(When)29 b(`)p Ft(@)p
-Fu(')g(is)g(used)f(and)h(the)g(expan-)630 4524 y(sion)35
+Fu(')g(is)g(used)f(and)h(the)g(expan-)630 5230 y(sion)35
 b(app)s(ears)g(within)f(double)h(quotes,)i(eac)m(h)f(v)-5
 b(ariable)36 b(name)f(expands)g(to)g(a)h(separate)630
-4634 y(w)m(ord.)150 4792 y Ft(${!)p Fj(name)p Ft([@]})150
-4902 y(${!)p Fj(name)p Ft([*]})630 5011 y Fu(If)26 b
-Fr(name)32 b Fu(is)27 b(an)f(arra)m(y)h(v)-5 b(ariable,)29
-b(expands)d(to)h(the)g(list)g(of)g(arra)m(y)g(indices)g(\(k)m(eys\))h
-(assigned)630 5121 y(in)c Fr(name)p Fu(.)39 b(If)24 b
-Fr(name)30 b Fu(is)24 b(not)h(an)f(arra)m(y)-8 b(,)27
-b(expands)c(to)j(0)f(if)f Fr(name)30 b Fu(is)24 b(set)h(and)f(n)m(ull)g
-(otherwise.)630 5230 y(When)39 b(`)p Ft(@)p Fu(')h(is)f(used)g(and)f
-(the)i(expansion)f(app)s(ears)g(within)f(double)h(quotes,)k(eac)m(h)d
-(k)m(ey)630 5340 y(expands)30 b(to)h(a)f(separate)i(w)m(ord.)p
-eop end
+5340 y(w)m(ord.)p eop end
 %%Page: 27 33
 TeXDict begin 27 32 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(27)150 299
-y Ft(${#)p Fj(parameter)p Ft(})630 408 y Fu(The)40 b(length)g(in)g(c)m
+y Ft(${!)p Fj(name)p Ft([@]})150 408 y(${!)p Fj(name)p
+Ft([*]})630 518 y Fu(If)26 b Fr(name)32 b Fu(is)27 b(an)f(arra)m(y)h(v)
+-5 b(ariable,)29 b(expands)d(to)h(the)g(list)g(of)g(arra)m(y)g(indices)
+g(\(k)m(eys\))h(assigned)630 628 y(in)c Fr(name)p Fu(.)39
+b(If)24 b Fr(name)30 b Fu(is)24 b(not)h(an)f(arra)m(y)-8
+b(,)27 b(expands)c(to)j(0)f(if)f Fr(name)30 b Fu(is)24
+b(set)h(and)f(n)m(ull)g(otherwise.)630 737 y(When)39
+b(`)p Ft(@)p Fu(')h(is)f(used)g(and)f(the)i(expansion)f(app)s(ears)g
+(within)f(double)h(quotes,)k(eac)m(h)d(k)m(ey)630 847
+y(expands)30 b(to)h(a)f(separate)i(w)m(ord.)150 1011
+y Ft(${#)p Fj(parameter)p Ft(})630 1121 y Fu(The)40 b(length)g(in)g(c)m
 (haracters)i(of)e(the)h(expanded)e(v)-5 b(alue)41 b(of)f
-Fr(parameter)47 b Fu(is)40 b(substituted.)630 518 y(If)i
+Fr(parameter)47 b Fu(is)40 b(substituted.)630 1230 y(If)i
 Fr(parameter)50 b Fu(is)43 b(`)p Ft(*)p Fu(')g(or)g(`)p
 Ft(@)p Fu(',)k(the)c(v)-5 b(alue)43 b(substituted)f(is)h(the)g(n)m(um)m
-(b)s(er)f(of)h(p)s(ositional)630 628 y(parameters.)i(If)32
+(b)s(er)f(of)h(p)s(ositional)630 1340 y(parameters.)i(If)32
 b Fr(parameter)38 b Fu(is)32 b(an)g(arra)m(y)g(name)g(subscripted)f(b)m
 (y)g(`)p Ft(*)p Fu(')h(or)g(`)p Ft(@)p Fu(',)g(the)g(v)-5
-b(alue)630 737 y(substituted)30 b(is)h(the)g(n)m(um)m(b)s(er)e(of)i
+b(alue)630 1450 y(substituted)30 b(is)h(the)g(n)m(um)m(b)s(er)e(of)i
 (elemen)m(ts)i(in)d(the)h(arra)m(y)-8 b(.)43 b(If)30
-b Fr(parameter)38 b Fu(is)31 b(an)f(indexed)630 847 y(arra)m(y)37
-b(name)g(subscripted)f(b)m(y)h(a)g(negativ)m(e)i(n)m(um)m(b)s(er,)f
-(that)f(n)m(um)m(b)s(er)f(is)g(in)m(terpreted)i(as)630
-956 y(relativ)m(e)47 b(to)g(one)e(greater)i(than)e(the)h(maxim)m(um)f
+b Fr(parameter)38 b Fu(is)31 b(an)f(indexed)630 1559
+y(arra)m(y)37 b(name)g(subscripted)f(b)m(y)h(a)g(negativ)m(e)i(n)m(um)m
+(b)s(er,)f(that)f(n)m(um)m(b)s(er)f(is)g(in)m(terpreted)i(as)630
+1669 y(relativ)m(e)47 b(to)g(one)e(greater)i(than)e(the)h(maxim)m(um)f
 (index)g(of)g Fr(parameter)p Fu(,)50 b(so)c(negativ)m(e)630
-1066 y(indices)30 b(coun)m(t)h(bac)m(k)g(from)f(the)h(end)e(of)i(the)f
+1778 y(indices)30 b(coun)m(t)h(bac)m(k)g(from)f(the)h(end)e(of)i(the)f
 (arra)m(y)-8 b(,)32 b(and)e(an)g(index)g(of)g(-1)h(references)g(the)630
-1176 y(last)g(elemen)m(t.)150 1395 y Ft(${)p Fj(parameter)p
-Ft(#)p Fj(word)p Ft(})150 1504 y(${)p Fj(parameter)p
-Ft(##)p Fj(word)p Ft(})630 1614 y Fu(The)g Fr(w)m(ord)k
+1888 y(last)g(elemen)m(t.)150 2052 y Ft(${)p Fj(parameter)p
+Ft(#)p Fj(word)p Ft(})150 2162 y(${)p Fj(parameter)p
+Ft(##)p Fj(word)p Ft(})630 2271 y Fu(The)g Fr(w)m(ord)k
 Fu(is)d(expanded)f(to)i(pro)s(duce)e(a)h(pattern)g(just)f(as)i(in)e
-(\014lename)h(expansion)g(\(see)630 1724 y(Section)k(3.5.8)h([Filename)
-g(Expansion],)g(page)f(29\).)56 b(If)35 b(the)h(pattern)f(matc)m(hes)i
-(the)e(b)s(e-)630 1833 y(ginning)28 b(of)g(the)h(expanded)e(v)-5
+(\014lename)h(expansion)g(\(see)630 2381 y(Section)k(3.5.8)h([Filename)
+g(Expansion],)g(page)f(30\).)56 b(If)35 b(the)h(pattern)f(matc)m(hes)i
+(the)e(b)s(e-)630 2491 y(ginning)28 b(of)g(the)h(expanded)e(v)-5
 b(alue)29 b(of)f Fr(parameter)p Fu(,)h(then)f(the)g(result)g(of)h(the)f
-(expansion)g(is)630 1943 y(the)36 b(expanded)f(v)-5 b(alue)36
+(expansion)g(is)630 2600 y(the)36 b(expanded)f(v)-5 b(alue)36
 b(of)g Fr(parameter)43 b Fu(with)35 b(the)h(shortest)g(matc)m(hing)h
-(pattern)f(\(the)g(`)p Ft(#)p Fu(')630 2052 y(case\))26
+(pattern)f(\(the)g(`)p Ft(#)p Fu(')630 2710 y(case\))26
 b(or)f(the)g(longest)g(matc)m(hing)h(pattern)f(\(the)g(`)p
 Ft(##)p Fu(')g(case\))h(deleted.)39 b(If)24 b Fr(parameter)32
-b Fu(is)25 b(`)p Ft(@)p Fu(')630 2162 y(or)j(`)p Ft(*)p
+b Fu(is)25 b(`)p Ft(@)p Fu(')630 2819 y(or)j(`)p Ft(*)p
 Fu(',)i(the)e(pattern)h(remo)m(v)-5 b(al)29 b(op)s(eration)g(is)f
 (applied)h(to)g(eac)m(h)g(p)s(ositional)g(parameter)g(in)630
-2271 y(turn,)i(and)g(the)h(expansion)g(is)g(the)g(resultan)m(t)g(list.)
+2929 y(turn,)i(and)g(the)h(expansion)g(is)g(the)g(resultan)m(t)g(list.)
 45 b(If)32 b Fr(parameter)38 b Fu(is)32 b(an)g(arra)m(y)g(v)-5
-b(ariable)630 2381 y(subscripted)39 b(with)g(`)p Ft(@)p
+b(ariable)630 3039 y(subscripted)39 b(with)g(`)p Ft(@)p
 Fu(')h(or)g(`)p Ft(*)p Fu(',)j(the)d(pattern)h(remo)m(v)-5
 b(al)41 b(op)s(eration)f(is)g(applied)g(to)h(eac)m(h)630
-2491 y(mem)m(b)s(er)30 b(of)g(the)h(arra)m(y)g(in)f(turn,)f(and)h(the)h
-(expansion)f(is)g(the)h(resultan)m(t)g(list.)150 2710
+3148 y(mem)m(b)s(er)30 b(of)g(the)h(arra)m(y)g(in)f(turn,)f(and)h(the)h
+(expansion)f(is)g(the)h(resultan)m(t)g(list.)150 3313
 y Ft(${)p Fj(parameter)p Ft(\045)p Fj(word)p Ft(})150
-2819 y(${)p Fj(parameter)p Ft(\045\045)p Fj(word)p Ft(})630
-2929 y Fu(The)k Fr(w)m(ord)k Fu(is)c(expanded)g(to)h(pro)s(duce)e(a)i
+3422 y(${)p Fj(parameter)p Ft(\045\045)p Fj(word)p Ft(})630
+3532 y Fu(The)k Fr(w)m(ord)k Fu(is)c(expanded)g(to)h(pro)s(duce)e(a)i
 (pattern)f(just)g(as)h(in)f(\014lename)h(expansion.)55
-b(If)630 3039 y(the)43 b(pattern)g(matc)m(hes)h(a)g(trailing)g(p)s
+b(If)630 3641 y(the)43 b(pattern)g(matc)m(hes)h(a)g(trailing)g(p)s
 (ortion)e(of)h(the)g(expanded)g(v)-5 b(alue)43 b(of)g
-Fr(parameter)p Fu(,)630 3148 y(then)c(the)g(result)g(of)h(the)f
+Fr(parameter)p Fu(,)630 3751 y(then)c(the)g(result)g(of)h(the)f
 (expansion)g(is)h(the)f(v)-5 b(alue)40 b(of)f Fr(parameter)46
-b Fu(with)39 b(the)h(shortest)630 3258 y(matc)m(hing)31
+b Fu(with)39 b(the)h(shortest)630 3861 y(matc)m(hing)31
 b(pattern)e(\(the)h(`)p Ft(\045)p Fu(')g(case\))h(or)e(the)h(longest)h
 (matc)m(hing)f(pattern)g(\(the)g(`)p Ft(\045\045)p Fu(')g(case\))630
-3367 y(deleted.)49 b(If)32 b Fr(parameter)40 b Fu(is)33
+3970 y(deleted.)49 b(If)32 b Fr(parameter)40 b Fu(is)33
 b(`)p Ft(@)p Fu(')g(or)g(`)p Ft(*)p Fu(',)h(the)f(pattern)g(remo)m(v)-5
-b(al)34 b(op)s(eration)g(is)f(applied)f(to)630 3477 y(eac)m(h)38
+b(al)34 b(op)s(eration)g(is)f(applied)f(to)630 4080 y(eac)m(h)38
 b(p)s(ositional)g(parameter)g(in)f(turn,)h(and)e(the)h(expansion)g(is)h
-(the)f(resultan)m(t)h(list.)61 b(If)630 3587 y Fr(parameter)38
+(the)f(resultan)m(t)h(list.)61 b(If)630 4189 y Fr(parameter)38
 b Fu(is)32 b(an)f(arra)m(y)h(v)-5 b(ariable)32 b(subscripted)e(with)h
 (`)p Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)g(the)f(pattern)h(remo)m(v)-5
-b(al)630 3696 y(op)s(eration)30 b(is)g(applied)f(to)i(eac)m(h)g(mem)m
+b(al)630 4299 y(op)s(eration)30 b(is)g(applied)f(to)i(eac)m(h)g(mem)m
 (b)s(er)e(of)h(the)g(arra)m(y)g(in)f(turn,)g(and)g(the)h(expansion)g
-(is)630 3806 y(the)h(resultan)m(t)g(list.)150 4025 y
+(is)630 4408 y(the)h(resultan)m(t)g(list.)150 4573 y
 Ft(${)p Fj(parameter)p Ft(/)p Fj(pattern)p Ft(/)p Fj(stri)o(ng)p
-Ft(})630 4134 y Fu(The)37 b Fr(pattern)g Fu(is)g(expanded)g(to)h(pro)s
+Ft(})630 4682 y Fu(The)37 b Fr(pattern)g Fu(is)g(expanded)g(to)h(pro)s
 (duce)e(a)h(pattern)g(just)g(as)h(in)e(\014lename)i(expansion.)630
-4244 y Fr(P)m(arameter)46 b Fu(is)38 b(expanded)f(and)g(the)i(longest)g
+4792 y Fr(P)m(arameter)46 b Fu(is)38 b(expanded)f(and)g(the)i(longest)g
 (matc)m(h)g(of)f Fr(pattern)g Fu(against)h(its)f(v)-5
-b(alue)39 b(is)630 4354 y(replaced)34 b(with)e Fr(string)p
+b(alue)39 b(is)630 4902 y(replaced)34 b(with)e Fr(string)p
 Fu(.)49 b(If)33 b Fr(pattern)g Fu(b)s(egins)g(with)f(`)p
 Ft(/)p Fu(',)j(all)f(matc)m(hes)g(of)f Fr(pattern)g Fu(are)h(re-)630
-4463 y(placed)28 b(with)f Fr(string)p Fu(.)40 b(Normally)28
+5011 y(placed)28 b(with)f Fr(string)p Fu(.)40 b(Normally)28
 b(only)f(the)h(\014rst)e(matc)m(h)j(is)e(replaced.)40
-b(If)27 b Fr(pattern)g Fu(b)s(egins)630 4573 y(with)34
+b(If)27 b Fr(pattern)g Fu(b)s(egins)630 5121 y(with)34
 b(`)p Ft(#)p Fu(',)h(it)g(m)m(ust)f(matc)m(h)h(at)f(the)h(b)s(eginning)
 e(of)h(the)g(expanded)f(v)-5 b(alue)35 b(of)f Fr(parameter)p
-Fu(.)630 4682 y(If)g Fr(pattern)g Fu(b)s(egins)g(with)g(`)p
+Fu(.)630 5230 y(If)g Fr(pattern)g Fu(b)s(egins)g(with)g(`)p
 Ft(\045)p Fu(',)h(it)g(m)m(ust)f(matc)m(h)h(at)g(the)f(end)g(of)g(the)h
-(expanded)e(v)-5 b(alue)35 b(of)630 4792 y Fr(parameter)p
+(expanded)e(v)-5 b(alue)35 b(of)630 5340 y Fr(parameter)p
 Fu(.)41 b(If)29 b Fr(string)37 b Fu(is)29 b(n)m(ull,)h(matc)m(hes)h(of)
 e Fr(pattern)h Fu(are)g(deleted)g(and)f(the)g Ft(/)g
-Fu(follo)m(wing)630 4902 y Fr(pattern)34 b Fu(ma)m(y)g(b)s(e)f
-(omitted.)51 b(If)33 b Fr(parameter)41 b Fu(is)33 b(`)p
-Ft(@)p Fu(')h(or)g(`)p Ft(*)p Fu(',)g(the)g(substitution)f(op)s
-(eration)630 5011 y(is)38 b(applied)g(to)g(eac)m(h)h(p)s(ositional)g
-(parameter)f(in)g(turn,)h(and)e(the)h(expansion)g(is)g(the)g(re-)630
-5121 y(sultan)m(t)f(list.)59 b(If)36 b Fr(parameter)43
-b Fu(is)36 b(an)g(arra)m(y)h(v)-5 b(ariable)37 b(subscripted)e(with)h
-(`)p Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)h(the)630 5230
-y(substitution)30 b(op)s(eration)h(is)f(applied)g(to)h(eac)m(h)g(mem)m
-(b)s(er)f(of)g(the)h(arra)m(y)g(in)f(turn,)f(and)h(the)630
-5340 y(expansion)g(is)h(the)f(resultan)m(t)h(list.)p
-eop end
+Fu(follo)m(wing)p eop end
 %%Page: 28 34
 TeXDict begin 28 33 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(28)150 299
-y Ft(${)p Fj(parameter)p Ft(^)p Fj(pattern)p Ft(})150
-408 y(${)p Fj(parameter)p Ft(^^)p Fj(pattern)p Ft(})150
-518 y(${)p Fj(parameter)p Ft(,)p Fj(pattern)p Ft(})150
-628 y(${)p Fj(parameter)p Ft(,,)p Fj(pattern)p Ft(})630
-737 y Fu(This)36 b(expansion)g(mo)s(di\014es)g(the)g(case)i(of)f
-(alphab)s(etic)g(c)m(haracters)h(in)e Fr(parameter)p
-Fu(.)59 b(The)630 847 y Fr(pattern)33 b Fu(is)g(expanded)e(to)j(pro)s
-(duce)d(a)j(pattern)e(just)g(as)h(in)g(\014lename)g(expansion.)47
-b(Eac)m(h)630 956 y(c)m(haracter)32 b(in)e(the)g(expanded)f(v)-5
-b(alue)31 b(of)f Fr(parameter)37 b Fu(is)30 b(tested)h(against)h
-Fr(pattern)p Fu(,)e(and,)g(if)630 1066 y(it)j(matc)m(hes)h(the)g
-(pattern,)f(its)h(case)g(is)f(con)m(v)m(erted.)49 b(The)33
-b(pattern)g(should)f(not)h(attempt)630 1176 y(to)f(matc)m(h)g(more)f
-(than)g(one)g(c)m(haracter.)44 b(The)30 b(`)p Ft(^)p
-Fu(')i(op)s(erator)f(con)m(v)m(erts)h(lo)m(w)m(ercase)i(letters)630
-1285 y(matc)m(hing)i Fr(pattern)f Fu(to)h(upp)s(ercase;)h(the)e(`)p
-Ft(,)p Fu(')g(op)s(erator)g(con)m(v)m(erts)i(matc)m(hing)f(upp)s
-(ercase)630 1395 y(letters)e(to)f(lo)m(w)m(ercase.)50
-b(The)32 b(`)p Ft(^^)p Fu(')h(and)f(`)p Ft(,,)p Fu(')g(expansions)h
-(con)m(v)m(ert)h(eac)m(h)g(matc)m(hed)f(c)m(har-)630
-1504 y(acter)c(in)f(the)h(expanded)e(v)-5 b(alue;)30
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(28)630 299
+y Fr(pattern)34 b Fu(ma)m(y)g(b)s(e)f(omitted.)51 b(If)33
+b Fr(parameter)41 b Fu(is)33 b(`)p Ft(@)p Fu(')h(or)g(`)p
+Ft(*)p Fu(',)g(the)g(substitution)f(op)s(eration)630
+408 y(is)38 b(applied)g(to)g(eac)m(h)h(p)s(ositional)g(parameter)f(in)g
+(turn,)h(and)e(the)h(expansion)g(is)g(the)g(re-)630 518
+y(sultan)m(t)f(list.)59 b(If)36 b Fr(parameter)43 b Fu(is)36
+b(an)g(arra)m(y)h(v)-5 b(ariable)37 b(subscripted)e(with)h(`)p
+Ft(@)p Fu(')g(or)h(`)p Ft(*)p Fu(',)h(the)630 628 y(substitution)30
+b(op)s(eration)h(is)f(applied)g(to)h(eac)m(h)g(mem)m(b)s(er)f(of)g(the)
+h(arra)m(y)g(in)f(turn,)f(and)h(the)630 737 y(expansion)g(is)h(the)f
+(resultan)m(t)h(list.)150 931 y Ft(${)p Fj(parameter)p
+Ft(^)p Fj(pattern)p Ft(})150 1040 y(${)p Fj(parameter)p
+Ft(^^)p Fj(pattern)p Ft(})150 1150 y(${)p Fj(parameter)p
+Ft(,)p Fj(pattern)p Ft(})150 1259 y(${)p Fj(parameter)p
+Ft(,,)p Fj(pattern)p Ft(})630 1369 y Fu(This)36 b(expansion)g(mo)s
+(di\014es)g(the)g(case)i(of)f(alphab)s(etic)g(c)m(haracters)h(in)e
+Fr(parameter)p Fu(.)59 b(The)630 1479 y Fr(pattern)33
+b Fu(is)g(expanded)e(to)j(pro)s(duce)d(a)j(pattern)e(just)g(as)h(in)g
+(\014lename)g(expansion.)47 b(Eac)m(h)630 1588 y(c)m(haracter)32
+b(in)e(the)g(expanded)f(v)-5 b(alue)31 b(of)f Fr(parameter)37
+b Fu(is)30 b(tested)h(against)h Fr(pattern)p Fu(,)e(and,)g(if)630
+1698 y(it)j(matc)m(hes)h(the)g(pattern,)f(its)h(case)g(is)f(con)m(v)m
+(erted.)49 b(The)33 b(pattern)g(should)f(not)h(attempt)630
+1807 y(to)f(matc)m(h)g(more)f(than)g(one)g(c)m(haracter.)44
+b(The)30 b(`)p Ft(^)p Fu(')i(op)s(erator)f(con)m(v)m(erts)h(lo)m(w)m
+(ercase)i(letters)630 1917 y(matc)m(hing)i Fr(pattern)f
+Fu(to)h(upp)s(ercase;)h(the)e(`)p Ft(,)p Fu(')g(op)s(erator)g(con)m(v)m
+(erts)i(matc)m(hing)f(upp)s(ercase)630 2027 y(letters)e(to)f(lo)m(w)m
+(ercase.)50 b(The)32 b(`)p Ft(^^)p Fu(')h(and)f(`)p Ft(,,)p
+Fu(')g(expansions)h(con)m(v)m(ert)h(eac)m(h)g(matc)m(hed)f(c)m(har-)630
+2136 y(acter)c(in)f(the)h(expanded)e(v)-5 b(alue;)30
 b(the)e(`)p Ft(^)p Fu(')g(and)g(`)p Ft(,)p Fu(')g(expansions)g(matc)m
-(h)h(and)f(con)m(v)m(ert)i(only)630 1614 y(the)37 b(\014rst)g(c)m
+(h)h(and)f(con)m(v)m(ert)i(only)630 2246 y(the)37 b(\014rst)g(c)m
 (haracter)i(in)e(the)g(expanded)g(v)-5 b(alue.)61 b(If)37
 b Fr(pattern)g Fu(is)h(omitted,)i(it)e(is)f(treated)630
-1724 y(lik)m(e)h(a)f(`)p Ft(?)p Fu(',)i(whic)m(h)d(matc)m(hes)i(ev)m
+2355 y(lik)m(e)h(a)f(`)p Ft(?)p Fu(',)i(whic)m(h)d(matc)m(hes)i(ev)m
 (ery)f(c)m(haracter.)61 b(If)37 b Fr(parameter)43 b Fu(is)37
 b(`)p Ft(@)p Fu(')g(or)f(`)p Ft(*)p Fu(',)j(the)e(case)630
-1833 y(mo)s(di\014cation)29 b(op)s(eration)f(is)g(applied)g(to)h(eac)m
+2465 y(mo)s(di\014cation)29 b(op)s(eration)f(is)g(applied)g(to)h(eac)m
 (h)h(p)s(ositional)f(parameter)f(in)g(turn,)g(and)g(the)630
-1943 y(expansion)38 b(is)g(the)g(resultan)m(t)h(list.)65
+2575 y(expansion)38 b(is)g(the)g(resultan)m(t)h(list.)65
 b(If)37 b Fr(parameter)46 b Fu(is)38 b(an)g(arra)m(y)g(v)-5
-b(ariable)39 b(subscripted)630 2052 y(with)26 b(`)p Ft(@)p
+b(ariable)39 b(subscripted)630 2684 y(with)26 b(`)p Ft(@)p
 Fu(')f(or)h(`)p Ft(*)p Fu(',)h(the)f(case)h(mo)s(di\014cation)f(op)s
 (eration)h(is)e(applied)h(to)h(eac)m(h)g(mem)m(b)s(er)e(of)h(the)630
-2162 y(arra)m(y)31 b(in)f(turn,)f(and)h(the)h(expansion)f(is)g(the)h
-(resultan)m(t)g(list.)150 2367 y Fk(3.5.4)63 b(Command)41
-b(Substitution)150 2514 y Fu(Command)f(substitution)h(allo)m(ws)i(the)e
+2794 y(arra)m(y)31 b(in)f(turn,)f(and)h(the)h(expansion)f(is)g(the)h
+(resultan)m(t)g(list.)150 3027 y Fk(3.5.4)63 b(Command)41
+b(Substitution)150 3174 y Fu(Command)f(substitution)h(allo)m(ws)i(the)e
 (output)g(of)h(a)f(command)g(to)h(replace)g(the)g(command)f(itself.)150
-2624 y(Command)29 b(substitution)h(o)s(ccurs)h(when)e(a)i(command)f(is)
-g(enclosed)h(as)g(follo)m(ws:)390 2765 y Ft($\()p Fj(command)p
-Ft(\))150 2906 y Fu(or)390 3047 y Ft(`)p Fj(command)p
-Ft(`)150 3187 y Fu(Bash)45 b(p)s(erforms)f(the)h(expansion)f(b)m(y)h
+3284 y(Command)29 b(substitution)h(o)s(ccurs)h(when)e(a)i(command)f(is)
+g(enclosed)h(as)g(follo)m(ws:)390 3452 y Ft($\()p Fj(command)p
+Ft(\))150 3621 y Fu(or)390 3789 y Ft(`)p Fj(command)p
+Ft(`)150 3958 y Fu(Bash)45 b(p)s(erforms)f(the)h(expansion)f(b)m(y)h
 (executing)i Fr(command)h Fu(and)c(replacing)i(the)f(command)g(sub-)150
-3297 y(stitution)c(with)f(the)g(standard)g(output)g(of)g(the)g
+4067 y(stitution)c(with)f(the)g(standard)g(output)g(of)g(the)g
 (command,)j(with)d(an)m(y)h(trailing)g(newlines)f(deleted.)150
-3407 y(Em)m(b)s(edded)30 b(newlines)h(are)h(not)f(deleted,)i(but)e
+4177 y(Em)m(b)s(edded)30 b(newlines)h(are)h(not)f(deleted,)i(but)e
 (they)g(ma)m(y)h(b)s(e)f(remo)m(v)m(ed)i(during)d(w)m(ord)h(splitting.)
-44 b(The)150 3516 y(command)23 b(substitution)g Ft($\(cat)29
+44 b(The)150 4286 y(command)23 b(substitution)g Ft($\(cat)29
 b Fj(file)p Ft(\))22 b Fu(can)i(b)s(e)f(replaced)g(b)m(y)h(the)f(equiv)
 -5 b(alen)m(t)25 b(but)e(faster)h Ft($\(<)29 b Fj(file)p
-Ft(\))p Fu(.)275 3657 y(When)k(the)i(old-st)m(yle)h(bac)m(kquote)f
+Ft(\))p Fu(.)275 4455 y(When)k(the)i(old-st)m(yle)h(bac)m(kquote)f
 (form)f(of)g(substitution)g(is)g(used,)h(bac)m(kslash)f(retains)h(its)f
-(literal)150 3767 y(meaning)k(except)h(when)e(follo)m(w)m(ed)j(b)m(y)e
+(literal)150 4565 y(meaning)k(except)h(when)e(follo)m(w)m(ed)j(b)m(y)e
 (`)p Ft($)p Fu(',)j(`)p Ft(`)p Fu(',)f(or)e(`)p Ft(\\)p
 Fu('.)64 b(The)38 b(\014rst)f(bac)m(kquote)j(not)e(preceded)g(b)m(y)g
-(a)150 3876 y(bac)m(kslash)k(terminates)f(the)h(command)e
+(a)150 4674 y(bac)m(kslash)k(terminates)f(the)h(command)e
 (substitution.)72 b(When)41 b(using)f(the)i Ft($\()p
-Fj(command)p Ft(\))c Fu(form,)43 b(all)150 3986 y(c)m(haracters)32
+Fj(command)p Ft(\))c Fu(form,)43 b(all)150 4784 y(c)m(haracters)32
 b(b)s(et)m(w)m(een)f(the)f(paren)m(theses)h(mak)m(e)g(up)f(the)g
 (command;)h(none)f(are)h(treated)g(sp)s(ecially)-8 b(.)275
-4127 y(Command)22 b(substitutions)g(ma)m(y)i(b)s(e)e(nested.)39
+4952 y(Command)22 b(substitutions)g(ma)m(y)i(b)s(e)e(nested.)39
 b(T)-8 b(o)23 b(nest)g(when)f(using)h(the)g(bac)m(kquoted)h(form,)g
-(escap)s(e)150 4236 y(the)31 b(inner)e(bac)m(kquotes)j(with)e(bac)m
-(kslashes.)275 4377 y(If)e(the)i(substitution)e(app)s(ears)h(within)g
+(escap)s(e)150 5062 y(the)31 b(inner)e(bac)m(kquotes)j(with)e(bac)m
+(kslashes.)275 5230 y(If)e(the)i(substitution)e(app)s(ears)h(within)g
 (double)f(quotes,)i(w)m(ord)f(splitting)h(and)f(\014lename)g(expansion)
-150 4487 y(are)i(not)f(p)s(erformed)f(on)h(the)h(results.)150
-4692 y Fk(3.5.5)63 b(Arithmetic)40 b(Expansion)150 4839
-y Fu(Arithmetic)25 b(expansion)g(allo)m(ws)g(the)g(ev)-5
-b(aluation)26 b(of)f(an)f(arithmetic)i(expression)e(and)g(the)g
-(substitution)150 4949 y(of)31 b(the)f(result.)41 b(The)30
-b(format)g(for)g(arithmetic)i(expansion)e(is:)390 5090
-y Ft($\(\()47 b Fj(expression)e Ft(\)\))275 5230 y Fu(The)33
-b(expression)g(is)h(treated)g(as)g(if)g(it)g(w)m(ere)g(within)f(double)
-h(quotes,)h(but)e(a)h(double)f(quote)h(inside)150 5340
-y(the)k(paren)m(theses)g(is)g(not)g(treated)h(sp)s(ecially)-8
-b(.)65 b(All)38 b(tok)m(ens)h(in)f(the)g(expression)f(undergo)g
-(parameter)p eop end
+150 5340 y(are)i(not)f(p)s(erformed)f(on)h(the)h(results.)p
+eop end
 %%Page: 29 35
 TeXDict begin 29 34 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(29)150 299
-y(and)26 b(v)-5 b(ariable)28 b(expansion,)g(command)e(substitution,)i
-(and)e(quote)i(remo)m(v)-5 b(al.)41 b(The)26 b(result)h(is)g(treated)h
-(as)150 408 y(the)j(arithmetic)g(expression)f(to)h(b)s(e)f(ev)-5
+y Fk(3.5.5)63 b(Arithmetic)40 b(Expansion)150 446 y Fu(Arithmetic)25
+b(expansion)g(allo)m(ws)g(the)g(ev)-5 b(aluation)26 b(of)f(an)f
+(arithmetic)i(expression)e(and)g(the)g(substitution)150
+555 y(of)31 b(the)f(result.)41 b(The)30 b(format)g(for)g(arithmetic)i
+(expansion)e(is:)390 691 y Ft($\(\()47 b Fj(expression)e
+Ft(\)\))275 826 y Fu(The)33 b(expression)g(is)h(treated)g(as)g(if)g(it)
+g(w)m(ere)g(within)f(double)h(quotes,)h(but)e(a)h(double)f(quote)h
+(inside)150 935 y(the)k(paren)m(theses)g(is)g(not)g(treated)h(sp)s
+(ecially)-8 b(.)65 b(All)38 b(tok)m(ens)h(in)f(the)g(expression)f
+(undergo)g(parameter)150 1045 y(and)26 b(v)-5 b(ariable)28
+b(expansion,)g(command)e(substitution,)i(and)e(quote)i(remo)m(v)-5
+b(al.)41 b(The)26 b(result)h(is)g(treated)h(as)150 1154
+y(the)j(arithmetic)g(expression)f(to)h(b)s(e)f(ev)-5
 b(aluated.)42 b(Arithmetic)31 b(expansions)g(ma)m(y)g(b)s(e)e(nested.)
-275 547 y(The)34 b(ev)-5 b(aluation)37 b(is)f(p)s(erformed)e(according)
-i(to)g(the)g(rules)f(listed)h(b)s(elo)m(w)g(\(see)g(Section)g(6.5)h
-([Shell)150 657 y(Arithmetic],)32 b(page)f(87\).)42 b(If)30
-b(the)h(expression)f(is)g(in)m(v)-5 b(alid,)32 b(Bash)e(prin)m(ts)g(a)h
-(message)g(indicating)h(failure)150 767 y(to)f(the)g(standard)e(error)h
-(and)g(no)g(substitution)g(o)s(ccurs.)150 970 y Fk(3.5.6)63
-b(Pro)s(cess)42 b(Substitution)150 1117 y Fu(Pro)s(cess)i(substitution)
-g(is)g(supp)s(orted)f(on)h(systems)g(that)h(supp)s(ort)d(named)i(pip)s
-(es)f(\()p Fm(fif)n(o)p Fu(s\))i(or)f(the)150 1227 y
-Ft(/dev/fd)28 b Fu(metho)s(d)i(of)h(naming)f(op)s(en)g(\014les.)40
-b(It)31 b(tak)m(es)h(the)e(form)g(of)390 1366 y Ft(<\()p
-Fj(list)p Ft(\))150 1504 y Fu(or)390 1643 y Ft(>\()p
-Fj(list)p Ft(\))150 1782 y Fu(The)c(pro)s(cess)f Fr(list)k
-Fu(is)e(run)d(with)i(its)h(input)e(or)h(output)g(connected)h(to)g(a)g
-Fm(fif)n(o)f Fu(or)g(some)g(\014le)h(in)f Ft(/dev/fd)p
-Fu(.)150 1892 y(The)i(name)h(of)g(this)f(\014le)h(is)g(passed)f(as)h
+275 1290 y(The)34 b(ev)-5 b(aluation)37 b(is)f(p)s(erformed)e
+(according)i(to)g(the)g(rules)f(listed)h(b)s(elo)m(w)g(\(see)g(Section)
+g(6.5)h([Shell)150 1399 y(Arithmetic],)32 b(page)f(87\).)42
+b(If)30 b(the)h(expression)f(is)g(in)m(v)-5 b(alid,)32
+b(Bash)e(prin)m(ts)g(a)h(message)g(indicating)h(failure)150
+1509 y(to)f(the)g(standard)e(error)h(and)g(no)g(substitution)g(o)s
+(ccurs.)150 1709 y Fk(3.5.6)63 b(Pro)s(cess)42 b(Substitution)150
+1856 y Fu(Pro)s(cess)i(substitution)g(is)g(supp)s(orted)f(on)h(systems)
+g(that)h(supp)s(ort)d(named)i(pip)s(es)f(\()p Fm(fif)n(o)p
+Fu(s\))i(or)f(the)150 1965 y Ft(/dev/fd)28 b Fu(metho)s(d)i(of)h
+(naming)f(op)s(en)g(\014les.)40 b(It)31 b(tak)m(es)h(the)e(form)g(of)
+390 2100 y Ft(<\()p Fj(list)p Ft(\))150 2235 y Fu(or)390
+2370 y Ft(>\()p Fj(list)p Ft(\))150 2506 y Fu(The)c(pro)s(cess)f
+Fr(list)k Fu(is)e(run)d(with)i(its)h(input)e(or)h(output)g(connected)h
+(to)g(a)g Fm(fif)n(o)f Fu(or)g(some)g(\014le)h(in)f Ft(/dev/fd)p
+Fu(.)150 2615 y(The)i(name)h(of)g(this)f(\014le)h(is)g(passed)f(as)h
 (an)f(argumen)m(t)h(to)h(the)f(curren)m(t)f(command)h(as)f(the)h
-(result)g(of)g(the)150 2001 y(expansion.)40 b(If)29 b(the)g
+(result)g(of)g(the)150 2725 y(expansion.)40 b(If)29 b(the)g
 Ft(>\()p Fj(list)p Ft(\))f Fu(form)g(is)i(used,)f(writing)g(to)h(the)f
 (\014le)h(will)f(pro)m(vide)h(input)e(for)h Fr(list)p
-Fu(.)41 b(If)29 b(the)150 2111 y Ft(<\()p Fj(list)p Ft(\))24
+Fu(.)41 b(If)29 b(the)150 2834 y Ft(<\()p Fj(list)p Ft(\))24
 b Fu(form)h(is)h(used,)g(the)g(\014le)g(passed)g(as)g(an)f(argumen)m(t)
 i(should)e(b)s(e)g(read)g(to)i(obtain)f(the)g(output)g(of)150
-2220 y Fr(list)p Fu(.)41 b(Note)31 b(that)f(no)g(space)g(ma)m(y)g(app)s
+2944 y Fr(list)p Fu(.)41 b(Note)31 b(that)f(no)g(space)g(ma)m(y)g(app)s
 (ear)f(b)s(et)m(w)m(een)h(the)g Ft(<)f Fu(or)h Ft(>)f
 Fu(and)g(the)h(left)g(paren)m(thesis,)h(otherwise)150
-2330 y(the)g(construct)f(w)m(ould)g(b)s(e)g(in)m(terpreted)h(as)f(a)h
-(redirection.)275 2469 y(When)36 b(a)m(v)-5 b(ailable,)40
+3054 y(the)g(construct)f(w)m(ould)g(b)s(e)g(in)m(terpreted)h(as)f(a)h
+(redirection.)275 3189 y(When)36 b(a)m(v)-5 b(ailable,)40
 b(pro)s(cess)c(substitution)h(is)f(p)s(erformed)f(sim)m(ultaneously)i
-(with)g(parameter)g(and)150 2578 y(v)-5 b(ariable)31
+(with)g(parameter)g(and)150 3298 y(v)-5 b(ariable)31
 b(expansion,)g(command)f(substitution,)g(and)g(arithmetic)i(expansion.)
-150 2782 y Fk(3.5.7)63 b(W)-10 b(ord)41 b(Splitting)150
-2929 y Fu(The)30 b(shell)h(scans)g(the)g(results)f(of)h(parameter)g
+150 3498 y Fk(3.5.7)63 b(W)-10 b(ord)41 b(Splitting)150
+3645 y Fu(The)30 b(shell)h(scans)g(the)g(results)f(of)h(parameter)g
 (expansion,)g(command)g(substitution,)g(and)f(arithmetic)150
-3039 y(expansion)g(that)h(did)f(not)g(o)s(ccur)h(within)e(double)h
-(quotes)h(for)f(w)m(ord)g(splitting.)275 3177 y(The)e(shell)g(treats)i
+3755 y(expansion)g(that)h(did)f(not)g(o)s(ccur)h(within)e(double)h
+(quotes)h(for)f(w)m(ord)g(splitting.)275 3890 y(The)e(shell)g(treats)i
 (eac)m(h)g(c)m(haracter)g(of)f Ft($IFS)e Fu(as)i(a)g(delimiter,)h(and)e
-(splits)g(the)h(results)f(of)h(the)g(other)150 3287 y(expansions)22
+(splits)g(the)h(results)f(of)h(the)g(other)150 3999 y(expansions)22
 b(in)m(to)i(w)m(ords)e(using)h(these)g(c)m(haracters)h(as)f(\014eld)f
 (terminators.)39 b(If)22 b Ft(IFS)g Fu(is)h(unset,)h(or)e(its)h(v)-5
-b(alue)150 3397 y(is)36 b(exactly)j Ft(<space><tab><newline>)p
+b(alue)150 4109 y(is)36 b(exactly)j Ft(<space><tab><newline>)p
 Fu(,)32 b(the)37 b(default,)h(then)e(sequences)h(of)67
-b Ft(<space>)p Fu(,)36 b Ft(<tab>)p Fu(,)h(and)150 3506
+b Ft(<space>)p Fu(,)36 b Ft(<tab>)p Fu(,)h(and)150 4219
 y Ft(<newline>)28 b Fu(at)k(the)f(b)s(eginning)f(and)h(end)f(of)h(the)g
 (results)g(of)g(the)g(previous)g(expansions)f(are)i(ignored,)150
-3616 y(and)k(an)m(y)h(sequence)h(of)f Ft(IFS)f Fu(c)m(haracters)i(not)f
+4328 y(and)k(an)m(y)h(sequence)h(of)f Ft(IFS)f Fu(c)m(haracters)i(not)f
 (at)h(the)f(b)s(eginning)f(or)h(end)f(serv)m(es)h(to)h(delimit)f(w)m
-(ords.)150 3725 y(If)43 b Ft(IFS)f Fu(has)h(a)h(v)-5
+(ords.)150 4438 y(If)43 b Ft(IFS)f Fu(has)h(a)h(v)-5
 b(alue)43 b(other)h(than)f(the)g(default,)k(then)c(sequences)h(of)f
-(the)h(whitespace)f(c)m(haracters)150 3835 y Ft(space)26
+(the)h(whitespace)f(c)m(haracters)150 4547 y Ft(space)26
 b Fu(and)h Ft(tab)g Fu(are)h(ignored)g(at)h(the)f(b)s(eginning)f(and)g
 (end)g(of)h(the)g(w)m(ord,)g(as)g(long)g(as)g(the)g(whitespace)150
-3945 y(c)m(haracter)34 b(is)f(in)f(the)h(v)-5 b(alue)33
+4657 y(c)m(haracter)34 b(is)f(in)f(the)h(v)-5 b(alue)33
 b(of)f Ft(IFS)g Fu(\(an)h Ft(IFS)e Fu(whitespace)j(c)m(haracter\).)49
 b(An)m(y)32 b(c)m(haracter)i(in)f Ft(IFS)e Fu(that)150
-4054 y(is)f(not)h Ft(IFS)f Fu(whitespace,)h(along)g(with)f(an)m(y)h
+4767 y(is)f(not)h Ft(IFS)f Fu(whitespace,)h(along)g(with)f(an)m(y)h
 (adjacen)m(t)h Ft(IFS)d Fu(whitespace)i(c)m(haracters,)h(delimits)f(a)g
-(\014eld.)150 4164 y(A)h(sequence)h(of)f Ft(IFS)f Fu(whitespace)i(c)m
+(\014eld.)150 4876 y(A)h(sequence)h(of)f Ft(IFS)f Fu(whitespace)i(c)m
 (haracters)h(is)e(also)h(treated)g(as)g(a)f(delimiter.)47
-b(If)32 b(the)g(v)-5 b(alue)33 b(of)f Ft(IFS)150 4273
+b(If)32 b(the)g(v)-5 b(alue)33 b(of)f Ft(IFS)150 4986
 y Fu(is)e(n)m(ull,)h(no)f(w)m(ord)g(splitting)h(o)s(ccurs.)275
-4412 y(Explicit)44 b(n)m(ull)f(argumen)m(ts)g(\()p Ft("")g
+5121 y(Explicit)44 b(n)m(ull)f(argumen)m(ts)g(\()p Ft("")g
 Fu(or)h Ft('')p Fu(\))f(are)g(retained.)80 b(Unquoted)43
-b(implicit)h(n)m(ull)f(argumen)m(ts,)150 4522 y(resulting)24
+b(implicit)h(n)m(ull)f(argumen)m(ts,)150 5230 y(resulting)24
 b(from)f(the)g(expansion)g(of)h(parameters)g(that)g(ha)m(v)m(e)h(no)e
 (v)-5 b(alues,)25 b(are)f(remo)m(v)m(ed.)40 b(If)23 b(a)g(parameter)150
-4631 y(with)30 b(no)g(v)-5 b(alue)31 b(is)g(expanded)e(within)h(double)
+5340 y(with)30 b(no)g(v)-5 b(alue)31 b(is)g(expanded)e(within)h(double)
 g(quotes,)h(a)g(n)m(ull)f(argumen)m(t)h(results)f(and)g(is)g(retained.)
-275 4770 y(Note)h(that)g(if)g(no)f(expansion)g(o)s(ccurs,)g(no)h
-(splitting)g(is)f(p)s(erformed.)150 4974 y Fk(3.5.8)63
-b(Filename)41 b(Expansion)150 5121 y Fu(After)30 b(w)m(ord)f
-(splitting,)i(unless)d(the)i Ft(-f)f Fu(option)h(has)f(b)s(een)g(set)h
-(\(see)g(Section)h(4.3.1)g([The)e(Set)h(Builtin],)150
-5230 y(page)d(58\),)i(Bash)d(scans)h(eac)m(h)h(w)m(ord)e(for)g(the)h(c)
-m(haracters)g(`)p Ft(*)p Fu(',)h(`)p Ft(?)p Fu(',)g(and)e(`)p
-Ft([)p Fu('.)39 b(If)26 b(one)h(of)g(these)f(c)m(haracters)150
-5340 y(app)s(ears,)h(then)f(the)h(w)m(ord)f(is)h(regarded)g(as)g(a)g
-Fr(pattern)p Fu(,)g(and)g(replaced)g(with)f(an)h(alphab)s(etically)h
-(sorted)p eop end
+p eop end
 %%Page: 30 36
 TeXDict begin 30 35 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(30)150 299
-y(list)32 b(of)f(\014lenames)g(matc)m(hing)h(the)f(pattern)g(\(see)h
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(30)275 299
+y(Note)31 b(that)g(if)g(no)f(expansion)g(o)s(ccurs,)g(no)h(splitting)g
+(is)f(p)s(erformed.)150 503 y Fk(3.5.8)63 b(Filename)41
+b(Expansion)150 650 y Fu(After)30 b(w)m(ord)f(splitting,)i(unless)d
+(the)i Ft(-f)f Fu(option)h(has)f(b)s(een)g(set)h(\(see)g(Section)h
+(4.3.1)g([The)e(Set)h(Builtin],)150 759 y(page)d(58\),)i(Bash)d(scans)h
+(eac)m(h)h(w)m(ord)e(for)g(the)h(c)m(haracters)g(`)p
+Ft(*)p Fu(',)h(`)p Ft(?)p Fu(',)g(and)e(`)p Ft([)p Fu('.)39
+b(If)26 b(one)h(of)g(these)f(c)m(haracters)150 869 y(app)s(ears,)h
+(then)f(the)h(w)m(ord)f(is)h(regarded)g(as)g(a)g Fr(pattern)p
+Fu(,)g(and)g(replaced)g(with)f(an)h(alphab)s(etically)h(sorted)150
+979 y(list)k(of)f(\014lenames)g(matc)m(hing)h(the)f(pattern)g(\(see)h
 (Section)f(3.5.8.1)j([P)m(attern)e(Matc)m(hing],)h(page)f(30\).)43
-b(If)150 408 y(no)26 b(matc)m(hing)i(\014lenames)e(are)h(found,)f(and)g
-(the)h(shell)f(option)h Ft(nullglob)d Fu(is)j(disabled,)g(the)g(w)m
-(ord)f(is)g(left)150 518 y(unc)m(hanged.)40 b(If)30 b(the)g
-Ft(nullglob)e Fu(option)i(is)h(set,)f(and)g(no)g(matc)m(hes)h(are)g
-(found,)e(the)h(w)m(ord)g(is)g(remo)m(v)m(ed.)150 628
-y(If)i(the)g Ft(failglob)e Fu(shell)i(option)h(is)f(set,)h(and)f(no)g
-(matc)m(hes)h(are)g(found,)e(an)h(error)g(message)h(is)f(prin)m(ted)150
-737 y(and)e(the)g(command)g(is)h(not)f(executed.)42 b(If)30
-b(the)g(shell)h(option)g Ft(nocaseglob)c Fu(is)k(enabled,)f(the)h(matc)
-m(h)g(is)150 847 y(p)s(erformed)e(without)h(regard)h(to)g(the)f(case)i
-(of)e(alphab)s(etic)h(c)m(haracters.)275 985 y(When)23
-b(a)h(pattern)f(is)h(used)f(for)g(\014lename)h(expansion,)h(the)e(c)m
-(haracter)i(`)p Ft(.)p Fu(')f(at)g(the)g(start)g(of)g(a)g(\014lename)
-150 1095 y(or)f(immediately)i(follo)m(wing)g(a)f(slash)f(m)m(ust)h(b)s
-(e)f(matc)m(hed)h(explicitly)-8 b(,)27 b(unless)c(the)g(shell)h(option)
-g Ft(dotglob)150 1205 y Fu(is)33 b(set.)51 b(When)33
-b(matc)m(hing)h(a)g(\014lename,)h(the)e(slash)h(c)m(haracter)h(m)m(ust)
-e(alw)m(a)m(ys)i(b)s(e)e(matc)m(hed)h(explicitly)-8 b(.)150
-1314 y(In)30 b(other)g(cases,)i(the)e(`)p Ft(.)p Fu(')h(c)m(haracter)h
-(is)e(not)h(treated)g(sp)s(ecially)-8 b(.)275 1453 y(See)28
-b(the)g(description)g(of)g Ft(shopt)e Fu(in)i(Section)g(4.3.2)i([The)e
-(Shopt)f(Builtin],)i(page)g(62,)g(for)f(a)g(descrip-)150
-1562 y(tion)j(of)f(the)h Ft(nocaseglob)p Fu(,)d Ft(nullglob)p
-Fu(,)g Ft(failglob)p Fu(,)h(and)g Ft(dotglob)g Fu(options.)275
-1701 y(The)j Ft(GLOBIGNORE)f Fu(shell)i(v)-5 b(ariable)34
-b(ma)m(y)g(b)s(e)f(used)f(to)i(restrict)g(the)g(set)f(of)h(\014lenames)
-f(matc)m(hing)i(a)150 1811 y(pattern.)k(If)25 b Ft(GLOBIGNORE)e
-Fu(is)j(set,)h(eac)m(h)g(matc)m(hing)g(\014lename)f(that)g(also)h(matc)
-m(hes)f(one)g(of)g(the)g(patterns)150 1920 y(in)39 b
-Ft(GLOBIGNORE)d Fu(is)j(remo)m(v)m(ed)h(from)e(the)h(list)h(of)f(matc)m
-(hes.)67 b(The)39 b(\014lenames)g Ft(.)f Fu(and)h Ft(..)f
-Fu(are)h(alw)m(a)m(ys)150 2030 y(ignored)33 b(when)e
-Ft(GLOBIGNORE)f Fu(is)j(set)g(and)f(not)h(n)m(ull.)48
-b(Ho)m(w)m(ev)m(er,)35 b(setting)f Ft(GLOBIGNORE)c Fu(to)j(a)g(non-n)m
-(ull)150 2139 y(v)-5 b(alue)34 b(has)f(the)h(e\013ect)h(of)f(enabling)g
-(the)g Ft(dotglob)e Fu(shell)h(option,)j(so)e(all)g(other)g
-(\014lenames)g(b)s(eginning)150 2249 y(with)43 b(a)h(`)p
-Ft(.)p Fu(')f(will)h(matc)m(h.)80 b(T)-8 b(o)44 b(get)h(the)e(old)h(b)s
-(eha)m(vior)f(of)h(ignoring)f(\014lenames)h(b)s(eginning)f(with)g(a)150
-2359 y(`)p Ft(.)p Fu(',)c(mak)m(e)g(`)p Ft(.*)p Fu(')e(one)g(of)g(the)h
-(patterns)f(in)g Ft(GLOBIGNORE)p Fu(.)58 b(The)37 b Ft(dotglob)e
-Fu(option)j(is)f(disabled)g(when)150 2468 y Ft(GLOBIGNORE)28
-b Fu(is)i(unset.)150 2672 y Fk(3.5.8.1)63 b(P)m(attern)40
-b(Matc)m(hing)150 2819 y Fu(An)m(y)24 b(c)m(haracter)h(that)f(app)s
-(ears)f(in)g(a)h(pattern,)i(other)e(than)f(the)h(sp)s(ecial)g(pattern)g
-(c)m(haracters)h(describ)s(ed)150 2928 y(b)s(elo)m(w,)31
-b(matc)m(hes)g(itself.)42 b(The)29 b Fm(nul)h Fu(c)m(haracter)i(ma)m(y)
-e(not)h(o)s(ccur)f(in)g(a)h(pattern.)40 b(A)31 b(bac)m(kslash)g(escap)s
-(es)150 3038 y(the)38 b(follo)m(wing)g(c)m(haracter;)43
-b(the)37 b(escaping)i(bac)m(kslash)e(is)h(discarded)f(when)f(matc)m
-(hing.)63 b(The)36 b(sp)s(ecial)150 3147 y(pattern)30
-b(c)m(haracters)i(m)m(ust)f(b)s(e)e(quoted)i(if)f(they)h(are)f(to)i(b)s
-(e)d(matc)m(hed)i(literally)-8 b(.)275 3286 y(The)29
-b(sp)s(ecial)i(pattern)g(c)m(haracters)h(ha)m(v)m(e)f(the)g(follo)m
-(wing)h(meanings:)150 3452 y Ft(*)432 b Fu(Matc)m(hes)31
-b(an)m(y)e(string,)h(including)f(the)g(n)m(ull)g(string.)41
-b(When)29 b(the)g Ft(globstar)e Fu(shell)i(option)630
-3561 y(is)37 b(enabled,)h(and)e(`)p Ft(*)p Fu(')h(is)g(used)f(in)g(a)h
+b(If)150 1088 y(no)26 b(matc)m(hing)i(\014lenames)e(are)h(found,)f(and)
+g(the)h(shell)f(option)h Ft(nullglob)d Fu(is)j(disabled,)g(the)g(w)m
+(ord)f(is)g(left)150 1198 y(unc)m(hanged.)40 b(If)30
+b(the)g Ft(nullglob)e Fu(option)i(is)h(set,)f(and)g(no)g(matc)m(hes)h
+(are)g(found,)e(the)h(w)m(ord)g(is)g(remo)m(v)m(ed.)150
+1307 y(If)i(the)g Ft(failglob)e Fu(shell)i(option)h(is)f(set,)h(and)f
+(no)g(matc)m(hes)h(are)g(found,)e(an)h(error)g(message)h(is)f(prin)m
+(ted)150 1417 y(and)e(the)g(command)g(is)h(not)f(executed.)42
+b(If)30 b(the)g(shell)h(option)g Ft(nocaseglob)c Fu(is)k(enabled,)f
+(the)h(matc)m(h)g(is)150 1527 y(p)s(erformed)e(without)h(regard)h(to)g
+(the)f(case)i(of)e(alphab)s(etic)h(c)m(haracters.)275
+1666 y(When)23 b(a)h(pattern)f(is)h(used)f(for)g(\014lename)h
+(expansion,)h(the)e(c)m(haracter)i(`)p Ft(.)p Fu(')f(at)g(the)g(start)g
+(of)g(a)g(\014lename)150 1775 y(or)f(immediately)i(follo)m(wing)g(a)f
+(slash)f(m)m(ust)h(b)s(e)f(matc)m(hed)h(explicitly)-8
+b(,)27 b(unless)c(the)g(shell)h(option)g Ft(dotglob)150
+1885 y Fu(is)33 b(set.)51 b(When)33 b(matc)m(hing)h(a)g(\014lename,)h
+(the)e(slash)h(c)m(haracter)h(m)m(ust)e(alw)m(a)m(ys)i(b)s(e)e(matc)m
+(hed)h(explicitly)-8 b(.)150 1994 y(In)30 b(other)g(cases,)i(the)e(`)p
+Ft(.)p Fu(')h(c)m(haracter)h(is)e(not)h(treated)g(sp)s(ecially)-8
+b(.)275 2134 y(See)28 b(the)g(description)g(of)g Ft(shopt)e
+Fu(in)i(Section)g(4.3.2)i([The)e(Shopt)f(Builtin],)i(page)g(62,)g(for)f
+(a)g(descrip-)150 2243 y(tion)j(of)f(the)h Ft(nocaseglob)p
+Fu(,)d Ft(nullglob)p Fu(,)g Ft(failglob)p Fu(,)h(and)g
+Ft(dotglob)g Fu(options.)275 2383 y(The)j Ft(GLOBIGNORE)f
+Fu(shell)i(v)-5 b(ariable)34 b(ma)m(y)g(b)s(e)f(used)f(to)i(restrict)g
+(the)g(set)f(of)h(\014lenames)f(matc)m(hing)i(a)150 2492
+y(pattern.)k(If)25 b Ft(GLOBIGNORE)e Fu(is)j(set,)h(eac)m(h)g(matc)m
+(hing)g(\014lename)f(that)g(also)h(matc)m(hes)f(one)g(of)g(the)g
+(patterns)150 2602 y(in)39 b Ft(GLOBIGNORE)d Fu(is)j(remo)m(v)m(ed)h
+(from)e(the)h(list)h(of)f(matc)m(hes.)67 b(The)39 b(\014lenames)g
+Ft(.)f Fu(and)h Ft(..)f Fu(are)h(alw)m(a)m(ys)150 2711
+y(ignored)33 b(when)e Ft(GLOBIGNORE)f Fu(is)j(set)g(and)f(not)h(n)m
+(ull.)48 b(Ho)m(w)m(ev)m(er,)35 b(setting)f Ft(GLOBIGNORE)c
+Fu(to)j(a)g(non-n)m(ull)150 2821 y(v)-5 b(alue)34 b(has)f(the)h
+(e\013ect)h(of)f(enabling)g(the)g Ft(dotglob)e Fu(shell)h(option,)j(so)
+e(all)g(other)g(\014lenames)g(b)s(eginning)150 2930 y(with)43
+b(a)h(`)p Ft(.)p Fu(')f(will)h(matc)m(h.)80 b(T)-8 b(o)44
+b(get)h(the)e(old)h(b)s(eha)m(vior)f(of)h(ignoring)f(\014lenames)h(b)s
+(eginning)f(with)g(a)150 3040 y(`)p Ft(.)p Fu(',)c(mak)m(e)g(`)p
+Ft(.*)p Fu(')e(one)g(of)g(the)h(patterns)f(in)g Ft(GLOBIGNORE)p
+Fu(.)58 b(The)37 b Ft(dotglob)e Fu(option)j(is)f(disabled)g(when)150
+3150 y Ft(GLOBIGNORE)28 b Fu(is)i(unset.)150 3354 y Fk(3.5.8.1)63
+b(P)m(attern)40 b(Matc)m(hing)150 3501 y Fu(An)m(y)24
+b(c)m(haracter)h(that)f(app)s(ears)f(in)g(a)h(pattern,)i(other)e(than)f
+(the)h(sp)s(ecial)g(pattern)g(c)m(haracters)h(describ)s(ed)150
+3610 y(b)s(elo)m(w,)31 b(matc)m(hes)g(itself.)42 b(The)29
+b Fm(nul)h Fu(c)m(haracter)i(ma)m(y)e(not)h(o)s(ccur)f(in)g(a)h
+(pattern.)40 b(A)31 b(bac)m(kslash)g(escap)s(es)150 3720
+y(the)38 b(follo)m(wing)g(c)m(haracter;)43 b(the)37 b(escaping)i(bac)m
+(kslash)e(is)h(discarded)f(when)f(matc)m(hing.)63 b(The)36
+b(sp)s(ecial)150 3829 y(pattern)30 b(c)m(haracters)i(m)m(ust)f(b)s(e)e
+(quoted)i(if)f(they)h(are)f(to)i(b)s(e)d(matc)m(hed)i(literally)-8
+b(.)275 3969 y(The)29 b(sp)s(ecial)i(pattern)g(c)m(haracters)h(ha)m(v)m
+(e)f(the)g(follo)m(wing)h(meanings:)150 4135 y Ft(*)432
+b Fu(Matc)m(hes)31 b(an)m(y)e(string,)h(including)f(the)g(n)m(ull)g
+(string.)41 b(When)29 b(the)g Ft(globstar)e Fu(shell)i(option)630
+4245 y(is)37 b(enabled,)h(and)e(`)p Ft(*)p Fu(')h(is)g(used)f(in)g(a)h
 (\014lename)g(expansion)g(con)m(text,)j(t)m(w)m(o)e(adjacen)m(t)g(`)p
-Ft(*)p Fu('s)630 3671 y(used)f(as)g(a)h(single)g(pattern)g(will)f(matc)
+Ft(*)p Fu('s)630 4354 y(used)f(as)g(a)h(single)g(pattern)g(will)f(matc)
 m(h)i(all)f(\014les)f(and)g(zero)h(or)g(more)f(directories)i(and)630
-3780 y(sub)s(directories.)g(If)25 b(follo)m(w)m(ed)j(b)m(y)e(a)g(`)p
+4464 y(sub)s(directories.)g(If)25 b(follo)m(w)m(ed)j(b)m(y)e(a)g(`)p
 Ft(/)p Fu(',)h(t)m(w)m(o)g(adjacen)m(t)h(`)p Ft(*)p Fu('s)e(will)g
-(matc)m(h)h(only)f(directories)630 3890 y(and)k(sub)s(directories.)150
-4054 y Ft(?)432 b Fu(Matc)m(hes)32 b(an)m(y)f(single)g(c)m(haracter.)
-150 4217 y Ft([...)o(])241 b Fu(Matc)m(hes)27 b(an)m(y)e(one)g(of)g
+(matc)m(h)h(only)f(directories)630 4573 y(and)k(sub)s(directories.)150
+4737 y Ft(?)432 b Fu(Matc)m(hes)32 b(an)m(y)f(single)g(c)m(haracter.)
+150 4902 y Ft([...)o(])241 b Fu(Matc)m(hes)27 b(an)m(y)e(one)g(of)g
 (the)g(enclosed)g(c)m(haracters.)41 b(A)25 b(pair)f(of)h(c)m(haracters)
-i(separated)e(b)m(y)g(a)630 4327 y(h)m(yphen)k(denotes)i(a)g
+i(separated)e(b)m(y)g(a)630 5011 y(h)m(yphen)k(denotes)i(a)g
 Fr(range)g(expression)p Fu(;)f(an)m(y)h(c)m(haracter)h(that)f(falls)g
-(b)s(et)m(w)m(een)g(those)g(t)m(w)m(o)630 4436 y(c)m(haracters,)d
+(b)s(et)m(w)m(een)g(those)g(t)m(w)m(o)630 5121 y(c)m(haracters,)d
 (inclusiv)m(e,)f(using)d(the)h(curren)m(t)f(lo)s(cale's)j(collating)g
-(sequence)e(and)f(c)m(haracter)630 4546 y(set,)31 b(is)f(matc)m(hed.)42
+(sequence)e(and)f(c)m(haracter)630 5230 y(set,)31 b(is)f(matc)m(hed.)42
 b(If)30 b(the)g(\014rst)g(c)m(haracter)i(follo)m(wing)g(the)e(`)p
 Ft([)p Fu(')h(is)f(a)h(`)p Ft(!)p Fu(')f(or)g(a)h(`)p
-Ft(^)p Fu(')g(then)f(an)m(y)630 4655 y(c)m(haracter)c(not)f(enclosed)g
+Ft(^)p Fu(')g(then)f(an)m(y)630 5340 y(c)m(haracter)c(not)f(enclosed)g
 (is)g(matc)m(hed.)40 b(A)25 b(`)p Fq(\000)p Fu(')f(ma)m(y)i(b)s(e)e
-(matc)m(hed)h(b)m(y)f(including)h(it)g(as)g(the)630 4765
+(matc)m(hed)h(b)m(y)f(including)h(it)g(as)g(the)p eop
+end
+%%Page: 31 37
+TeXDict begin 31 36 bop 150 -116 a Fu(Chapter)30 b(3:)41
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(31)630 299
 y(\014rst)32 b(or)h(last)h(c)m(haracter)h(in)e(the)g(set.)50
 b(A)33 b(`)p Ft(])p Fu(')g(ma)m(y)h(b)s(e)e(matc)m(hed)i(b)m(y)f
-(including)g(it)g(as)h(the)630 4875 y(\014rst)25 b(c)m(haracter)i(in)e
+(including)g(it)g(as)h(the)630 408 y(\014rst)25 b(c)m(haracter)i(in)e
 (the)h(set.)40 b(The)25 b(sorting)h(order)f(of)h(c)m(haracters)h(in)f
-(range)g(expressions)f(is)630 4984 y(determined)h(b)m(y)h(the)g(curren)
-m(t)f(lo)s(cale)j(and)d(the)h(v)-5 b(alues)27 b(of)g(the)g
-Ft(LC_COLLATE)d Fu(and)i Ft(LC_ALL)630 5094 y Fu(shell)31
-b(v)-5 b(ariables,)31 b(if)f(set.)630 5230 y(F)-8 b(or)34
+(range)g(expressions)f(is)630 518 y(determined)h(b)m(y)h(the)g(curren)m
+(t)f(lo)s(cale)j(and)d(the)h(v)-5 b(alues)27 b(of)g(the)g
+Ft(LC_COLLATE)d Fu(and)i Ft(LC_ALL)630 628 y Fu(shell)31
+b(v)-5 b(ariables,)31 b(if)f(set.)630 758 y(F)-8 b(or)34
 b(example,)g(in)f(the)g(default)g(C)f(lo)s(cale,)k(`)p
 Ft([a-dx-z])p Fu(')31 b(is)i(equiv)-5 b(alen)m(t)34 b(to)g(`)p
-Ft([abcdxyz])p Fu('.)630 5340 y(Man)m(y)68 b(lo)s(cales)h(sort)f(c)m
+Ft([abcdxyz])p Fu('.)630 868 y(Man)m(y)68 b(lo)s(cales)h(sort)f(c)m
 (haracters)h(in)e(dictionary)i(order,)76 b(and)67 b(in)g(these)h(lo)s
-(cales)p eop end
-%%Page: 31 37
-TeXDict begin 31 36 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(31)630 299
-y(`)p Ft([a-dx-z])p Fu(')36 b(is)i(t)m(ypically)i(not)e(equiv)-5
-b(alen)m(t)39 b(to)g(`)p Ft([abcdxyz])p Fu(';)g(it)g(migh)m(t)f(b)s(e)f
-(equiv)-5 b(alen)m(t)630 408 y(to)34 b(`)p Ft([aBbCcDdxXyYz])p
-Fu(',)c(for)j(example.)49 b(T)-8 b(o)33 b(obtain)h(the)f(traditional)h
-(in)m(terpretation)h(of)630 518 y(ranges)e(in)f(brac)m(k)m(et)i
-(expressions,)g(y)m(ou)f(can)g(force)g(the)g(use)f(of)h(the)g(C)f(lo)s
-(cale)i(b)m(y)f(setting)630 628 y(the)c Ft(LC_COLLATE)e
-Fu(or)i Ft(LC_ALL)f Fu(en)m(vironmen)m(t)i(v)-5 b(ariable)30
-b(to)g(the)f(v)-5 b(alue)30 b(`)p Ft(C)p Fu(',)g(or)f(enable)h(the)630
-737 y Ft(globasciiranges)c Fu(shell)31 b(option.)630
-874 y(Within)23 b(`)p Ft([)p Fu(')h(and)e(`)p Ft(])p
-Fu(',)j Fr(c)m(haracter)g(classes)j Fu(can)c(b)s(e)e(sp)s(eci\014ed)h
-(using)f(the)i(syn)m(tax)f Ft([:)p Fr(class)t Ft(:])p
-Fu(,)630 983 y(where)30 b Fr(class)35 b Fu(is)30 b(one)h(of)f(the)h
-(follo)m(wing)h(classes)f(de\014ned)e(in)h(the)h Fm(posix)f
-Fu(standard:)870 1119 y Ft(alnum)142 b(alpha)g(ascii)f(blank)h(cntrl)g
-(digit)g(graph)g(lower)870 1229 y(print)g(punct)g(space)f(upper)h(word)
-190 b(xdigit)630 1365 y Fu(A)42 b(c)m(haracter)h(class)f(matc)m(hes)h
-(an)m(y)f(c)m(haracter)h(b)s(elonging)f(to)g(that)g(class.)75
-b(The)41 b Ft(word)630 1475 y Fu(c)m(haracter)32 b(class)f(matc)m(hes)h
+(cales)630 977 y(`)p Ft([a-dx-z])p Fu(')36 b(is)i(t)m(ypically)i(not)e
+(equiv)-5 b(alen)m(t)39 b(to)g(`)p Ft([abcdxyz])p Fu(';)g(it)g(migh)m
+(t)f(b)s(e)f(equiv)-5 b(alen)m(t)630 1087 y(to)34 b(`)p
+Ft([aBbCcDdxXyYz])p Fu(',)c(for)j(example.)49 b(T)-8
+b(o)33 b(obtain)h(the)f(traditional)h(in)m(terpretation)h(of)630
+1196 y(ranges)e(in)f(brac)m(k)m(et)i(expressions,)g(y)m(ou)f(can)g
+(force)g(the)g(use)f(of)h(the)g(C)f(lo)s(cale)i(b)m(y)f(setting)630
+1306 y(the)c Ft(LC_COLLATE)e Fu(or)i Ft(LC_ALL)f Fu(en)m(vironmen)m(t)i
+(v)-5 b(ariable)30 b(to)g(the)f(v)-5 b(alue)30 b(`)p
+Ft(C)p Fu(',)g(or)f(enable)h(the)630 1416 y Ft(globasciiranges)c
+Fu(shell)31 b(option.)630 1546 y(Within)23 b(`)p Ft([)p
+Fu(')h(and)e(`)p Ft(])p Fu(',)j Fr(c)m(haracter)g(classes)j
+Fu(can)c(b)s(e)e(sp)s(eci\014ed)h(using)f(the)i(syn)m(tax)f
+Ft([:)p Fr(class)t Ft(:])p Fu(,)630 1656 y(where)30 b
+Fr(class)35 b Fu(is)30 b(one)h(of)f(the)h(follo)m(wing)h(classes)f
+(de\014ned)e(in)h(the)h Fm(posix)f Fu(standard:)870 1786
+y Ft(alnum)142 b(alpha)g(ascii)f(blank)h(cntrl)g(digit)g(graph)g(lower)
+870 1896 y(print)g(punct)g(space)f(upper)h(word)190 b(xdigit)630
+2026 y Fu(A)42 b(c)m(haracter)h(class)f(matc)m(hes)h(an)m(y)f(c)m
+(haracter)h(b)s(elonging)f(to)g(that)g(class.)75 b(The)41
+b Ft(word)630 2135 y Fu(c)m(haracter)32 b(class)f(matc)m(hes)h
 (letters,)f(digits,)h(and)d(the)i(c)m(haracter)h(`)p
-Ft(_)p Fu('.)630 1611 y(Within)25 b(`)p Ft([)p Fu(')f(and)g(`)p
+Ft(_)p Fu('.)630 2266 y(Within)25 b(`)p Ft([)p Fu(')f(and)g(`)p
 Ft(])p Fu(',)i(an)e Fr(equiv)-5 b(alence)26 b(class)j
 Fu(can)24 b(b)s(e)g(sp)s(eci\014ed)g(using)g(the)g(syn)m(tax)h
-Ft([=)p Fr(c)6 b Ft(=])p Fu(,)630 1721 y(whic)m(h)29
+Ft([=)p Fr(c)6 b Ft(=])p Fu(,)630 2375 y(whic)m(h)29
 b(matc)m(hes)i(all)f(c)m(haracters)h(with)e(the)h(same)g(collation)h(w)
-m(eigh)m(t)g(\(as)f(de\014ned)e(b)m(y)i(the)630 1830
+m(eigh)m(t)g(\(as)f(de\014ned)e(b)m(y)i(the)630 2485
 y(curren)m(t)g(lo)s(cale\))j(as)d(the)h(c)m(haracter)h
-Fr(c)p Fu(.)630 1967 y(Within)22 b(`)p Ft([)p Fu(')f(and)g(`)p
+Fr(c)p Fu(.)630 2615 y(Within)22 b(`)p Ft([)p Fu(')f(and)g(`)p
 Ft(])p Fu(',)j(the)d(syn)m(tax)h Ft([.)p Fr(sym)m(b)s(ol)t
 Ft(.])e Fu(matc)m(hes)i(the)g(collating)i(sym)m(b)s(ol)d
-Fr(sym)m(b)s(ol)p Fu(.)275 2132 y(If)29 b(the)g Ft(extglob)f
+Fr(sym)m(b)s(ol)p Fu(.)275 2767 y(If)29 b(the)g Ft(extglob)f
 Fu(shell)h(option)h(is)g(enabled)f(using)g(the)h Ft(shopt)e
-Fu(builtin,)h(sev)m(eral)i(extended)f(pattern)150 2241
+Fu(builtin,)h(sev)m(eral)i(extended)f(pattern)150 2876
 y(matc)m(hing)37 b(op)s(erators)e(are)h(recognized.)58
 b(In)35 b(the)g(follo)m(wing)i(description,)g(a)f Fr(pattern-list)j
-Fu(is)d(a)g(list)g(of)150 2351 y(one)d(or)f(more)h(patterns)f
+Fu(is)d(a)g(list)g(of)150 2986 y(one)d(or)f(more)h(patterns)f
 (separated)h(b)m(y)f(a)h(`)p Ft(|)p Fu('.)47 b(Comp)s(osite)33
 b(patterns)f(ma)m(y)i(b)s(e)d(formed)h(using)g(one)h(or)150
-2460 y(more)e(of)f(the)h(follo)m(wing)g(sub-patterns:)150
-2625 y Ft(?\()p Fj(pattern-list)p Ft(\))630 2735 y Fu(Matc)m(hes)h
+3095 y(more)e(of)f(the)h(follo)m(wing)g(sub-patterns:)150
+3247 y Ft(?\()p Fj(pattern-list)p Ft(\))630 3356 y Fu(Matc)m(hes)h
 (zero)f(or)g(one)f(o)s(ccurrence)h(of)f(the)h(giv)m(en)g(patterns.)150
-2898 y Ft(*\()p Fj(pattern-list)p Ft(\))630 3008 y Fu(Matc)m(hes)h
+3507 y Ft(*\()p Fj(pattern-list)p Ft(\))630 3617 y Fu(Matc)m(hes)h
 (zero)f(or)g(more)f(o)s(ccurrences)h(of)f(the)h(giv)m(en)g(patterns.)
-150 3171 y Ft(+\()p Fj(pattern-list)p Ft(\))630 3280
+150 3768 y Ft(+\()p Fj(pattern-list)p Ft(\))630 3878
 y Fu(Matc)m(hes)h(one)f(or)f(more)h(o)s(ccurrences)f(of)h(the)f(giv)m
-(en)i(patterns.)150 3443 y Ft(@\()p Fj(pattern-list)p
-Ft(\))630 3553 y Fu(Matc)m(hes)g(one)f(of)f(the)h(giv)m(en)g(patterns.)
-150 3716 y Ft(!\()p Fj(pattern-list)p Ft(\))630 3826
+(en)i(patterns.)150 4029 y Ft(@\()p Fj(pattern-list)p
+Ft(\))630 4138 y Fu(Matc)m(hes)g(one)f(of)f(the)h(giv)m(en)g(patterns.)
+150 4290 y Ft(!\()p Fj(pattern-list)p Ft(\))630 4399
 y Fu(Matc)m(hes)h(an)m(ything)f(except)g(one)g(of)f(the)h(giv)m(en)g
-(patterns.)150 4029 y Fk(3.5.9)63 b(Quote)41 b(Remo)m(v)-7
-b(al)150 4175 y Fu(After)32 b(the)g(preceding)g(expansions,)h(all)f
+(patterns.)150 4590 y Fk(3.5.9)63 b(Quote)41 b(Remo)m(v)-7
+b(al)150 4737 y Fu(After)32 b(the)g(preceding)g(expansions,)h(all)f
 (unquoted)f(o)s(ccurrences)h(of)g(the)h(c)m(haracters)g(`)p
 Ft(\\)p Fu(',)g(`)p Ft(')p Fu(',)f(and)g(`)p Ft(")p Fu(')150
-4285 y(that)f(did)f(not)g(result)g(from)g(one)h(of)g(the)f(ab)s(o)m(v)m
-(e)i(expansions)e(are)h(remo)m(v)m(ed.)150 4523 y Fs(3.6)68
-b(Redirections)150 4682 y Fu(Before)32 b(a)f(command)f(is)h(executed,)h
+4847 y(that)f(did)f(not)g(result)g(from)g(one)h(of)g(the)f(ab)s(o)m(v)m
+(e)i(expansions)e(are)h(remo)m(v)m(ed.)150 5071 y Fs(3.6)68
+b(Redirections)150 5230 y Fu(Before)32 b(a)f(command)f(is)h(executed,)h
 (its)f(input)e(and)h(output)h(ma)m(y)g(b)s(e)f Fr(redirected)k
-Fu(using)c(a)i(sp)s(ecial)f(no-)150 4792 y(tation)d(in)m(terpreted)f(b)
+Fu(using)c(a)i(sp)s(ecial)f(no-)150 5340 y(tation)d(in)m(terpreted)f(b)
 m(y)f(the)h(shell.)40 b(Redirection)27 b(allo)m(ws)h(commands')f
-(\014le)f(handles)g(to)i(b)s(e)e(duplicated,)150 4902
-y(op)s(ened,)i(closed,)i(made)e(to)h(refer)f(to)h(di\013eren)m(t)f
+(\014le)f(handles)g(to)i(b)s(e)e(duplicated,)p eop end
+%%Page: 32 38
+TeXDict begin 32 37 bop 150 -116 a Fu(Chapter)30 b(3:)41
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(32)150 299
+y(op)s(ened,)28 b(closed,)i(made)e(to)h(refer)f(to)h(di\013eren)m(t)f
 (\014les,)h(and)f(can)g(c)m(hange)h(the)g(\014les)f(the)g(command)g
-(reads)150 5011 y(from)39 b(and)g(writes)h(to.)69 b(Redirection)40
+(reads)150 408 y(from)39 b(and)g(writes)h(to.)69 b(Redirection)40
 b(ma)m(y)g(also)h(b)s(e)e(used)g(to)h(mo)s(dify)f(\014le)g(handles)g
-(in)g(the)h(curren)m(t)150 5121 y(shell)e(execution)h(en)m(vironmen)m
+(in)g(the)h(curren)m(t)150 518 y(shell)e(execution)h(en)m(vironmen)m
 (t.)65 b(The)37 b(follo)m(wing)j(redirection)f(op)s(erators)f(ma)m(y)g
-(precede)h(or)f(app)s(ear)150 5230 y(an)m(ywhere)30 b(within)f(a)h
+(precede)h(or)f(app)s(ear)150 628 y(an)m(ywhere)30 b(within)f(a)h
 (simple)f(command)h(or)f(ma)m(y)i(follo)m(w)g(a)f(command.)40
-b(Redirections)30 b(are)g(pro)s(cessed)150 5340 y(in)g(the)h(order)f
-(they)g(app)s(ear,)g(from)g(left)h(to)g(righ)m(t.)p eop
-end
-%%Page: 32 38
-TeXDict begin 32 37 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(32)275 299
-y(Eac)m(h)45 b(redirection)h(that)f(ma)m(y)h(b)s(e)e(preceded)g(b)m(y)h
-(a)h(\014le)f(descriptor)f(n)m(um)m(b)s(er)g(ma)m(y)h(instead)h(b)s(e)
-150 408 y(preceded)41 b(b)m(y)g(a)h(w)m(ord)f(of)g(the)h(form)f
+b(Redirections)30 b(are)g(pro)s(cessed)150 737 y(in)g(the)h(order)f
+(they)g(app)s(ear,)g(from)g(left)h(to)g(righ)m(t.)275
+880 y(Eac)m(h)45 b(redirection)h(that)f(ma)m(y)h(b)s(e)e(preceded)g(b)m
+(y)h(a)h(\014le)f(descriptor)f(n)m(um)m(b)s(er)g(ma)m(y)h(instead)h(b)s
+(e)150 990 y(preceded)41 b(b)m(y)g(a)h(w)m(ord)f(of)g(the)h(form)f
 Fi({)p Fr(v)-5 b(arname)5 b Fi(})p Fu(.)74 b(In)41 b(this)g(case,)k
-(for)c(eac)m(h)i(redirection)f(op)s(erator)150 518 y(except)30
+(for)c(eac)m(h)i(redirection)f(op)s(erator)150 1100 y(except)30
 b Ft(>)p Fu(&-)f(and)f Ft(<)p Fu(&-,)h(the)g(shell)g(will)h(allo)s
 (cate)h(a)e(\014le)h(descriptor)e(greater)j(than)d(10)i(and)e(assign)i
-(it)f(to)150 628 y Fi({)p Fr(v)-5 b(arname)5 b Fi(})p
+(it)f(to)150 1209 y Fi({)p Fr(v)-5 b(arname)5 b Fi(})p
 Fu(.)45 b(If)31 b Ft(>)p Fu(&-)g(or)h Ft(<)p Fu(&-)f(is)h(preceded)f(b)
 m(y)g Fi({)p Fr(v)-5 b(arname)5 b Fi(})p Fu(,)33 b(the)f(v)-5
 b(alue)32 b(of)g Fr(v)-5 b(arname)36 b Fu(de\014nes)31
-b(the)h(\014le)150 737 y(descriptor)e(to)h(close.)275
-890 y(In)c(the)i(follo)m(wing)h(descriptions,)g(if)e(the)h(\014le)g
+b(the)h(\014le)150 1319 y(descriptor)e(to)h(close.)275
+1462 y(In)c(the)i(follo)m(wing)h(descriptions,)g(if)e(the)h(\014le)g
 (descriptor)f(n)m(um)m(b)s(er)g(is)g(omitted,)i(and)f(the)f(\014rst)g
-(c)m(har-)150 999 y(acter)42 b(of)f(the)g(redirection)g(op)s(erator)g
+(c)m(har-)150 1572 y(acter)42 b(of)f(the)g(redirection)g(op)s(erator)g
 (is)g(`)p Ft(<)p Fu(',)i(the)e(redirection)g(refers)g(to)g(the)g
-(standard)f(input)f(\(\014le)150 1109 y(descriptor)33
+(standard)f(input)f(\(\014le)150 1681 y(descriptor)33
 b(0\).)49 b(If)33 b(the)g(\014rst)f(c)m(haracter)i(of)g(the)f
 (redirection)g(op)s(erator)h(is)f(`)p Ft(>)p Fu(',)h(the)f(redirection)
-g(refers)150 1218 y(to)e(the)g(standard)e(output)h(\(\014le)h
-(descriptor)f(1\).)275 1371 y(The)h(w)m(ord)h(follo)m(wing)i(the)f
+g(refers)150 1791 y(to)e(the)g(standard)e(output)h(\(\014le)h
+(descriptor)f(1\).)275 1934 y(The)h(w)m(ord)h(follo)m(wing)i(the)f
 (redirection)g(op)s(erator)f(in)g(the)h(follo)m(wing)h(descriptions,)f
-(unless)e(other-)150 1480 y(wise)21 b(noted,)i(is)e(sub)5
+(unless)e(other-)150 2043 y(wise)21 b(noted,)i(is)e(sub)5
 b(jected)21 b(to)h(brace)f(expansion,)i(tilde)f(expansion,)h(parameter)
-e(expansion,)i(command)150 1590 y(substitution,)31 b(arithmetic)h
+e(expansion,)i(command)150 2153 y(substitution,)31 b(arithmetic)h
 (expansion,)f(quote)h(remo)m(v)-5 b(al,)33 b(\014lename)e(expansion,)g
-(and)f(w)m(ord)h(splitting.)150 1700 y(If)f(it)h(expands)e(to)i(more)g
+(and)f(w)m(ord)h(splitting.)150 2263 y(If)f(it)h(expands)e(to)i(more)g
 (than)f(one)h(w)m(ord,)f(Bash)h(rep)s(orts)e(an)h(error.)275
-1852 y(Note)h(that)g(the)g(order)f(of)g(redirections)h(is)g
+2406 y(Note)h(that)g(the)g(order)f(of)g(redirections)h(is)g
 (signi\014can)m(t.)41 b(F)-8 b(or)31 b(example,)h(the)e(command)390
-2004 y Ft(ls)47 b(>)h Fj(dirlist)d Ft(2>&1)150 2157 y
+2549 y Ft(ls)47 b(>)h Fj(dirlist)d Ft(2>&1)150 2692 y
 Fu(directs)28 b(b)s(oth)f(standard)g(output)g(\(\014le)h(descriptor)f
 (1\))i(and)e(standard)f(error)i(\(\014le)g(descriptor)f(2\))h(to)h(the)
-150 2266 y(\014le)h Fr(dirlist)p Fu(,)h(while)f(the)h(command)390
-2419 y Ft(ls)47 b(2>&1)g(>)g Fj(dirlist)150 2571 y Fu(directs)28
+150 2802 y(\014le)h Fr(dirlist)p Fu(,)h(while)f(the)h(command)390
+2945 y Ft(ls)47 b(2>&1)g(>)g Fj(dirlist)150 3088 y Fu(directs)28
 b(only)f(the)h(standard)e(output)i(to)g(\014le)f Fr(dirlist)p
 Fu(,)h(b)s(ecause)g(the)f(standard)g(error)g(w)m(as)h(made)f(a)h(cop)m
-(y)150 2681 y(of)j(the)f(standard)g(output)g(b)s(efore)g(the)g
+(y)150 3198 y(of)j(the)f(standard)g(output)g(b)s(efore)g(the)g
 (standard)g(output)g(w)m(as)g(redirected)h(to)g Fr(dirlist)p
-Fu(.)275 2833 y(Bash)26 b(handles)f(sev)m(eral)j(\014lenames)e(sp)s
+Fu(.)275 3341 y(Bash)26 b(handles)f(sev)m(eral)j(\014lenames)e(sp)s
 (ecially)h(when)f(they)g(are)g(used)g(in)g(redirections,)i(as)e
-(describ)s(ed)150 2942 y(in)k(the)h(follo)m(wing)g(table:)150
-3129 y Ft(/dev/fd/)p Fj(fd)630 3238 y Fu(If)f Fr(fd)j
+(describ)s(ed)150 3450 y(in)k(the)h(follo)m(wing)g(table:)150
+3623 y Ft(/dev/fd/)p Fj(fd)630 3732 y Fu(If)f Fr(fd)j
 Fu(is)d(a)h(v)-5 b(alid)31 b(in)m(teger,)h(\014le)e(descriptor)h
-Fr(fd)i Fu(is)d(duplicated.)150 3416 y Ft(/dev/stdin)630
-3525 y Fu(File)i(descriptor)e(0)h(is)f(duplicated.)150
-3702 y Ft(/dev/stdout)630 3812 y Fu(File)i(descriptor)e(1)h(is)f
-(duplicated.)150 3989 y Ft(/dev/stderr)630 4099 y Fu(File)i(descriptor)
-e(2)h(is)f(duplicated.)150 4276 y Ft(/dev/tcp/)p Fj(host)p
-Ft(/)p Fj(port)630 4386 y Fu(If)41 b Fr(host)i Fu(is)f(a)g(v)-5
+Fr(fd)i Fu(is)d(duplicated.)150 3901 y Ft(/dev/stdin)630
+4010 y Fu(File)i(descriptor)e(0)h(is)f(duplicated.)150
+4178 y Ft(/dev/stdout)630 4288 y Fu(File)i(descriptor)e(1)h(is)f
+(duplicated.)150 4456 y Ft(/dev/stderr)630 4565 y Fu(File)i(descriptor)
+e(2)h(is)f(duplicated.)150 4734 y Ft(/dev/tcp/)p Fj(host)p
+Ft(/)p Fj(port)630 4843 y Fu(If)41 b Fr(host)i Fu(is)f(a)g(v)-5
 b(alid)41 b(hostname)h(or)f(In)m(ternet)h(address,)i(and)c
-Fr(p)s(ort)j Fu(is)f(an)f(in)m(teger)i(p)s(ort)630 4495
+Fr(p)s(ort)j Fu(is)f(an)f(in)m(teger)i(p)s(ort)630 4953
 y(n)m(um)m(b)s(er)23 b(or)i(service)h(name,)g(Bash)f(attempts)h(to)f
 (op)s(en)f(the)h(corresp)s(onding)f(TCP)g(so)s(c)m(k)m(et.)150
-4673 y Ft(/dev/udp/)p Fj(host)p Ft(/)p Fj(port)630 4782
+5121 y Ft(/dev/udp/)p Fj(host)p Ft(/)p Fj(port)630 5230
 y Fu(If)41 b Fr(host)i Fu(is)f(a)g(v)-5 b(alid)41 b(hostname)h(or)f(In)
 m(ternet)h(address,)i(and)c Fr(p)s(ort)j Fu(is)f(an)f(in)m(teger)i(p)s
-(ort)630 4892 y(n)m(um)m(b)s(er)23 b(or)h(service)h(name,)h(Bash)e
+(ort)630 5340 y(n)m(um)m(b)s(er)23 b(or)h(service)h(name,)h(Bash)e
 (attempts)h(to)g(op)s(en)f(the)g(corresp)s(onding)f(UDP)i(so)s(c)m(k)m
-(et.)275 5078 y(A)30 b(failure)h(to)g(op)s(en)e(or)i(create)h(a)e
-(\014le)h(causes)g(the)f(redirection)h(to)g(fail.)275
-5230 y(Redirections)f(using)e(\014le)i(descriptors)f(greater)h(than)f
-(9)h(should)e(b)s(e)h(used)f(with)h(care,)h(as)g(they)f(ma)m(y)150
-5340 y(con\015ict)i(with)f(\014le)h(descriptors)f(the)g(shell)h(uses)f
-(in)m(ternally)-8 b(.)p eop end
+(et.)p eop end
 %%Page: 33 39
 TeXDict begin 33 38 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(33)150 299
-y Fk(3.6.1)63 b(Redirecting)40 b(Input)150 446 y Fu(Redirection)35
-b(of)f(input)f(causes)i(the)f(\014le)g(whose)g(name)g(results)g(from)g
-(the)g(expansion)g(of)g Fr(w)m(ord)k Fu(to)d(b)s(e)150
-555 y(op)s(ened)d(for)g(reading)g(on)g(\014le)h(descriptor)f
-Ft(n)p Fu(,)h(or)f(the)g(standard)g(input)f(\(\014le)i(descriptor)f
-(0\))h(if)f Ft(n)g Fu(is)h(not)150 665 y(sp)s(eci\014ed.)275
-798 y(The)c(general)j(format)e(for)h(redirecting)g(input)e(is:)390
-930 y Ft([)p Fj(n)p Ft(]<)p Fj(word)150 1126 y Fk(3.6.2)63
-b(Redirecting)40 b(Output)150 1273 y Fu(Redirection)31
-b(of)g(output)f(causes)h(the)f(\014le)h(whose)f(name)g(results)h(from)e
-(the)i(expansion)f(of)h Fr(w)m(ord)i Fu(to)f(b)s(e)150
-1382 y(op)s(ened)d(for)g(writing)g(on)g(\014le)h(descriptor)f
-Fr(n)p Fu(,)g(or)g(the)h(standard)e(output)h(\(\014le)h(descriptor)f
-(1\))h(if)g Fr(n)e Fu(is)i(not)150 1492 y(sp)s(eci\014ed.)40
-b(If)30 b(the)g(\014le)h(do)s(es)f(not)h(exist)g(it)g(is)f(created;)i
-(if)e(it)h(do)s(es)f(exist)h(it)g(is)g(truncated)f(to)h(zero)g(size.)
-275 1625 y(The)e(general)j(format)e(for)h(redirecting)g(output)f(is:)
-390 1757 y Ft([)p Fj(n)p Ft(]>[|])p Fj(word)275 1890
-y Fu(If)g(the)h(redirection)g(op)s(erator)g(is)g(`)p
-Ft(>)p Fu(',)g(and)f(the)h Ft(noclobber)d Fu(option)j(to)g(the)g
-Ft(set)f Fu(builtin)g(has)h(b)s(een)150 2000 y(enabled,)h(the)g
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(33)275 299
+y(A)30 b(failure)h(to)g(op)s(en)e(or)i(create)h(a)e(\014le)h(causes)g
+(the)f(redirection)h(to)g(fail.)275 439 y(Redirections)f(using)e
+(\014le)i(descriptors)f(greater)h(than)f(9)h(should)e(b)s(e)h(used)f
+(with)h(care,)h(as)g(they)f(ma)m(y)150 548 y(con\015ict)i(with)f
+(\014le)h(descriptors)f(the)g(shell)h(uses)f(in)m(ternally)-8
+b(.)150 753 y Fk(3.6.1)63 b(Redirecting)40 b(Input)150
+900 y Fu(Redirection)35 b(of)f(input)f(causes)i(the)f(\014le)g(whose)g
+(name)g(results)g(from)g(the)g(expansion)g(of)g Fr(w)m(ord)k
+Fu(to)d(b)s(e)150 1010 y(op)s(ened)d(for)g(reading)g(on)g(\014le)h
+(descriptor)f Ft(n)p Fu(,)h(or)f(the)g(standard)g(input)f(\(\014le)i
+(descriptor)f(0\))h(if)f Ft(n)g Fu(is)h(not)150 1119
+y(sp)s(eci\014ed.)275 1259 y(The)c(general)j(format)e(for)h
+(redirecting)g(input)e(is:)390 1399 y Ft([)p Fj(n)p Ft(]<)p
+Fj(word)150 1604 y Fk(3.6.2)63 b(Redirecting)40 b(Output)150
+1751 y Fu(Redirection)31 b(of)g(output)f(causes)h(the)f(\014le)h(whose)
+f(name)g(results)h(from)e(the)i(expansion)f(of)h Fr(w)m(ord)i
+Fu(to)f(b)s(e)150 1861 y(op)s(ened)d(for)g(writing)g(on)g(\014le)h
+(descriptor)f Fr(n)p Fu(,)g(or)g(the)h(standard)e(output)h(\(\014le)h
+(descriptor)f(1\))h(if)g Fr(n)e Fu(is)i(not)150 1970
+y(sp)s(eci\014ed.)40 b(If)30 b(the)g(\014le)h(do)s(es)f(not)h(exist)g
+(it)g(is)f(created;)i(if)e(it)h(do)s(es)f(exist)h(it)g(is)g(truncated)f
+(to)h(zero)g(size.)275 2110 y(The)e(general)j(format)e(for)h
+(redirecting)g(output)f(is:)390 2250 y Ft([)p Fj(n)p
+Ft(]>[|])p Fj(word)275 2390 y Fu(If)g(the)h(redirection)g(op)s(erator)g
+(is)g(`)p Ft(>)p Fu(',)g(and)f(the)h Ft(noclobber)d Fu(option)j(to)g
+(the)g Ft(set)f Fu(builtin)g(has)h(b)s(een)150 2500 y(enabled,)h(the)g
 (redirection)h(will)f(fail)h(if)e(the)i(\014le)e(whose)h(name)g
 (results)g(from)f(the)h(expansion)g(of)g Fr(w)m(ord)150
-2109 y Fu(exists)f(and)f(is)g(a)h(regular)g(\014le.)41
+2609 y Fu(exists)f(and)f(is)g(a)h(regular)g(\014le.)41
 b(If)30 b(the)h(redirection)g(op)s(erator)g(is)f(`)p
 Ft(>|)p Fu(',)h(or)f(the)h(redirection)g(op)s(erator)g(is)150
-2219 y(`)p Ft(>)p Fu(')36 b(and)f(the)g Ft(noclobber)e
+2719 y(`)p Ft(>)p Fu(')36 b(and)f(the)g Ft(noclobber)e
 Fu(option)j(is)g(not)g(enabled,)h(the)e(redirection)h(is)g(attempted)g
-(ev)m(en)h(if)e(the)h(\014le)150 2328 y(named)30 b(b)m(y)g
-Fr(w)m(ord)k Fu(exists.)150 2524 y Fk(3.6.3)63 b(App)s(ending)42
-b(Redirected)e(Output)150 2671 y Fu(Redirection)23 b(of)e(output)h(in)f
+(ev)m(en)h(if)e(the)h(\014le)150 2829 y(named)30 b(b)m(y)g
+Fr(w)m(ord)k Fu(exists.)150 3033 y Fk(3.6.3)63 b(App)s(ending)42
+b(Redirected)e(Output)150 3180 y Fu(Redirection)23 b(of)e(output)h(in)f
 (this)h(fashion)f(causes)h(the)g(\014le)g(whose)f(name)h(results)f
-(from)g(the)h(expansion)g(of)150 2780 y Fr(w)m(ord)28
+(from)g(the)h(expansion)g(of)150 3290 y Fr(w)m(ord)28
 b Fu(to)e(b)s(e)e(op)s(ened)g(for)h(app)s(ending)e(on)i(\014le)g
 (descriptor)g Fr(n)p Fu(,)g(or)g(the)g(standard)f(output)h(\(\014le)g
-(descriptor)150 2890 y(1\))31 b(if)f Fr(n)g Fu(is)h(not)f(sp)s
+(descriptor)150 3399 y(1\))31 b(if)f Fr(n)g Fu(is)h(not)f(sp)s
 (eci\014ed.)40 b(If)30 b(the)h(\014le)f(do)s(es)g(not)h(exist)g(it)g
-(is)f(created.)275 3023 y(The)f(general)j(format)e(for)h(app)s(ending)e
-(output)h(is:)390 3155 y Ft([)p Fj(n)p Ft(]>>)p Fj(word)150
-3351 y Fk(3.6.4)63 b(Redirecting)40 b(Standard)h(Output)g(and)g
-(Standard)g(Error)150 3498 y Fu(This)33 b(construct)i(allo)m(ws)g(b)s
+(is)f(created.)275 3539 y(The)f(general)j(format)e(for)h(app)s(ending)e
+(output)h(is:)390 3679 y Ft([)p Fj(n)p Ft(]>>)p Fj(word)150
+3884 y Fk(3.6.4)63 b(Redirecting)40 b(Standard)h(Output)g(and)g
+(Standard)g(Error)150 4031 y Fu(This)33 b(construct)i(allo)m(ws)g(b)s
 (oth)f(the)g(standard)g(output)f(\(\014le)i(descriptor)f(1\))h(and)f
-(the)g(standard)f(error)150 3607 y(output)d(\(\014le)h(descriptor)f
+(the)g(standard)f(error)150 4141 y(output)d(\(\014le)h(descriptor)f
 (2\))h(to)g(b)s(e)f(redirected)h(to)g(the)f(\014le)h(whose)f(name)h(is)
-f(the)g(expansion)h(of)f Fr(w)m(ord)p Fu(.)275 3740 y(There)f(are)i(t)m
+f(the)g(expansion)h(of)f Fr(w)m(ord)p Fu(.)275 4281 y(There)f(are)i(t)m
 (w)m(o)h(formats)e(for)h(redirecting)g(standard)e(output)h(and)g
-(standard)f(error:)390 3873 y Ft(&>)p Fj(word)150 4005
-y Fu(and)390 4138 y Ft(>&)p Fj(word)150 4271 y Fu(Of)h(the)g(t)m(w)m(o)
+(standard)f(error:)390 4421 y Ft(&>)p Fj(word)150 4561
+y Fu(and)390 4701 y Ft(>&)p Fj(word)150 4841 y Fu(Of)h(the)g(t)m(w)m(o)
 i(forms,)e(the)h(\014rst)e(is)i(preferred.)39 b(This)30
 b(is)g(seman)m(tically)j(equiv)-5 b(alen)m(t)32 b(to)390
-4403 y Ft(>)p Fj(word)46 b Ft(2>&1)275 4536 y Fu(When)41
+4981 y Ft(>)p Fj(word)46 b Ft(2>&1)275 5121 y Fu(When)41
 b(using)g(the)h(second)f(form,)k Fr(w)m(ord)f Fu(ma)m(y)e(not)g(expand)
 f(to)h(a)g(n)m(um)m(b)s(er)f(or)g(`)p Ft(-)p Fu('.)75
-b(If)41 b(it)h(do)s(es,)150 4646 y(other)27 b(redirection)g(op)s
+b(If)41 b(it)h(do)s(es,)150 5230 y(other)27 b(redirection)g(op)s
 (erators)f(apply)h(\(see)g(Duplicating)h(File)f(Descriptors)h(b)s(elo)m
-(w\))f(for)f(compatibilit)m(y)150 4755 y(reasons.)150
-4951 y Fk(3.6.5)63 b(App)s(ending)42 b(Standard)f(Output)g(and)g
-(Standard)g(Error)150 5098 y Fu(This)33 b(construct)i(allo)m(ws)g(b)s
-(oth)f(the)g(standard)g(output)f(\(\014le)i(descriptor)f(1\))h(and)f
-(the)g(standard)f(error)150 5207 y(output)d(\(\014le)h(descriptor)f
-(2\))h(to)g(b)s(e)f(app)s(ended)f(to)i(the)f(\014le)h(whose)f(name)g
-(is)h(the)f(expansion)h(of)f Fr(w)m(ord)p Fu(.)275 5340
-y(The)f(format)i(for)f(app)s(ending)f(standard)h(output)g(and)f
-(standard)h(error)g(is:)p eop end
+(w\))f(for)f(compatibilit)m(y)150 5340 y(reasons.)p eop
+end
 %%Page: 34 40
 TeXDict begin 34 39 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(34)390 299
-y Ft(&>>)p Fj(word)150 436 y Fu(This)30 b(is)g(seman)m(tically)j(equiv)
--5 b(alen)m(t)32 b(to)390 572 y Ft(>>)p Fj(word)46 b
-Ft(2>&1)275 709 y Fu(\(see)31 b(Duplicating)h(File)f(Descriptors)g(b)s
-(elo)m(w\).)150 910 y Fk(3.6.6)63 b(Here)41 b(Do)s(cumen)m(ts)150
-1057 y Fu(This)c(t)m(yp)s(e)h(of)f(redirection)i(instructs)e(the)h
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(34)150 299
+y Fk(3.6.5)63 b(App)s(ending)42 b(Standard)f(Output)g(and)g(Standard)g
+(Error)150 446 y Fu(This)33 b(construct)i(allo)m(ws)g(b)s(oth)f(the)g
+(standard)g(output)f(\(\014le)i(descriptor)f(1\))h(and)f(the)g
+(standard)f(error)150 555 y(output)d(\(\014le)h(descriptor)f(2\))h(to)g
+(b)s(e)f(app)s(ended)f(to)i(the)f(\014le)h(whose)f(name)g(is)h(the)f
+(expansion)h(of)f Fr(w)m(ord)p Fu(.)275 684 y(The)f(format)i(for)f(app)
+s(ending)f(standard)h(output)g(and)f(standard)h(error)g(is:)390
+813 y Ft(&>>)p Fj(word)150 942 y Fu(This)g(is)g(seman)m(tically)j
+(equiv)-5 b(alen)m(t)32 b(to)390 1071 y Ft(>>)p Fj(word)46
+b Ft(2>&1)275 1200 y Fu(\(see)31 b(Duplicating)h(File)f(Descriptors)g
+(b)s(elo)m(w\).)150 1389 y Fk(3.6.6)63 b(Here)41 b(Do)s(cumen)m(ts)150
+1536 y Fu(This)c(t)m(yp)s(e)h(of)f(redirection)i(instructs)e(the)h
 (shell)f(to)i(read)e(input)g(from)g(the)h(curren)m(t)f(source)h(un)m
-(til)g(a)150 1167 y(line)31 b(con)m(taining)g(only)g
+(til)g(a)150 1645 y(line)31 b(con)m(taining)g(only)g
 Fr(w)m(ord)i Fu(\(with)d(no)h(trailing)g(blanks\))f(is)g(seen.)41
 b(All)31 b(of)f(the)h(lines)f(read)g(up)f(to)i(that)150
-1277 y(p)s(oin)m(t)f(are)h(then)f(used)g(as)g(the)h(standard)f(input)f
-(for)h(a)h(command.)275 1413 y(The)e(format)i(of)g(here-do)s(cumen)m
-(ts)f(is:)390 1550 y Ft(<<[)p Fq(\000)p Ft(])p Fj(word)772
-1660 y(here-document)390 1769 y(delimiter)275 1906 y
+1755 y(p)s(oin)m(t)f(are)h(then)f(used)g(as)g(the)h(standard)f(input)f
+(for)h(a)h(command.)275 1884 y(The)e(format)i(of)g(here-do)s(cumen)m
+(ts)f(is:)390 2013 y Ft(<<[)p Fq(\000)p Ft(])p Fj(word)772
+2123 y(here-document)390 2232 y(delimiter)275 2361 y
 Fu(No)i(parameter)h(and)f(v)-5 b(ariable)32 b(expansion,)h(command)f
-(substitution,)h(arithmetic)g(expansion,)g(or)150 2015
+(substitution,)h(arithmetic)g(expansion,)g(or)150 2471
 y(\014lename)38 b(expansion)g(is)g(p)s(erformed)e(on)i
 Fr(w)m(ord)p Fu(.)62 b(If)38 b(an)m(y)g(c)m(haracters)h(in)e
-Fr(w)m(ord)42 b Fu(are)c(quoted,)i(the)e Fr(de-)150 2125
+Fr(w)m(ord)42 b Fu(are)c(quoted,)i(the)e Fr(de-)150 2580
 y(limiter)h Fu(is)32 b(the)h(result)f(of)g(quote)h(remo)m(v)-5
 b(al)33 b(on)f Fr(w)m(ord)p Fu(,)g(and)g(the)g(lines)g(in)g(the)g
-(here-do)s(cumen)m(t)g(are)h(not)150 2235 y(expanded.)71
+(here-do)s(cumen)m(t)g(are)h(not)150 2690 y(expanded.)71
 b(If)40 b Fr(w)m(ord)k Fu(is)d(unquoted,)h(all)g(lines)f(of)g(the)f
 (here-do)s(cumen)m(t)h(are)g(sub)5 b(jected)41 b(to)g(param-)150
-2344 y(eter)c(expansion,)i(command)d(substitution,)i(and)e(arithmetic)i
-(expansion,)g(the)f(c)m(haracter)i(sequence)150 2454
+2800 y(eter)c(expansion,)i(command)d(substitution,)i(and)e(arithmetic)i
+(expansion,)g(the)f(c)m(haracter)i(sequence)150 2909
 y Ft(\\newline)28 b Fu(is)j(ignored,)f(and)g(`)p Ft(\\)p
 Fu(')h(m)m(ust)f(b)s(e)g(used)f(to)i(quote)g(the)g(c)m(haracters)h(`)p
 Ft(\\)p Fu(',)e(`)p Ft($)p Fu(',)h(and)f(`)p Ft(`)p Fu('.)275
-2590 y(If)21 b(the)i(redirection)g(op)s(erator)g(is)f(`)p
+3038 y(If)21 b(the)i(redirection)g(op)s(erator)g(is)f(`)p
 Ft(<<-)p Fu(',)i(then)e(all)h(leading)g(tab)g(c)m(haracters)h(are)e
-(stripp)s(ed)f(from)h(input)150 2700 y(lines)33 b(and)f(the)h(line)h
+(stripp)s(ed)f(from)h(input)150 3148 y(lines)33 b(and)f(the)h(line)h
 (con)m(taining)g Fr(delimiter)p Fu(.)49 b(This)32 b(allo)m(ws)i
 (here-do)s(cumen)m(ts)f(within)f(shell)i(scripts)e(to)150
-2810 y(b)s(e)e(inden)m(ted)g(in)g(a)h(natural)f(fashion.)150
-3011 y Fk(3.6.7)63 b(Here)41 b(Strings)150 3158 y Fu(A)30
+3257 y(b)s(e)e(inden)m(ted)g(in)g(a)h(natural)f(fashion.)150
+3446 y Fk(3.6.7)63 b(Here)41 b(Strings)150 3593 y Fu(A)30
 b(v)-5 b(arian)m(t)32 b(of)e(here)h(do)s(cumen)m(ts,)f(the)g(format)h
-(is:)390 3295 y Ft(<<<)47 b Fj(word)275 3431 y Fu(The)21
+(is:)390 3722 y Ft(<<<)47 b Fj(word)275 3851 y Fu(The)21
 b Fr(w)m(ord)k Fu(undergo)s(es)c(brace)h(expansion,)i(tilde)e
 (expansion,)i(parameter)e(and)f(v)-5 b(ariable)23 b(expansion,)150
-3541 y(command)j(substitution,)g(arithmetic)i(expansion,)f(and)e(quote)
+3960 y(command)j(substitution,)g(arithmetic)i(expansion,)f(and)e(quote)
 i(remo)m(v)-5 b(al.)40 b(P)m(athname)27 b(expansion)f(and)150
-3651 y(w)m(ord)j(splitting)i(are)f(not)g(p)s(erformed.)39
+4070 y(w)m(ord)j(splitting)i(are)f(not)g(p)s(erformed.)39
 b(The)29 b(result)h(is)g(supplied)e(as)i(a)h(single)f(string)g(to)g
-(the)g(command)150 3760 y(on)g(its)h(standard)f(input.)150
-3962 y Fk(3.6.8)63 b(Duplicating)41 b(File)g(Descriptors)150
-4109 y Fu(The)30 b(redirection)h(op)s(erator)390 4245
-y Ft([)p Fj(n)p Ft(]<&)p Fj(word)150 4382 y Fu(is)k(used)e(to)j
+(the)g(command)150 4179 y(on)g(its)h(standard)f(input.)150
+4368 y Fk(3.6.8)63 b(Duplicating)41 b(File)g(Descriptors)150
+4515 y Fu(The)30 b(redirection)h(op)s(erator)390 4644
+y Ft([)p Fj(n)p Ft(]<&)p Fj(word)150 4773 y Fu(is)k(used)e(to)j
 (duplicate)f(input)f(\014le)g(descriptors.)53 b(If)34
 b Fr(w)m(ord)k Fu(expands)c(to)h(one)g(or)g(more)g(digits,)h(the)f
-(\014le)150 4492 y(descriptor)e(denoted)h(b)m(y)f Fr(n)g
+(\014le)150 4882 y(descriptor)e(denoted)h(b)m(y)f Fr(n)g
 Fu(is)g(made)h(to)g(b)s(e)f(a)g(cop)m(y)h(of)g(that)g(\014le)f
 (descriptor.)50 b(If)33 b(the)h(digits)g(in)f Fr(w)m(ord)150
-4601 y Fu(do)c(not)h(sp)s(ecify)f(a)h(\014le)f(descriptor)g(op)s(en)g
+4992 y Fu(do)c(not)h(sp)s(ecify)f(a)h(\014le)f(descriptor)g(op)s(en)g
 (for)g(input,)g(a)h(redirection)g(error)f(o)s(ccurs.)40
-b(If)29 b Fr(w)m(ord)j Fu(ev)-5 b(aluates)150 4711 y(to)31
+b(If)29 b Fr(w)m(ord)j Fu(ev)-5 b(aluates)150 5101 y(to)31
 b(`)p Ft(-)p Fu(',)g(\014le)g(descriptor)g Fr(n)f Fu(is)g(closed.)43
 b(If)30 b Fr(n)g Fu(is)g(not)h(sp)s(eci\014ed,)f(the)h(standard)f
-(input)g(\(\014le)h(descriptor)f(0\))150 4820 y(is)g(used.)275
-4957 y(The)f(op)s(erator)390 5094 y Ft([)p Fj(n)p Ft(]>&)p
-Fj(word)150 5230 y Fu(is)40 b(used)g(similarly)h(to)g(duplicate)f
-(output)g(\014le)h(descriptors.)70 b(If)40 b Fr(n)f Fu(is)i(not)f(sp)s
-(eci\014ed,)i(the)f(standard)150 5340 y(output)30 b(\(\014le)g
-(descriptor)g(1\))h(is)f(used.)39 b(If)30 b(the)g(digits)h(in)e
-Fr(w)m(ord)34 b Fu(do)29 b(not)i(sp)s(ecify)e(a)i(\014le)f(descriptor)g
-(op)s(en)p eop end
+(input)g(\(\014le)h(descriptor)f(0\))150 5211 y(is)g(used.)275
+5340 y(The)f(op)s(erator)p eop end
 %%Page: 35 41
 TeXDict begin 35 40 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(35)150 299
-y(for)35 b(output,)h(a)g(redirection)g(error)e(o)s(ccurs.)55
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(35)390 299
+y Ft([)p Fj(n)p Ft(]>&)p Fj(word)150 440 y Fu(is)40 b(used)g(similarly)
+h(to)g(duplicate)f(output)g(\014le)h(descriptors.)70
+b(If)40 b Fr(n)f Fu(is)i(not)f(sp)s(eci\014ed,)i(the)f(standard)150
+550 y(output)30 b(\(\014le)g(descriptor)g(1\))h(is)f(used.)39
+b(If)30 b(the)g(digits)h(in)e Fr(w)m(ord)34 b Fu(do)29
+b(not)i(sp)s(ecify)e(a)i(\014le)f(descriptor)g(op)s(en)150
+660 y(for)35 b(output,)h(a)g(redirection)g(error)e(o)s(ccurs.)55
 b(If)35 b Fr(w)m(ord)j Fu(ev)-5 b(aluates)37 b(to)f(`)p
 Ft(-)p Fu(',)h(\014le)e(descriptor)g Fr(n)g Fu(is)g(closed.)150
-408 y(As)f(a)g(sp)s(ecial)h(case,)h(if)e Fr(n)f Fu(is)h(omitted,)i(and)
+769 y(As)f(a)g(sp)s(ecial)h(case,)h(if)e Fr(n)f Fu(is)h(omitted,)i(and)
 e Fr(w)m(ord)j Fu(do)s(es)d(not)g(expand)f(to)i(one)f(or)g(more)g
-(digits)h(or)f(`)p Ft(-)p Fu(',)150 518 y(the)d(standard)e(output)h
+(digits)h(or)f(`)p Ft(-)p Fu(',)150 879 y(the)d(standard)e(output)h
 (and)g(standard)f(error)h(are)h(redirected)g(as)g(describ)s(ed)e
-(previously)-8 b(.)150 717 y Fk(3.6.9)63 b(Mo)m(ving)41
-b(File)h(Descriptors)150 864 y Fu(The)30 b(redirection)h(op)s(erator)
-390 999 y Ft([)p Fj(n)p Ft(]<&)p Fj(digit)p Ft(-)150
-1133 y Fu(mo)m(v)m(es)i(the)f(\014le)g(descriptor)f Fr(digit)k
+(previously)-8 b(.)150 1085 y Fk(3.6.9)63 b(Mo)m(ving)41
+b(File)h(Descriptors)150 1232 y Fu(The)30 b(redirection)h(op)s(erator)
+390 1373 y Ft([)p Fj(n)p Ft(]<&)p Fj(digit)p Ft(-)150
+1515 y Fu(mo)m(v)m(es)i(the)f(\014le)g(descriptor)f Fr(digit)k
 Fu(to)d(\014le)g(descriptor)g Fr(n)p Fu(,)f(or)h(the)g(standard)f
-(input)f(\(\014le)j(descriptor)e(0\))150 1243 y(if)f
+(input)f(\(\014le)j(descriptor)e(0\))150 1625 y(if)f
 Fr(n)g Fu(is)h(not)f(sp)s(eci\014ed.)40 b Fr(digit)33
 b Fu(is)e(closed)g(after)g(b)s(eing)f(duplicated)g(to)h
-Fr(n)p Fu(.)275 1377 y(Similarly)-8 b(,)31 b(the)f(redirection)h(op)s
-(erator)390 1512 y Ft([)p Fj(n)p Ft(]>&)p Fj(digit)p
-Ft(-)150 1646 y Fu(mo)m(v)m(es)e(the)g(\014le)f(descriptor)f
+Fr(n)p Fu(.)275 1766 y(Similarly)-8 b(,)31 b(the)f(redirection)h(op)s
+(erator)390 1908 y Ft([)p Fj(n)p Ft(]>&)p Fj(digit)p
+Ft(-)150 2049 y Fu(mo)m(v)m(es)e(the)g(\014le)f(descriptor)f
 Fr(digit)k Fu(to)e(\014le)f(descriptor)g Fr(n)p Fu(,)g(or)g(the)g
 (standard)f(output)h(\(\014le)g(descriptor)g(1\))150
-1756 y(if)i Fr(n)g Fu(is)h(not)f(sp)s(eci\014ed.)150
-1955 y Fk(3.6.10)63 b(Op)s(ening)42 b(File)g(Descriptors)g(for)g
-(Reading)e(and)h(W)-10 b(riting)150 2102 y Fu(The)30
-b(redirection)h(op)s(erator)390 2236 y Ft([)p Fj(n)p
-Ft(]<>)p Fj(word)150 2371 y Fu(causes)39 b(the)g(\014le)g(whose)g(name)
+2159 y(if)i Fr(n)g Fu(is)h(not)f(sp)s(eci\014ed.)150
+2365 y Fk(3.6.10)63 b(Op)s(ening)42 b(File)g(Descriptors)g(for)g
+(Reading)e(and)h(W)-10 b(riting)150 2512 y Fu(The)30
+b(redirection)h(op)s(erator)390 2653 y Ft([)p Fj(n)p
+Ft(]<>)p Fj(word)150 2795 y Fu(causes)39 b(the)g(\014le)g(whose)g(name)
 g(is)g(the)g(expansion)g(of)g Fr(w)m(ord)j Fu(to)d(b)s(e)g(op)s(ened)f
-(for)g(b)s(oth)h(reading)g(and)150 2480 y(writing)33
+(for)g(b)s(oth)h(reading)g(and)150 2905 y(writing)33
 b(on)f(\014le)h(descriptor)f Fr(n)p Fu(,)h(or)g(on)f(\014le)h
 (descriptor)g(0)g(if)f Fr(n)g Fu(is)h(not)g(sp)s(eci\014ed.)47
-b(If)32 b(the)h(\014le)f(do)s(es)h(not)150 2590 y(exist,)e(it)g(is)g
-(created.)150 2822 y Fs(3.7)68 b(Executing)46 b(Commands)150
-3046 y Fk(3.7.1)63 b(Simple)41 b(Command)h(Expansion)150
-3193 y Fu(When)33 b(a)g(simple)g(command)g(is)g(executed,)h(the)g
+b(If)32 b(the)h(\014le)f(do)s(es)h(not)150 3014 y(exist,)e(it)g(is)g
+(created.)150 3257 y Fs(3.7)68 b(Executing)46 b(Commands)150
+3481 y Fk(3.7.1)63 b(Simple)41 b(Command)h(Expansion)150
+3628 y Fu(When)33 b(a)g(simple)g(command)g(is)g(executed,)h(the)g
 (shell)f(p)s(erforms)e(the)i(follo)m(wing)i(expansions,)e(assign-)150
-3303 y(men)m(ts,)e(and)f(redirections,)h(from)f(left)h(to)g(righ)m(t.)
-199 3437 y(1.)61 b(The)38 b(w)m(ords)f(that)i(the)g(parser)e(has)h
+3738 y(men)m(ts,)e(and)f(redirections,)h(from)f(left)h(to)g(righ)m(t.)
+199 3879 y(1.)61 b(The)38 b(w)m(ords)f(that)i(the)g(parser)e(has)h
 (mark)m(ed)g(as)h(v)-5 b(ariable)39 b(assignmen)m(ts)g(\(those)g
-(preceding)f(the)330 3547 y(command)30 b(name\))h(and)f(redirections)h
+(preceding)f(the)330 3989 y(command)30 b(name\))h(and)f(redirections)h
 (are)f(sa)m(v)m(ed)i(for)e(later)h(pro)s(cessing.)199
-3681 y(2.)61 b(The)39 b(w)m(ords)g(that)i(are)f(not)g(v)-5
+4127 y(2.)61 b(The)39 b(w)m(ords)g(that)i(are)f(not)g(v)-5
 b(ariable)40 b(assignmen)m(ts)h(or)e(redirections)i(are)f(expanded)f
-(\(see)h(Sec-)330 3791 y(tion)d(3.5)i([Shell)e(Expansions],)h(page)g
+(\(see)h(Sec-)330 4237 y(tion)d(3.5)i([Shell)e(Expansions],)h(page)g
 (21\).)61 b(If)37 b(an)m(y)g(w)m(ords)f(remain)h(after)h(expansion,)h
-(the)e(\014rst)330 3901 y(w)m(ord)31 b(is)g(tak)m(en)h(to)g(b)s(e)f
+(the)e(\014rst)330 4346 y(w)m(ord)31 b(is)g(tak)m(en)h(to)g(b)s(e)f
 (the)g(name)h(of)f(the)h(command)f(and)f(the)i(remaining)f(w)m(ords)g
-(are)g(the)h(argu-)330 4010 y(men)m(ts.)199 4145 y(3.)61
+(are)g(the)h(argu-)330 4456 y(men)m(ts.)199 4594 y(3.)61
 b(Redirections)25 b(are)f(p)s(erformed)f(as)h(describ)s(ed)f(ab)s(o)m
 (v)m(e)i(\(see)g(Section)g(3.6)g([Redirections],)i(page)d(31\).)199
-4279 y(4.)61 b(The)25 b(text)h(after)f(the)g(`)p Ft(=)p
+4732 y(4.)61 b(The)25 b(text)h(after)f(the)g(`)p Ft(=)p
 Fu(')h(in)e(eac)m(h)j(v)-5 b(ariable)25 b(assignmen)m(t)h(undergo)s(es)
-e(tilde)i(expansion,)g(parameter)330 4389 y(expansion,)49
+e(tilde)i(expansion,)g(parameter)330 4841 y(expansion,)49
 b(command)d(substitution,)j(arithmetic)d(expansion,)k(and)45
-b(quote)h(remo)m(v)-5 b(al)46 b(b)s(efore)330 4498 y(b)s(eing)30
-b(assigned)h(to)g(the)f(v)-5 b(ariable.)275 4658 y(If)32
+b(quote)h(remo)m(v)-5 b(al)46 b(b)s(efore)330 4951 y(b)s(eing)30
+b(assigned)h(to)g(the)f(v)-5 b(ariable.)275 5121 y(If)32
 b(no)i(command)f(name)g(results,)h(the)g(v)-5 b(ariable)34
 b(assignmen)m(ts)g(a\013ect)h(the)f(curren)m(t)f(shell)h(en)m(viron-)
-150 4767 y(men)m(t.)39 b(Otherwise,)27 b(the)e(v)-5 b(ariables)26
+150 5230 y(men)m(t.)39 b(Otherwise,)27 b(the)e(v)-5 b(ariables)26
 b(are)g(added)f(to)h(the)f(en)m(vironmen)m(t)h(of)g(the)f(executed)h
-(command)g(and)150 4877 y(do)35 b(not)f(a\013ect)j(the)d(curren)m(t)h
+(command)g(and)150 5340 y(do)35 b(not)f(a\013ect)j(the)d(curren)m(t)h
 (shell)g(en)m(vironmen)m(t.)54 b(If)34 b(an)m(y)h(of)g(the)f(assignmen)
-m(ts)i(attempts)f(to)h(assign)150 4986 y(a)j(v)-5 b(alue)39
-b(to)g(a)g(readonly)f(v)-5 b(ariable,)42 b(an)c(error)g(o)s(ccurs,)j
-(and)c(the)i(command)f(exits)h(with)g(a)f(non-zero)150
-5096 y(status.)275 5230 y(If)33 b(no)g(command)g(name)h(results,)g
-(redirections)g(are)g(p)s(erformed,)f(but)g(do)h(not)f(a\013ect)i(the)f
-(curren)m(t)150 5340 y(shell)d(en)m(vironmen)m(t.)41
-b(A)30 b(redirection)h(error)f(causes)h(the)g(command)f(to)h(exit)g
-(with)f(a)h(non-zero)g(status.)p eop end
+m(ts)i(attempts)f(to)h(assign)p eop end
 %%Page: 36 42
 TeXDict begin 36 41 bop 150 -116 a Fu(Chapter)30 b(3:)41
-b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(36)275 299
-y(If)26 b(there)i(is)f(a)h(command)f(name)h(left)g(after)g(expansion,)g
-(execution)h(pro)s(ceeds)e(as)g(describ)s(ed)f(b)s(elo)m(w.)150
-408 y(Otherwise,)39 b(the)e(command)g(exits.)62 b(If)37
-b(one)g(of)g(the)h(expansions)f(con)m(tained)h(a)g(command)f(substitu-)
-150 518 y(tion,)i(the)d(exit)h(status)g(of)f(the)h(command)f(is)h(the)f
-(exit)h(status)g(of)f(the)h(last)g(command)f(substitution)150
-628 y(p)s(erformed.)55 b(If)35 b(there)g(w)m(ere)h(no)g(command)f
-(substitutions,)i(the)e(command)h(exits)g(with)f(a)h(status)g(of)150
-737 y(zero.)150 925 y Fk(3.7.2)63 b(Command)41 b(Searc)m(h)f(and)h
-(Execution)150 1071 y Fu(After)i(a)h(command)f(has)g(b)s(een)f(split)h
-(in)m(to)h(w)m(ords,)j(if)c(it)g(results)g(in)g(a)h(simple)f(command)g
-(and)f(an)150 1181 y(optional)32 b(list)f(of)f(argumen)m(ts,)h(the)g
-(follo)m(wing)g(actions)h(are)f(tak)m(en.)199 1310 y(1.)61
-b(If)24 b(the)g(command)g(name)g(con)m(tains)i(no)e(slashes,)i(the)e
-(shell)h(attempts)g(to)g(lo)s(cate)h(it.)39 b(If)24 b(there)g(exists)
-330 1419 y(a)h(shell)g(function)f(b)m(y)g(that)h(name,)h(that)f
-(function)f(is)h(in)m(v)m(ok)m(ed)h(as)e(describ)s(ed)g(in)g(Section)h
-(3.3)h([Shell)330 1529 y(F)-8 b(unctions],)31 b(page)h(17.)199
-1657 y(2.)61 b(If)41 b(the)g(name)h(do)s(es)f(not)g(matc)m(h)i(a)e
-(function,)j(the)e(shell)f(searc)m(hes)i(for)e(it)h(in)f(the)g(list)h
-(of)g(shell)330 1767 y(builtins.)e(If)30 b(a)h(matc)m(h)g(is)f(found,)g
-(that)h(builtin)f(is)g(in)m(v)m(ok)m(ed.)199 1895 y(3.)61
-b(If)40 b(the)g(name)h(is)f(neither)h(a)f(shell)h(function)f(nor)g(a)g
-(builtin,)j(and)d(con)m(tains)h(no)g(slashes,)i(Bash)330
-2005 y(searc)m(hes)c(eac)m(h)g(elemen)m(t)g(of)g Ft($PATH)d
-Fu(for)i(a)g(directory)h(con)m(taining)g(an)f(executable)h(\014le)f(b)m
-(y)g(that)330 2115 y(name.)56 b(Bash)36 b(uses)f(a)h(hash)e(table)j(to)
-f(remem)m(b)s(er)f(the)h(full)f(pathnames)g(of)h(executable)h(\014les)e
-(to)330 2224 y(a)m(v)m(oid)e(m)m(ultiple)f Ft(PATH)f
-Fu(searc)m(hes)i(\(see)f(the)g(description)g(of)f Ft(hash)g
-Fu(in)g(Section)i(4.1)f([Bourne)g(Shell)330 2334 y(Builtins],)37
-b(page)f(41\).)55 b(A)35 b(full)g(searc)m(h)g(of)g(the)g(directories)h
-(in)f Ft($PATH)e Fu(is)i(p)s(erformed)f(only)h(if)g(the)330
-2443 y(command)24 b(is)h(not)g(found)e(in)i(the)g(hash)f(table.)39
-b(If)25 b(the)f(searc)m(h)i(is)e(unsuccessful,)h(the)g(shell)g(searc)m
-(hes)330 2553 y(for)e(a)h(de\014ned)e(shell)h(function)h(named)e
-Ft(command_not_found_handle)p Fu(.)32 b(If)23 b(that)h(function)f
-(exists,)330 2663 y(it)32 b(is)f(in)m(v)m(ok)m(ed)i(with)e(the)h
-(original)g(command)f(and)g(the)h(original)g(command's)f(argumen)m(ts)h
-(as)g(its)330 2772 y(argumen)m(ts,)h(and)e(the)i(function's)e(exit)i
-(status)g(b)s(ecomes)f(the)g(exit)h(status)f(of)h(the)f(shell.)46
-b(If)31 b(that)330 2882 y(function)g(is)g(not)g(de\014ned,)f(the)i
-(shell)f(prin)m(ts)f(an)h(error)g(message)h(and)f(returns)e(an)i(exit)h
-(status)g(of)330 2991 y(127.)199 3120 y(4.)61 b(If)33
-b(the)g(searc)m(h)h(is)g(successful,)g(or)f(if)g(the)h(command)f(name)g
-(con)m(tains)i(one)f(or)f(more)g(slashes,)i(the)330 3229
-y(shell)g(executes)h(the)f(named)f(program)g(in)h(a)g(separate)h
-(execution)f(en)m(vironmen)m(t.)55 b(Argumen)m(t)35 b(0)330
-3339 y(is)30 b(set)h(to)h(the)e(name)h(giv)m(en,)g(and)f(the)h
+b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(36)150 299
+y(a)39 b(v)-5 b(alue)39 b(to)g(a)g(readonly)f(v)-5 b(ariable,)42
+b(an)c(error)g(o)s(ccurs,)j(and)c(the)i(command)f(exits)h(with)g(a)f
+(non-zero)150 408 y(status.)275 538 y(If)33 b(no)g(command)g(name)h
+(results,)g(redirections)g(are)g(p)s(erformed,)f(but)g(do)h(not)f
+(a\013ect)i(the)f(curren)m(t)150 648 y(shell)d(en)m(vironmen)m(t.)41
+b(A)30 b(redirection)h(error)f(causes)h(the)g(command)f(to)h(exit)g
+(with)f(a)h(non-zero)g(status.)275 778 y(If)26 b(there)i(is)f(a)h
+(command)f(name)h(left)g(after)g(expansion,)g(execution)h(pro)s(ceeds)e
+(as)g(describ)s(ed)f(b)s(elo)m(w.)150 887 y(Otherwise,)39
+b(the)e(command)g(exits.)62 b(If)37 b(one)g(of)g(the)h(expansions)f
+(con)m(tained)h(a)g(command)f(substitu-)150 997 y(tion,)i(the)d(exit)h
+(status)g(of)f(the)h(command)f(is)h(the)f(exit)h(status)g(of)f(the)h
+(last)g(command)f(substitution)150 1107 y(p)s(erformed.)55
+b(If)35 b(there)g(w)m(ere)h(no)g(command)f(substitutions,)i(the)e
+(command)h(exits)g(with)f(a)h(status)g(of)150 1216 y(zero.)150
+1406 y Fk(3.7.2)63 b(Command)41 b(Searc)m(h)f(and)h(Execution)150
+1553 y Fu(After)i(a)h(command)f(has)g(b)s(een)f(split)h(in)m(to)h(w)m
+(ords,)j(if)c(it)g(results)g(in)g(a)h(simple)f(command)g(and)f(an)150
+1663 y(optional)32 b(list)f(of)f(argumen)m(ts,)h(the)g(follo)m(wing)g
+(actions)h(are)f(tak)m(en.)199 1793 y(1.)61 b(If)24 b(the)g(command)g
+(name)g(con)m(tains)i(no)e(slashes,)i(the)e(shell)h(attempts)g(to)g(lo)
+s(cate)h(it.)39 b(If)24 b(there)g(exists)330 1902 y(a)h(shell)g
+(function)f(b)m(y)g(that)h(name,)h(that)f(function)f(is)h(in)m(v)m(ok)m
+(ed)h(as)e(describ)s(ed)g(in)g(Section)h(3.3)h([Shell)330
+2012 y(F)-8 b(unctions],)31 b(page)h(17.)199 2142 y(2.)61
+b(If)41 b(the)g(name)h(do)s(es)f(not)g(matc)m(h)i(a)e(function,)j(the)e
+(shell)f(searc)m(hes)i(for)e(it)h(in)f(the)g(list)h(of)g(shell)330
+2251 y(builtins.)e(If)30 b(a)h(matc)m(h)g(is)f(found,)g(that)h(builtin)
+f(is)g(in)m(v)m(ok)m(ed.)199 2381 y(3.)61 b(If)40 b(the)g(name)h(is)f
+(neither)h(a)f(shell)h(function)f(nor)g(a)g(builtin,)j(and)d(con)m
+(tains)h(no)g(slashes,)i(Bash)330 2491 y(searc)m(hes)c(eac)m(h)g
+(elemen)m(t)g(of)g Ft($PATH)d Fu(for)i(a)g(directory)h(con)m(taining)g
+(an)f(executable)h(\014le)f(b)m(y)g(that)330 2600 y(name.)56
+b(Bash)36 b(uses)f(a)h(hash)e(table)j(to)f(remem)m(b)s(er)f(the)h(full)
+f(pathnames)g(of)h(executable)h(\014les)e(to)330 2710
+y(a)m(v)m(oid)e(m)m(ultiple)f Ft(PATH)f Fu(searc)m(hes)i(\(see)f(the)g
+(description)g(of)f Ft(hash)g Fu(in)g(Section)i(4.1)f([Bourne)g(Shell)
+330 2819 y(Builtins],)37 b(page)f(41\).)55 b(A)35 b(full)g(searc)m(h)g
+(of)g(the)g(directories)h(in)f Ft($PATH)e Fu(is)i(p)s(erformed)f(only)h
+(if)g(the)330 2929 y(command)24 b(is)h(not)g(found)e(in)i(the)g(hash)f
+(table.)39 b(If)25 b(the)f(searc)m(h)i(is)e(unsuccessful,)h(the)g
+(shell)g(searc)m(hes)330 3039 y(for)e(a)h(de\014ned)e(shell)h(function)
+h(named)e Ft(command_not_found_handle)p Fu(.)32 b(If)23
+b(that)h(function)f(exists,)330 3148 y(it)32 b(is)f(in)m(v)m(ok)m(ed)i
+(with)e(the)h(original)g(command)f(and)g(the)h(original)g(command's)f
+(argumen)m(ts)h(as)g(its)330 3258 y(argumen)m(ts,)h(and)e(the)i
+(function's)e(exit)i(status)g(b)s(ecomes)f(the)g(exit)h(status)f(of)h
+(the)f(shell.)46 b(If)31 b(that)330 3367 y(function)g(is)g(not)g
+(de\014ned,)f(the)i(shell)f(prin)m(ts)f(an)h(error)g(message)h(and)f
+(returns)e(an)i(exit)h(status)g(of)330 3477 y(127.)199
+3607 y(4.)61 b(If)33 b(the)g(searc)m(h)h(is)g(successful,)g(or)f(if)g
+(the)h(command)f(name)g(con)m(tains)i(one)f(or)f(more)g(slashes,)i(the)
+330 3716 y(shell)g(executes)h(the)f(named)f(program)g(in)h(a)g
+(separate)h(execution)f(en)m(vironmen)m(t.)55 b(Argumen)m(t)35
+b(0)330 3826 y(is)30 b(set)h(to)h(the)e(name)h(giv)m(en,)g(and)f(the)h
 (remaining)f(argumen)m(ts)h(to)g(the)g(command)f(are)h(set)g(to)g(the)
-330 3449 y(argumen)m(ts)g(supplied,)e(if)h(an)m(y)-8
-b(.)199 3577 y(5.)61 b(If)35 b(this)h(execution)h(fails)f(b)s(ecause)g
+330 3936 y(argumen)m(ts)g(supplied,)e(if)h(an)m(y)-8
+b(.)199 4065 y(5.)61 b(If)35 b(this)h(execution)h(fails)f(b)s(ecause)g
 (the)f(\014le)h(is)g(not)g(in)f(executable)j(format,)f(and)e(the)h
-(\014le)g(is)g(not)330 3687 y(a)d(directory)-8 b(,)34
+(\014le)g(is)g(not)330 4175 y(a)d(directory)-8 b(,)34
 b(it)f(is)g(assumed)e(to)j(b)s(e)d(a)i Fr(shell)g(script)h
 Fu(and)e(the)h(shell)f(executes)i(it)f(as)g(describ)s(ed)e(in)330
-3796 y(Section)g(3.8)h([Shell)e(Scripts],)g(page)i(39.)199
-3925 y(6.)61 b(If)38 b(the)h(command)f(w)m(as)h(not)g(b)s(egun)e(async)
+4285 y(Section)g(3.8)h([Shell)e(Scripts],)g(page)i(39.)199
+4415 y(6.)61 b(If)38 b(the)h(command)f(w)m(as)h(not)g(b)s(egun)e(async)
 m(hronously)-8 b(,)42 b(the)c(shell)h(w)m(aits)h(for)e(the)h(command)f
-(to)330 4034 y(complete)32 b(and)e(collects)i(its)f(exit)g(status.)150
-4222 y Fk(3.7.3)63 b(Command)41 b(Execution)f(En)m(vironmen)m(t)150
-4369 y Fu(The)30 b(shell)g(has)h(an)f Fr(execution)h(en)m(vironmen)m(t)
+(to)330 4524 y(complete)32 b(and)e(collects)i(its)f(exit)g(status.)150
+4714 y Fk(3.7.3)63 b(Command)41 b(Execution)f(En)m(vironmen)m(t)150
+4861 y Fu(The)30 b(shell)g(has)h(an)f Fr(execution)h(en)m(vironmen)m(t)
 p Fu(,)h(whic)m(h)e(consists)h(of)f(the)h(follo)m(wing:)225
-4497 y Fq(\017)60 b Fu(op)s(en)32 b(\014les)g(inherited)g(b)m(y)h(the)f
+4991 y Fq(\017)60 b Fu(op)s(en)32 b(\014les)g(inherited)g(b)m(y)h(the)f
 (shell)h(at)g(in)m(v)m(o)s(cation,)j(as)c(mo)s(di\014ed)g(b)m(y)g
-(redirections)h(supplied)e(to)330 4607 y(the)g Ft(exec)e
-Fu(builtin)225 4735 y Fq(\017)60 b Fu(the)28 b(curren)m(t)g(w)m(orking)
+(redirections)h(supplied)e(to)330 5101 y(the)g Ft(exec)e
+Fu(builtin)225 5230 y Fq(\017)60 b Fu(the)28 b(curren)m(t)g(w)m(orking)
 h(directory)g(as)f(set)h(b)m(y)f Ft(cd)p Fu(,)g Ft(pushd)p
 Fu(,)g(or)g Ft(popd)p Fu(,)g(or)g(inherited)g(b)m(y)g(the)h(shell)f(at)
-330 4845 y(in)m(v)m(o)s(cation)225 4973 y Fq(\017)60
-b Fu(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)g(as)h(set)g(b)m(y)f
-Ft(umask)f Fu(or)h(inherited)g(from)g(the)h(shell's)f(paren)m(t)225
-5102 y Fq(\017)60 b Fu(curren)m(t)30 b(traps)g(set)h(b)m(y)f
-Ft(trap)225 5230 y Fq(\017)60 b Fu(shell)30 b(parameters)f(that)h(are)g
-(set)g(b)m(y)g(v)-5 b(ariable)30 b(assignmen)m(t)g(or)g(with)f
-Ft(set)f Fu(or)i(inherited)f(from)g(the)330 5340 y(shell's)i(paren)m(t)
-f(in)g(the)h(en)m(vironmen)m(t)p eop end
+330 5340 y(in)m(v)m(o)s(cation)p eop end
 %%Page: 37 43
 TeXDict begin 37 42 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(37)225 299
-y Fq(\017)60 b Fu(shell)44 b(functions)f(de\014ned)f(during)h
-(execution)i(or)e(inherited)h(from)f(the)h(shell's)g(paren)m(t)f(in)h
-(the)330 408 y(en)m(vironmen)m(t)225 543 y Fq(\017)60
-b Fu(options)33 b(enabled)g(at)h(in)m(v)m(o)s(cation)h(\(either)f(b)m
-(y)f(default)g(or)g(with)g(command-line)g(argumen)m(ts\))h(or)330
-652 y(b)m(y)c Ft(set)225 787 y Fq(\017)60 b Fu(options)31
+y Fq(\017)60 b Fu(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)g(as)h
+(set)g(b)m(y)f Ft(umask)f Fu(or)h(inherited)g(from)g(the)h(shell's)f
+(paren)m(t)225 434 y Fq(\017)60 b Fu(curren)m(t)30 b(traps)g(set)h(b)m
+(y)f Ft(trap)225 570 y Fq(\017)60 b Fu(shell)30 b(parameters)f(that)h
+(are)g(set)g(b)m(y)g(v)-5 b(ariable)30 b(assignmen)m(t)g(or)g(with)f
+Ft(set)f Fu(or)i(inherited)f(from)g(the)330 680 y(shell's)i(paren)m(t)f
+(in)g(the)h(en)m(vironmen)m(t)225 815 y Fq(\017)60 b
+Fu(shell)44 b(functions)f(de\014ned)f(during)h(execution)i(or)e
+(inherited)h(from)f(the)h(shell's)g(paren)m(t)f(in)h(the)330
+925 y(en)m(vironmen)m(t)225 1061 y Fq(\017)60 b Fu(options)33
+b(enabled)g(at)h(in)m(v)m(o)s(cation)h(\(either)f(b)m(y)f(default)g(or)
+g(with)g(command-line)g(argumen)m(ts\))h(or)330 1170
+y(b)m(y)c Ft(set)225 1306 y Fq(\017)60 b Fu(options)31
 b(enabled)f(b)m(y)g Ft(shopt)f Fu(\(see)j(Section)f(4.3.2)h([The)e
-(Shopt)g(Builtin],)h(page)g(62\))225 921 y Fq(\017)60
+(Shopt)g(Builtin],)h(page)g(62\))225 1441 y Fq(\017)60
 b Fu(shell)31 b(aliases)g(de\014ned)f(with)g Ft(alias)f
 Fu(\(see)i(Section)g(6.6)h([Aliases],)g(page)f(88\))225
-1056 y Fq(\017)60 b Fu(v)-5 b(arious)50 b(pro)s(cess)f
+1577 y Fq(\017)60 b Fu(v)-5 b(arious)50 b(pro)s(cess)f
 Fm(id)p Fu(s,)55 b(including)49 b(those)i(of)e(bac)m(kground)h(jobs)f
-(\(see)i(Section)g(3.2.3)g([Lists],)330 1165 y(page)31
+(\(see)i(Section)g(3.2.3)g([Lists],)330 1687 y(page)31
 b(9\),)g(the)g(v)-5 b(alue)31 b(of)f Ft($$)p Fu(,)g(and)g(the)h(v)-5
-b(alue)31 b(of)f Ft($PPID)275 1324 y Fu(When)k(a)g(simple)h(command)f
+b(alue)31 b(of)f Ft($PPID)275 1849 y Fu(When)k(a)g(simple)h(command)f
 (other)g(than)g(a)h(builtin)f(or)g(shell)h(function)f(is)g(to)h(b)s(e)f
-(executed,)i(it)f(is)150 1434 y(in)m(v)m(ok)m(ed)25 b(in)f(a)g
+(executed,)i(it)f(is)150 1959 y(in)m(v)m(ok)m(ed)25 b(in)f(a)g
 (separate)h(execution)g(en)m(vironmen)m(t)g(that)f(consists)g(of)h(the)
-f(follo)m(wing.)40 b(Unless)24 b(otherwise)150 1543 y(noted,)31
+f(follo)m(wing.)40 b(Unless)24 b(otherwise)150 2068 y(noted,)31
 b(the)f(v)-5 b(alues)31 b(are)g(inherited)f(from)g(the)g(shell.)225
-1678 y Fq(\017)60 b Fu(the)31 b(shell's)h(op)s(en)e(\014les,)i(plus)e
+2205 y Fq(\017)60 b Fu(the)31 b(shell's)h(op)s(en)e(\014les,)i(plus)e
 (an)m(y)h(mo)s(di\014cations)h(and)e(additions)h(sp)s(eci\014ed)g(b)m
-(y)g(redirections)g(to)330 1787 y(the)g(command)225 1922
+(y)g(redirections)g(to)330 2315 y(the)g(command)225 2450
 y Fq(\017)60 b Fu(the)31 b(curren)m(t)f(w)m(orking)g(directory)225
-2056 y Fq(\017)60 b Fu(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)225
-2190 y Fq(\017)60 b Fu(shell)32 b(v)-5 b(ariables)33
+2586 y Fq(\017)60 b Fu(the)31 b(\014le)f(creation)i(mo)s(de)e(mask)225
+2722 y Fq(\017)60 b Fu(shell)32 b(v)-5 b(ariables)33
 b(and)e(functions)h(mark)m(ed)g(for)g(exp)s(ort,)g(along)h(with)f(v)-5
-b(ariables)32 b(exp)s(orted)g(for)g(the)330 2300 y(command,)e(passed)g
+b(ariables)32 b(exp)s(orted)g(for)g(the)330 2831 y(command,)e(passed)g
 (in)g(the)h(en)m(vironmen)m(t)g(\(see)g(Section)g(3.7.4)i([En)m
-(vironmen)m(t],)e(page)g(37\))225 2434 y Fq(\017)60 b
+(vironmen)m(t],)e(page)g(37\))225 2967 y Fq(\017)60 b
 Fu(traps)31 b(caugh)m(t)h(b)m(y)f(the)g(shell)h(are)f(reset)h(to)g(the)
 f(v)-5 b(alues)32 b(inherited)e(from)h(the)g(shell's)h(paren)m(t,)g
-(and)330 2544 y(traps)e(ignored)h(b)m(y)f(the)g(shell)h(are)g(ignored)
-275 2703 y(A)41 b(command)g(in)m(v)m(ok)m(ed)i(in)e(this)h(separate)g
+(and)330 3076 y(traps)e(ignored)h(b)m(y)f(the)g(shell)h(are)g(ignored)
+275 3239 y(A)41 b(command)g(in)m(v)m(ok)m(ed)i(in)e(this)h(separate)g
 (en)m(vironmen)m(t)g(cannot)g(a\013ect)h(the)f(shell's)g(execution)150
-2813 y(en)m(vironmen)m(t.)275 2947 y(Command)35 b(substitution,)j
+3349 y(en)m(vironmen)m(t.)275 3485 y(Command)35 b(substitution,)j
 (commands)e(group)s(ed)f(with)i(paren)m(theses,)h(and)e(async)m
-(hronous)g(com-)150 3057 y(mands)c(are)h(in)m(v)m(ok)m(ed)i(in)d(a)i
+(hronous)g(com-)150 3595 y(mands)c(are)h(in)m(v)m(ok)m(ed)i(in)d(a)i
 (subshell)e(en)m(vironmen)m(t)h(that)h(is)f(a)g(duplicate)h(of)f(the)g
-(shell)g(en)m(vironmen)m(t,)150 3166 y(except)i(that)g(traps)f(caugh)m
+(shell)g(en)m(vironmen)m(t,)150 3705 y(except)i(that)g(traps)f(caugh)m
 (t)h(b)m(y)f(the)h(shell)f(are)g(reset)h(to)g(the)f(v)-5
 b(alues)35 b(that)g(the)f(shell)h(inherited)e(from)150
-3276 y(its)g(paren)m(t)f(at)h(in)m(v)m(o)s(cation.)49
+3814 y(its)g(paren)m(t)f(at)h(in)m(v)m(o)s(cation.)49
 b(Builtin)32 b(commands)g(that)h(are)g(in)m(v)m(ok)m(ed)h(as)e(part)g
-(of)h(a)f(pip)s(eline)g(are)h(also)150 3385 y(executed)41
+(of)h(a)f(pip)s(eline)g(are)h(also)150 3924 y(executed)41
 b(in)f(a)h(subshell)e(en)m(vironmen)m(t.)72 b(Changes)40
 b(made)g(to)h(the)g(subshell)e(en)m(vironmen)m(t)i(cannot)150
-3495 y(a\013ect)32 b(the)f(shell's)f(execution)i(en)m(vironmen)m(t.)275
-3629 y(Subshells)c(spa)m(wned)i(to)h(execute)g(command)f(substitutions)
+4033 y(a\013ect)32 b(the)f(shell's)f(execution)i(en)m(vironmen)m(t.)275
+4170 y(Subshells)c(spa)m(wned)i(to)h(execute)g(command)f(substitutions)
 g(inherit)g(the)g(v)-5 b(alue)31 b(of)f(the)h Ft(-e)e
-Fu(option)150 3739 y(from)23 b(the)i(paren)m(t)f(shell.)38
+Fu(option)150 4280 y(from)23 b(the)i(paren)m(t)f(shell.)38
 b(When)24 b(not)g(in)g Fm(posix)f Fu(mo)s(de,)i(Bash)f(clears)h(the)f
-Ft(-e)f Fu(option)i(in)e(suc)m(h)h(subshells.)275 3873
+Ft(-e)f Fu(option)i(in)e(suc)m(h)h(subshells.)275 4416
 y(If)f(a)h(command)g(is)g(follo)m(w)m(ed)h(b)m(y)f(a)g(`)p
 Ft(&)p Fu(')g(and)f(job)h(con)m(trol)h(is)f(not)g(activ)m(e,)k(the)c
-(default)g(standard)f(input)150 3983 y(for)35 b(the)g(command)g(is)g
+(default)g(standard)f(input)150 4526 y(for)35 b(the)g(command)g(is)g
 (the)g(empt)m(y)h(\014le)f Ft(/dev/null)p Fu(.)52 b(Otherwise,)37
-b(the)e(in)m(v)m(ok)m(ed)h(command)f(inherits)150 4093
+b(the)e(in)m(v)m(ok)m(ed)h(command)f(inherits)150 4636
 y(the)c(\014le)f(descriptors)g(of)h(the)f(calling)i(shell)f(as)f(mo)s
-(di\014ed)g(b)m(y)g(redirections.)150 4292 y Fk(3.7.4)63
-b(En)m(vironmen)m(t)150 4438 y Fu(When)29 b(a)g(program)f(is)h(in)m(v)m
+(di\014ed)g(b)m(y)g(redirections.)150 4837 y Fk(3.7.4)63
+b(En)m(vironmen)m(t)150 4984 y Fu(When)29 b(a)g(program)f(is)h(in)m(v)m
 (ok)m(ed)h(it)g(is)f(giv)m(en)g(an)g(arra)m(y)g(of)g(strings)g(called)h
 (the)f Fr(en)m(vironmen)m(t)p Fu(.)41 b(This)28 b(is)h(a)150
-4548 y(list)i(of)g(name-v)-5 b(alue)31 b(pairs,)f(of)h(the)f(form)g
-Ft(name=value)p Fu(.)275 4682 y(Bash)39 b(pro)m(vides)g(sev)m(eral)i(w)
+5094 y(list)i(of)g(name-v)-5 b(alue)31 b(pairs,)f(of)h(the)f(form)g
+Ft(name=value)p Fu(.)275 5230 y(Bash)39 b(pro)m(vides)g(sev)m(eral)i(w)
 m(a)m(ys)g(to)f(manipulate)f(the)h(en)m(vironmen)m(t.)69
-b(On)38 b(in)m(v)m(o)s(cation,)44 b(the)c(shell)150 4792
+b(On)38 b(in)m(v)m(o)s(cation,)44 b(the)c(shell)150 5340
 y(scans)g(its)h(o)m(wn)f(en)m(vironmen)m(t)h(and)f(creates)i(a)f
-(parameter)f(for)g(eac)m(h)i(name)e(found,)i(automatically)150
-4902 y(marking)26 b(it)g(for)g Fr(exp)s(ort)h Fu(to)g(c)m(hild)f(pro)s
-(cesses.)39 b(Executed)26 b(commands)g(inherit)g(the)g(en)m(vironmen)m
-(t.)39 b(The)150 5011 y Ft(export)c Fu(and)i(`)p Ft(declare)29
-b(-x)p Fu(')36 b(commands)h(allo)m(w)i(parameters)e(and)g(functions)g
-(to)h(b)s(e)e(added)h(to)h(and)150 5121 y(deleted)21
-b(from)f(the)h(en)m(vironmen)m(t.)38 b(If)20 b(the)h(v)-5
-b(alue)21 b(of)g(a)g(parameter)g(in)f(the)g(en)m(vironmen)m(t)i(is)e
-(mo)s(di\014ed,)i(the)150 5230 y(new)31 b(v)-5 b(alue)32
-b(b)s(ecomes)f(part)h(of)f(the)h(en)m(vironmen)m(t,)g(replacing)h(the)e
-(old.)44 b(The)31 b(en)m(vironmen)m(t)h(inherited)150
-5340 y(b)m(y)f(an)m(y)g(executed)h(command)f(consists)g(of)g(the)g
-(shell's)h(initial)g(en)m(vironmen)m(t,)g(whose)f(v)-5
-b(alues)31 b(ma)m(y)h(b)s(e)p eop end
+(parameter)f(for)g(eac)m(h)i(name)e(found,)i(automatically)p
+eop end
 %%Page: 38 44
 TeXDict begin 38 43 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(38)150 299
-y(mo)s(di\014ed)26 b(in)g(the)h(shell,)h(less)f(an)m(y)g(pairs)f(remo)m
-(v)m(ed)i(b)m(y)f(the)g Ft(unset)e Fu(and)h(`)p Ft(export)j(-n)p
-Fu(')e(commands,)g(plus)150 408 y(an)m(y)k(additions)f(via)h(the)g
-Ft(export)d Fu(and)i(`)p Ft(declare)f(-x)p Fu(')h(commands.)275
-549 y(The)j(en)m(vironmen)m(t)i(for)f(an)m(y)g(simple)h(command)f(or)g
+y(marking)26 b(it)g(for)g Fr(exp)s(ort)h Fu(to)g(c)m(hild)f(pro)s
+(cesses.)39 b(Executed)26 b(commands)g(inherit)g(the)g(en)m(vironmen)m
+(t.)39 b(The)150 408 y Ft(export)c Fu(and)i(`)p Ft(declare)29
+b(-x)p Fu(')36 b(commands)h(allo)m(w)i(parameters)e(and)g(functions)g
+(to)h(b)s(e)e(added)h(to)h(and)150 518 y(deleted)21 b(from)f(the)h(en)m
+(vironmen)m(t.)38 b(If)20 b(the)h(v)-5 b(alue)21 b(of)g(a)g(parameter)g
+(in)f(the)g(en)m(vironmen)m(t)i(is)e(mo)s(di\014ed,)i(the)150
+628 y(new)31 b(v)-5 b(alue)32 b(b)s(ecomes)f(part)h(of)f(the)h(en)m
+(vironmen)m(t,)g(replacing)h(the)e(old.)44 b(The)31 b(en)m(vironmen)m
+(t)h(inherited)150 737 y(b)m(y)f(an)m(y)g(executed)h(command)f
+(consists)g(of)g(the)g(shell's)h(initial)g(en)m(vironmen)m(t,)g(whose)f
+(v)-5 b(alues)31 b(ma)m(y)h(b)s(e)150 847 y(mo)s(di\014ed)26
+b(in)g(the)h(shell,)h(less)f(an)m(y)g(pairs)f(remo)m(v)m(ed)i(b)m(y)f
+(the)g Ft(unset)e Fu(and)h(`)p Ft(export)j(-n)p Fu(')e(commands,)g
+(plus)150 956 y(an)m(y)k(additions)f(via)h(the)g Ft(export)d
+Fu(and)i(`)p Ft(declare)f(-x)p Fu(')h(commands.)275 1100
+y(The)j(en)m(vironmen)m(t)i(for)f(an)m(y)g(simple)h(command)f(or)g
 (function)g(ma)m(y)g(b)s(e)g(augmen)m(ted)h(temp)s(orarily)150
-659 y(b)m(y)c(pre\014xing)e(it)i(with)g(parameter)g(assignmen)m(ts,)h
+1210 y(b)m(y)c(pre\014xing)e(it)i(with)g(parameter)g(assignmen)m(ts,)h
 (as)e(describ)s(ed)g(in)g(Section)i(3.4)g([Shell)e(P)m(arameters],)150
-768 y(page)g(18.)41 b(These)29 b(assignmen)m(t)i(statemen)m(ts)g
+1320 y(page)g(18.)41 b(These)29 b(assignmen)m(t)i(statemen)m(ts)g
 (a\013ect)f(only)g(the)f(en)m(vironmen)m(t)h(seen)g(b)m(y)f(that)h
-(command.)275 909 y(If)g(the)h Ft(-k)g Fu(option)g(is)g(set)h(\(see)g
+(command.)275 1464 y(If)g(the)h Ft(-k)g Fu(option)g(is)g(set)h(\(see)g
 (Section)g(4.3.1)g([The)f(Set)g(Builtin],)h(page)g(58\),)h(then)e(all)g
-(parameter)150 1019 y(assignmen)m(ts)f(are)g(placed)h(in)e(the)h(en)m
+(parameter)150 1573 y(assignmen)m(ts)f(are)g(placed)h(in)e(the)h(en)m
 (vironmen)m(t)g(for)g(a)g(command,)f(not)h(just)f(those)i(that)f
-(precede)g(the)150 1128 y(command)g(name.)275 1269 y(When)h(Bash)h(in)m
+(precede)g(the)150 1683 y(command)g(name.)275 1827 y(When)h(Bash)h(in)m
 (v)m(ok)m(es)i(an)e(external)h(command,)f(the)g(v)-5
 b(ariable)33 b(`)p Ft($_)p Fu(')f(is)g(set)h(to)f(the)g(full)g
-(pathname)150 1379 y(of)f(the)f(command)g(and)g(passed)g(to)h(that)g
-(command)f(in)g(its)h(en)m(vironmen)m(t.)150 1585 y Fk(3.7.5)63
-b(Exit)40 b(Status)150 1731 y Fu(The)26 b(exit)h(status)f(of)g(an)g
+(pathname)150 1936 y(of)f(the)f(command)g(and)g(passed)g(to)h(that)g
+(command)f(in)g(its)h(en)m(vironmen)m(t.)150 2145 y Fk(3.7.5)63
+b(Exit)40 b(Status)150 2292 y Fu(The)26 b(exit)h(status)f(of)g(an)g
 (executed)h(command)f(is)g(the)h(v)-5 b(alue)26 b(returned)f(b)m(y)h
-(the)g Fr(w)m(aitpid)k Fu(system)d(call)g(or)150 1841
+(the)g Fr(w)m(aitpid)k Fu(system)d(call)g(or)150 2401
 y(equiv)-5 b(alen)m(t)33 b(function.)45 b(Exit)32 b(statuses)g(fall)g
 (b)s(et)m(w)m(een)h(0)f(and)f(255,)i(though,)f(as)g(explained)g(b)s
-(elo)m(w,)h(the)150 1951 y(shell)i(ma)m(y)g(use)f(v)-5
+(elo)m(w,)h(the)150 2511 y(shell)i(ma)m(y)g(use)f(v)-5
 b(alues)35 b(ab)s(o)m(v)m(e)g(125)h(sp)s(ecially)-8 b(.)54
 b(Exit)35 b(statuses)g(from)f(shell)h(builtins)f(and)f(comp)s(ound)150
-2060 y(commands)j(are)g(also)h(limited)g(to)g(this)f(range.)58
+2621 y(commands)j(are)g(also)h(limited)g(to)g(this)f(range.)58
 b(Under)36 b(certain)h(circumstances,)h(the)e(shell)h(will)f(use)150
-2170 y(sp)s(ecial)31 b(v)-5 b(alues)31 b(to)g(indicate)g(sp)s(eci\014c)
-f(failure)h(mo)s(des.)275 2311 y(F)-8 b(or)32 b(the)g(shell's)g(purp)s
+2730 y(sp)s(ecial)31 b(v)-5 b(alues)31 b(to)g(indicate)g(sp)s(eci\014c)
+f(failure)h(mo)s(des.)275 2874 y(F)-8 b(or)32 b(the)g(shell's)g(purp)s
 (oses,)e(a)j(command)e(whic)m(h)h(exits)g(with)g(a)g(zero)g(exit)h
-(status)f(has)f(succeeded.)150 2420 y(A)e(non-zero)h(exit)g(status)g
+(status)f(has)f(succeeded.)150 2984 y(A)e(non-zero)h(exit)g(status)g
 (indicates)g(failure.)40 b(This)28 b(seemingly)i(coun)m(ter-in)m
-(tuitiv)m(e)i(sc)m(heme)e(is)f(used)g(so)150 2530 y(there)34
+(tuitiv)m(e)i(sc)m(heme)e(is)f(used)g(so)150 3093 y(there)34
 b(is)g(one)g(w)m(ell-de\014ned)g(w)m(a)m(y)g(to)h(indicate)g(success)f
 (and)f(a)h(v)-5 b(ariet)m(y)35 b(of)f(w)m(a)m(ys)h(to)f(indicate)h(v)-5
-b(arious)150 2639 y(failure)38 b(mo)s(des.)62 b(When)37
+b(arious)150 3203 y(failure)38 b(mo)s(des.)62 b(When)37
 b(a)h(command)f(terminates)i(on)e(a)h(fatal)h(signal)g(whose)e(n)m(um)m
-(b)s(er)f(is)i Fr(N)p Fu(,)i(Bash)150 2749 y(uses)30
+(b)s(er)f(is)i Fr(N)p Fu(,)i(Bash)150 3313 y(uses)30
 b(the)g(v)-5 b(alue)31 b(128)p Ft(+)p Fr(N)42 b Fu(as)30
-b(the)h(exit)g(status.)275 2890 y(If)k(a)h(command)g(is)g(not)g(found,)
+b(the)h(exit)g(status.)275 3457 y(If)k(a)h(command)g(is)g(not)g(found,)
 g(the)g(c)m(hild)h(pro)s(cess)e(created)i(to)g(execute)g(it)g(returns)d
-(a)j(status)f(of)150 2999 y(127.)42 b(If)30 b(a)h(command)f(is)g(found)
+(a)j(status)f(of)150 3566 y(127.)42 b(If)30 b(a)h(command)f(is)g(found)
 f(but)h(is)g(not)h(executable,)h(the)f(return)e(status)i(is)f(126.)275
-3140 y(If)i(a)i(command)f(fails)g(b)s(ecause)g(of)h(an)f(error)f
+3710 y(If)i(a)i(command)f(fails)g(b)s(ecause)g(of)h(an)f(error)f
 (during)g(expansion)h(or)g(redirection,)i(the)f(exit)g(status)150
-3250 y(is)c(greater)i(than)e(zero.)275 3391 y(The)38
+3820 y(is)c(greater)i(than)e(zero.)275 3964 y(The)38
 b(exit)h(status)g(is)g(used)f(b)m(y)g(the)h(Bash)g(conditional)h
-(commands)e(\(see)h(Section)h(3.2.4.2)h([Con-)150 3500
+(commands)e(\(see)h(Section)h(3.2.4.2)h([Con-)150 4073
 y(ditional)i(Constructs],)h(page)f(10\))g(and)e(some)i(of)f(the)g(list)
 g(constructs)g(\(see)h(Section)f(3.2.3)i([Lists],)150
-3610 y(page)31 b(9\).)275 3751 y(All)40 b(of)g(the)h(Bash)f(builtins)f
+4183 y(page)31 b(9\).)275 4327 y(All)40 b(of)g(the)h(Bash)f(builtins)f
 (return)g(an)h(exit)h(status)g(of)f(zero)h(if)f(they)g(succeed)g(and)g
-(a)g(non-zero)150 3860 y(status)34 b(on)f(failure,)i(so)f(they)g(ma)m
+(a)g(non-zero)150 4436 y(status)34 b(on)f(failure,)i(so)f(they)g(ma)m
 (y)g(b)s(e)f(used)g(b)m(y)g(the)h(conditional)h(and)e(list)h
-(constructs.)50 b(All)35 b(builtins)150 3970 y(return)29
+(constructs.)50 b(All)35 b(builtins)150 4546 y(return)29
 b(an)i(exit)g(status)g(of)f(2)h(to)g(indicate)g(incorrect)h(usage.)150
-4175 y Fk(3.7.6)63 b(Signals)150 4322 y Fu(When)36 b(Bash)g(is)h(in)m
+4755 y Fk(3.7.6)63 b(Signals)150 4902 y Fu(When)36 b(Bash)g(is)h(in)m
 (teractiv)m(e,)j(in)c(the)h(absence)f(of)h(an)m(y)f(traps,)i(it)e
 (ignores)h Ft(SIGTERM)d Fu(\(so)j(that)g(`)p Ft(kill)150
-4432 y(0)p Fu(')c(do)s(es)g(not)g(kill)g(an)g(in)m(teractiv)m(e)j
+5011 y(0)p Fu(')c(do)s(es)g(not)g(kill)g(an)g(in)m(teractiv)m(e)j
 (shell\),)f(and)d Ft(SIGINT)f Fu(is)i(caugh)m(t)h(and)f(handled)f(\(so)
-h(that)h(the)f Ft(wait)150 4542 y Fu(builtin)24 b(is)h(in)m
+h(that)h(the)f Ft(wait)150 5121 y Fu(builtin)24 b(is)h(in)m
 (terruptible\).)39 b(When)24 b(Bash)g(receiv)m(es)j(a)d
 Ft(SIGINT)p Fu(,)h(it)g(breaks)f(out)h(of)f(an)m(y)h(executing)h(lo)s
-(ops.)150 4651 y(In)31 b(all)h(cases,)h(Bash)f(ignores)g
+(ops.)150 5230 y(In)31 b(all)h(cases,)h(Bash)f(ignores)g
 Ft(SIGQUIT)p Fu(.)42 b(If)32 b(job)f(con)m(trol)i(is)e(in)h(e\013ect)h
-(\(see)f(Chapter)f(7)h([Job)g(Con)m(trol],)150 4761 y(page)f(97\),)h
+(\(see)f(Chapter)f(7)h([Job)g(Con)m(trol],)150 5340 y(page)f(97\),)h
 (Bash)e(ignores)h Ft(SIGTTIN)p Fu(,)e Ft(SIGTTOU)p Fu(,)g(and)g
-Ft(SIGTSTP)p Fu(.)275 4902 y(Non-builtin)i(commands)g(started)g(b)m(y)g
-(Bash)h(ha)m(v)m(e)g(signal)g(handlers)e(set)i(to)g(the)g(v)-5
-b(alues)31 b(inherited)150 5011 y(b)m(y)37 b(the)h(shell)g(from)f(its)h
-(paren)m(t.)62 b(When)38 b(job)f(con)m(trol)i(is)e(not)h(in)f
-(e\013ect,)k(async)m(hronous)c(commands)150 5121 y(ignore)f
-Ft(SIGINT)e Fu(and)h Ft(SIGQUIT)e Fu(in)j(addition)f(to)i(these)f
-(inherited)f(handlers.)55 b(Commands)35 b(run)f(as)i(a)150
-5230 y(result)27 b(of)h(command)f(substitution)h(ignore)g(the)g(k)m
-(eyb)s(oard-generated)g(job)g(con)m(trol)h(signals)f
-Ft(SIGTTIN)p Fu(,)150 5340 y Ft(SIGTTOU)p Fu(,)h(and)g
 Ft(SIGTSTP)p Fu(.)p eop end
 %%Page: 39 45
 TeXDict begin 39 44 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(39)275 299
-y(The)30 b(shell)i(exits)g(b)m(y)f(default)g(up)s(on)f(receipt)i(of)f
-(a)h Ft(SIGHUP)p Fu(.)42 b(Before)32 b(exiting,)h(an)e(in)m(teractiv)m
-(e)j(shell)150 408 y(resends)41 b(the)i Ft(SIGHUP)e Fu(to)i(all)g
-(jobs,)i(running)c(or)h(stopp)s(ed.)76 b(Stopp)s(ed)41
-b(jobs)h(are)h(sen)m(t)g Ft(SIGCONT)d Fu(to)150 518 y(ensure)32
-b(that)h(they)g(receiv)m(e)i(the)e Ft(SIGHUP)p Fu(.)47
-b(T)-8 b(o)33 b(prev)m(en)m(t)g(the)g(shell)g(from)g(sending)f(the)h
-Ft(SIGHUP)e Fu(signal)150 628 y(to)i(a)g(particular)g(job,)g(it)g
-(should)f(b)s(e)g(remo)m(v)m(ed)h(from)g(the)f(jobs)g(table)i(with)e
-(the)h Ft(disown)e Fu(builtin)h(\(see)150 737 y(Section)f(7.2)g([Job)f
-(Con)m(trol)h(Builtins],)g(page)g(98\))h(or)e(mark)m(ed)g(to)h(not)f
-(receiv)m(e)i Ft(SIGHUP)d Fu(using)h Ft(disown)150 847
-y(-h)p Fu(.)275 992 y(If)38 b(the)h Ft(huponexit)e Fu(shell)i(option)g
-(has)g(b)s(een)f(set)i(with)f Ft(shopt)e Fu(\(see)j(Section)g(4.3.2)h
-([The)e(Shopt)150 1102 y(Builtin],)31 b(page)g(62\),)h(Bash)f(sends)e
-(a)i Ft(SIGHUP)e Fu(to)i(all)g(jobs)f(when)f(an)i(in)m(teractiv)m(e)i
-(login)e(shell)g(exits.)275 1247 y(If)38 b(Bash)h(is)g(w)m(aiting)h
-(for)f(a)g(command)f(to)i(complete)g(and)e(receiv)m(es)j(a)e(signal)h
-(for)e(whic)m(h)h(a)g(trap)150 1357 y(has)c(b)s(een)f(set,)i(the)f
-(trap)g(will)g(not)g(b)s(e)f(executed)i(un)m(til)f(the)g(command)f
-(completes.)55 b(When)35 b(Bash)g(is)150 1467 y(w)m(aiting)j(for)f(an)g
-(async)m(hronous)g(command)g(via)h(the)f Ft(wait)f Fu(builtin,)i(the)g
-(reception)g(of)f(a)g(signal)h(for)150 1576 y(whic)m(h)d(a)g(trap)g
+y(Non-builtin)31 b(commands)g(started)g(b)m(y)g(Bash)h(ha)m(v)m(e)g
+(signal)g(handlers)e(set)i(to)g(the)g(v)-5 b(alues)31
+b(inherited)150 408 y(b)m(y)37 b(the)h(shell)g(from)f(its)h(paren)m(t.)
+62 b(When)38 b(job)f(con)m(trol)i(is)e(not)h(in)f(e\013ect,)k(async)m
+(hronous)c(commands)150 518 y(ignore)f Ft(SIGINT)e Fu(and)h
+Ft(SIGQUIT)e Fu(in)j(addition)f(to)i(these)f(inherited)f(handlers.)55
+b(Commands)35 b(run)f(as)i(a)150 628 y(result)27 b(of)h(command)f
+(substitution)h(ignore)g(the)g(k)m(eyb)s(oard-generated)g(job)g(con)m
+(trol)h(signals)f Ft(SIGTTIN)p Fu(,)150 737 y Ft(SIGTTOU)p
+Fu(,)h(and)g Ft(SIGTSTP)p Fu(.)275 883 y(The)h(shell)i(exits)g(b)m(y)f
+(default)g(up)s(on)f(receipt)i(of)f(a)h Ft(SIGHUP)p Fu(.)42
+b(Before)32 b(exiting,)h(an)e(in)m(teractiv)m(e)j(shell)150
+992 y(resends)41 b(the)i Ft(SIGHUP)e Fu(to)i(all)g(jobs,)i(running)c
+(or)h(stopp)s(ed.)76 b(Stopp)s(ed)41 b(jobs)h(are)h(sen)m(t)g
+Ft(SIGCONT)d Fu(to)150 1102 y(ensure)32 b(that)h(they)g(receiv)m(e)i
+(the)e Ft(SIGHUP)p Fu(.)47 b(T)-8 b(o)33 b(prev)m(en)m(t)g(the)g(shell)
+g(from)g(sending)f(the)h Ft(SIGHUP)e Fu(signal)150 1211
+y(to)i(a)g(particular)g(job,)g(it)g(should)f(b)s(e)g(remo)m(v)m(ed)h
+(from)g(the)f(jobs)g(table)i(with)e(the)h Ft(disown)e
+Fu(builtin)h(\(see)150 1321 y(Section)f(7.2)g([Job)f(Con)m(trol)h
+(Builtins],)g(page)g(98\))h(or)e(mark)m(ed)g(to)h(not)f(receiv)m(e)i
+Ft(SIGHUP)d Fu(using)h Ft(disown)150 1431 y(-h)p Fu(.)275
+1576 y(If)38 b(the)h Ft(huponexit)e Fu(shell)i(option)g(has)g(b)s(een)f
+(set)i(with)f Ft(shopt)e Fu(\(see)j(Section)g(4.3.2)h([The)e(Shopt)150
+1686 y(Builtin],)31 b(page)g(62\),)h(Bash)f(sends)e(a)i
+Ft(SIGHUP)e Fu(to)i(all)g(jobs)f(when)f(an)i(in)m(teractiv)m(e)i(login)
+e(shell)g(exits.)275 1831 y(If)38 b(Bash)h(is)g(w)m(aiting)h(for)f(a)g
+(command)f(to)i(complete)g(and)e(receiv)m(es)j(a)e(signal)h(for)e(whic)
+m(h)h(a)g(trap)150 1941 y(has)c(b)s(een)f(set,)i(the)f(trap)g(will)g
+(not)g(b)s(e)f(executed)i(un)m(til)f(the)g(command)f(completes.)55
+b(When)35 b(Bash)g(is)150 2050 y(w)m(aiting)j(for)f(an)g(async)m
+(hronous)g(command)g(via)h(the)f Ft(wait)f Fu(builtin,)i(the)g
+(reception)g(of)f(a)g(signal)h(for)150 2160 y(whic)m(h)d(a)g(trap)g
 (has)g(b)s(een)f(set)h(will)h(cause)f(the)g Ft(wait)f
 Fu(builtin)h(to)g(return)f(immediately)i(with)f(an)g(exit)150
-1686 y(status)c(greater)g(than)f(128,)i(immediately)g(after)f(whic)m(h)
-f(the)h(trap)f(is)g(executed.)150 1935 y Fs(3.8)68 b(Shell)45
-b(Scripts)150 2094 y Fu(A)30 b(shell)f(script)h(is)f(a)h(text)h(\014le)
+2270 y(status)c(greater)g(than)f(128,)i(immediately)g(after)f(whic)m(h)
+f(the)h(trap)f(is)g(executed.)150 2518 y Fs(3.8)68 b(Shell)45
+b(Scripts)150 2678 y Fu(A)30 b(shell)f(script)h(is)f(a)h(text)h(\014le)
 f(con)m(taining)h(shell)f(commands.)40 b(When)29 b(suc)m(h)g(a)h
-(\014le)g(is)f(used)g(as)h(the)g(\014rst)150 2204 y(non-option)c
+(\014le)g(is)f(used)g(as)h(the)g(\014rst)150 2787 y(non-option)c
 (argumen)m(t)h(when)e(in)m(v)m(oking)i(Bash,)g(and)f(neither)g(the)g
 Ft(-c)g Fu(nor)f Ft(-s)h Fu(option)g(is)g(supplied)f(\(see)150
-2313 y(Section)39 b(6.1)g([In)m(v)m(oking)g(Bash],)h(page)f(80\),)i
+2897 y(Section)39 b(6.1)g([In)m(v)m(oking)g(Bash],)h(page)f(80\),)i
 (Bash)d(reads)g(and)f(executes)i(commands)f(from)f(the)i(\014le,)150
-2423 y(then)32 b(exits.)46 b(This)32 b(mo)s(de)f(of)i(op)s(eration)f
+3007 y(then)32 b(exits.)46 b(This)32 b(mo)s(de)f(of)i(op)s(eration)f
 (creates)i(a)e(non-in)m(teractiv)m(e)j(shell.)46 b(The)31
-b(shell)i(\014rst)e(searc)m(hes)150 2532 y(for)d(the)g(\014le)g(in)g
+b(shell)i(\014rst)e(searc)m(hes)150 3116 y(for)d(the)g(\014le)g(in)g
 (the)g(curren)m(t)f(directory)-8 b(,)30 b(and)d(lo)s(oks)i(in)e(the)i
 (directories)g(in)e Ft($PATH)g Fu(if)h(not)g(found)e(there.)275
-2678 y(When)34 b(Bash)h(runs)e(a)i(shell)g(script,)g(it)h(sets)f(the)f
+3262 y(When)34 b(Bash)h(runs)e(a)i(shell)g(script,)g(it)h(sets)f(the)f
 (sp)s(ecial)i(parameter)f Ft(0)f Fu(to)h(the)g(name)g(of)g(the)g
-(\014le,)150 2787 y(rather)k(than)g(the)h(name)f(of)h(the)f(shell,)j
+(\014le,)150 3371 y(rather)k(than)g(the)h(name)f(of)h(the)f(shell,)j
 (and)d(the)h(p)s(ositional)g(parameters)f(are)h(set)g(to)g(the)g
-(remain-)150 2897 y(ing)f(argumen)m(ts,)j(if)d(an)m(y)g(are)g(giv)m
+(remain-)150 3481 y(ing)f(argumen)m(ts,)j(if)d(an)m(y)g(are)g(giv)m
 (en.)67 b(If)39 b(no)g(additional)g(argumen)m(ts)h(are)f(supplied,)h
-(the)f(p)s(ositional)150 3007 y(parameters)31 b(are)f(unset.)275
-3152 y(A)39 b(shell)h(script)f(ma)m(y)h(b)s(e)f(made)h(executable)h(b)m
+(the)f(p)s(ositional)150 3590 y(parameters)31 b(are)f(unset.)275
+3736 y(A)39 b(shell)h(script)f(ma)m(y)h(b)s(e)f(made)h(executable)h(b)m
 (y)e(using)g(the)h Ft(chmod)e Fu(command)h(to)h(turn)e(on)i(the)150
-3262 y(execute)j(bit.)73 b(When)41 b(Bash)g(\014nds)e(suc)m(h)i(a)h
+3846 y(execute)j(bit.)73 b(When)41 b(Bash)g(\014nds)e(suc)m(h)i(a)h
 (\014le)f(while)g(searc)m(hing)h(the)f Ft($PATH)f Fu(for)h(a)h
-(command,)h(it)150 3371 y(spa)m(wns)30 b(a)g(subshell)g(to)h(execute)h
-(it.)41 b(In)30 b(other)g(w)m(ords,)g(executing)390 3517
-y Ft(filename)46 b Fj(arguments)150 3662 y Fu(is)30 b(equiv)-5
-b(alen)m(t)32 b(to)f(executing)390 3808 y Ft(bash)47
-b(filename)e Fj(arguments)150 3953 y Fu(if)30 b Ft(filename)d
+(command,)h(it)150 3955 y(spa)m(wns)30 b(a)g(subshell)g(to)h(execute)h
+(it.)41 b(In)30 b(other)g(w)m(ords,)g(executing)390 4101
+y Ft(filename)46 b Fj(arguments)150 4246 y Fu(is)30 b(equiv)-5
+b(alen)m(t)32 b(to)f(executing)390 4392 y Ft(bash)47
+b(filename)e Fj(arguments)150 4537 y Fu(if)30 b Ft(filename)d
 Fu(is)j(an)f(executable)j(shell)e(script.)40 b(This)29
 b(subshell)g(reinitializes)i(itself,)g(so)f(that)h(the)e(e\013ect)150
-4063 y(is)36 b(as)h(if)g(a)f(new)g(shell)h(had)f(b)s(een)g(in)m(v)m(ok)
+4647 y(is)36 b(as)h(if)g(a)f(new)g(shell)h(had)f(b)s(een)g(in)m(v)m(ok)
 m(ed)h(to)h(in)m(terpret)e(the)h(script,)h(with)e(the)h(exception)h
-(that)f(the)150 4172 y(lo)s(cations)25 b(of)g(commands)e(remem)m(b)s
+(that)f(the)150 4756 y(lo)s(cations)25 b(of)g(commands)e(remem)m(b)s
 (ered)h(b)m(y)g(the)g(paren)m(t)g(\(see)h(the)f(description)g(of)g
-Ft(hash)f Fu(in)h(Section)h(4.1)150 4282 y([Bourne)30
+Ft(hash)f Fu(in)h(Section)h(4.1)150 4866 y([Bourne)30
 b(Shell)h(Builtins],)g(page)g(41\))h(are)e(retained)h(b)m(y)f(the)h(c)m
-(hild.)275 4427 y(Most)36 b(v)m(ersions)g(of)g(Unix)f(mak)m(e)h(this)g
+(hild.)275 5011 y(Most)36 b(v)m(ersions)g(of)g(Unix)f(mak)m(e)h(this)g
 (a)g(part)f(of)h(the)g(op)s(erating)g(system's)f(command)h(execution)
-150 4537 y(mec)m(hanism.)50 b(If)33 b(the)g(\014rst)g(line)h(of)f(a)h
+150 5121 y(mec)m(hanism.)50 b(If)33 b(the)g(\014rst)g(line)h(of)f(a)h
 (script)f(b)s(egins)g(with)g(the)g(t)m(w)m(o)i(c)m(haracters)g(`)p
-Ft(#!)p Fu(',)f(the)g(remainder)150 4647 y(of)d(the)g(line)h(sp)s
+Ft(#!)p Fu(',)f(the)g(remainder)150 5230 y(of)d(the)g(line)h(sp)s
 (eci\014es)e(an)h(in)m(terpreter)g(for)g(the)g(program.)43
 b(Th)m(us,)30 b(y)m(ou)h(can)h(sp)s(ecify)e(Bash,)i Ft(awk)p
-Fu(,)e(P)m(erl,)150 4756 y(or)g(some)h(other)g(in)m(terpreter)g(and)e
+Fu(,)e(P)m(erl,)150 5340 y(or)g(some)h(other)g(in)m(terpreter)g(and)e
 (write)i(the)f(rest)h(of)g(the)f(script)g(\014le)h(in)f(that)h
-(language.)275 4902 y(The)40 b(argumen)m(ts)h(to)g(the)g(in)m
-(terpreter)g(consist)g(of)g(a)g(single)h(optional)f(argumen)m(t)h
-(follo)m(wing)g(the)150 5011 y(in)m(terpreter)33 b(name)h(on)f(the)g
-(\014rst)f(line)i(of)f(the)g(script)g(\014le,)h(follo)m(w)m(ed)h(b)m(y)
-e(the)g(name)g(of)g(the)h(script)f(\014le,)150 5121 y(follo)m(w)m(ed)g
-(b)m(y)f(the)f(rest)h(of)g(the)f(argumen)m(ts.)45 b(Bash)31
-b(will)h(p)s(erform)e(this)i(action)h(on)e(op)s(erating)h(systems)150
-5230 y(that)24 b(do)g(not)f(handle)g(it)h(themselv)m(es.)40
-b(Note)25 b(that)f(some)g(older)g(v)m(ersions)f(of)h(Unix)f(limit)i
-(the)f(in)m(terpreter)150 5340 y(name)30 b(and)g(argumen)m(t)h(to)g(a)g
-(maxim)m(um)f(of)h(32)g(c)m(haracters.)p eop end
+(language.)p eop end
 %%Page: 40 46
 TeXDict begin 40 45 bop 150 -116 a Fu(Chapter)30 b(3:)41
 b(Basic)32 b(Shell)e(F)-8 b(eatures)2246 b(40)275 299
-y(Bash)32 b(scripts)g(often)g(b)s(egin)g(with)g Ft(#!)e(/bin/bash)g
-Fu(\(assuming)i(that)h(Bash)f(has)g(b)s(een)f(installed)i(in)150
-408 y Ft(/bin)p Fu(\),)26 b(since)h(this)f(ensures)f(that)i(Bash)f
-(will)h(b)s(e)f(used)f(to)i(in)m(terpret)f(the)h(script,)g(ev)m(en)g
-(if)f(it)h(is)f(executed)150 518 y(under)j(another)h(shell.)p
-eop end
+y(The)40 b(argumen)m(ts)h(to)g(the)g(in)m(terpreter)g(consist)g(of)g(a)
+g(single)h(optional)f(argumen)m(t)h(follo)m(wing)g(the)150
+408 y(in)m(terpreter)33 b(name)h(on)f(the)g(\014rst)f(line)i(of)f(the)g
+(script)g(\014le,)h(follo)m(w)m(ed)h(b)m(y)e(the)g(name)g(of)g(the)h
+(script)f(\014le,)150 518 y(follo)m(w)m(ed)g(b)m(y)f(the)f(rest)h(of)g
+(the)f(argumen)m(ts.)45 b(Bash)31 b(will)h(p)s(erform)e(this)i(action)h
+(on)e(op)s(erating)h(systems)150 628 y(that)24 b(do)g(not)f(handle)g
+(it)h(themselv)m(es.)40 b(Note)25 b(that)f(some)g(older)g(v)m(ersions)f
+(of)h(Unix)f(limit)i(the)f(in)m(terpreter)150 737 y(name)30
+b(and)g(argumen)m(t)h(to)g(a)g(maxim)m(um)f(of)h(32)g(c)m(haracters.)
+275 872 y(Bash)h(scripts)g(often)g(b)s(egin)g(with)g
+Ft(#!)e(/bin/bash)g Fu(\(assuming)i(that)h(Bash)f(has)g(b)s(een)f
+(installed)i(in)150 981 y Ft(/bin)p Fu(\),)26 b(since)h(this)f(ensures)
+f(that)i(Bash)f(will)h(b)s(e)f(used)f(to)i(in)m(terpret)f(the)h
+(script,)g(ev)m(en)g(if)f(it)h(is)f(executed)150 1091
+y(under)j(another)h(shell.)p eop end
 %%Page: 41 47
 TeXDict begin 41 46 bop 150 -116 a Fu(Chapter)30 b(4:)41
 b(Shell)30 b(Builtin)h(Commands)2069 b(41)150 299 y Fp(4)80
@@ -13465,12 +13466,12 @@ e(determines)g(the)h(b)s(eha)m(vior)f(of)g(range)h(expressions,)h
 (equiv-)630 3232 y(alence)e(classes,)h(and)e(collating)i(sequences)e
 (within)f(\014lename)h(expansion)g(and)f(pattern)630
 3342 y(matc)m(hing)d(\(see)h(Section)f(3.5.8)h([Filename)g(Expansion],)
-e(page)h(29\).)150 3511 y Ft(LC_CTYPE)96 b Fu(This)36
+e(page)h(30\).)150 3511 y Ft(LC_CTYPE)96 b Fu(This)36
 b(v)-5 b(ariable)37 b(determines)f(the)h(in)m(terpretation)h(of)f(c)m
 (haracters)h(and)e(the)g(b)s(eha)m(vior)h(of)630 3620
 y(c)m(haracter)46 b(classes)g(within)e(\014lename)h(expansion)g(and)f
 (pattern)h(matc)m(hing)h(\(see)f(Sec-)630 3730 y(tion)31
-b(3.5.8)h([Filename)g(Expansion],)e(page)h(29\).)150
+b(3.5.8)h([Filename)g(Expansion],)e(page)h(30\).)150
 3898 y Ft(LC_MESSAGES)630 4008 y Fu(This)25 b(v)-5 b(ariable)27
 b(determines)f(the)g(lo)s(cale)i(used)d(to)i(translate)g(double-quoted)
 f(strings)g(pre-)630 4118 y(ceded)31 b(b)m(y)f(a)h(`)p
@@ -17275,7 +17276,7 @@ b(These)39 b(include)g(things)g(lik)m(e)i(command)e(name)g(completion,)
 44 b(v)-5 b(ariable)40 b(completion)150 1395 y(for)i(w)m(ords)g(b)s
 (eginning)f(with)h(`)p Ft({)p Fu(',)k(completions)e(con)m(taining)f
 (pathname)g(expansion)f(patterns)g(\(see)150 1504 y(Section)31
-b(3.5.8)h([Filename)g(Expansion],)e(page)i(29\),)f(and)f(so)h(on.)275
+b(3.5.8)h([Filename)g(Expansion],)e(page)i(30\),)f(and)f(so)h(on.)275
 1639 y(Once)39 b(installed)i(using)e Ft(complete)p Fu(,)h
 Ft(_comp_cd)d Fu(will)j(b)s(e)g(called)g(ev)m(ery)h(time)f(w)m(e)g
 (attempt)h(w)m(ord)150 1748 y(completion)32 b(for)e(a)h
@@ -18381,7 +18382,7 @@ Ft(!)p Fu('.)225 536 y Fq(\017)60 b Fu(Bash)38 b(implemen)m(ts)g(the)g
 (erators,)i(including)d Fr(c)m(har-)330 646 y(acter)i(classes)p
 Fu(,)j Fr(equiv)-5 b(alence)39 b(classes)p Fu(,)j(and)37
 b Fr(collating)k(sym)m(b)s(ols)g Fu(\(see)e(Section)g(3.5.8)h
-([Filename)330 756 y(Expansion],)30 b(page)h(29\).)225
+([Filename)330 756 y(Expansion],)30 b(page)h(30\).)225
 883 y Fq(\017)60 b Fu(Bash)35 b(implemen)m(ts)g(extended)g(pattern)g
 (matc)m(hing)h(features)f(when)f(the)h Ft(extglob)d Fu(shell)j(option)
 330 993 y(is)30 b(enabled)h(\(see)g(Section)g(3.5.8.1)i([P)m(attern)f
@@ -20285,7 +20286,7 @@ b Fc(:)e(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)
 g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)43 b Fb(87)150 2925
 y(arithmetic)26 b(expansion)d Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g
 (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49
-b Fb(28)150 3013 y(arithmetic,)27 b(shell)17 b Fc(:)d(:)f(:)g(:)g(:)g
+b Fb(29)150 3013 y(arithmetic,)27 b(shell)17 b Fc(:)d(:)f(:)g(:)g(:)g
 (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)
 f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)43 b Fb(87)150 3102 y(arra)n(ys)15
 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
@@ -20383,17 +20384,17 @@ b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g
 (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)
 g(:)g(:)g(:)47 b Fb(21)2025 4586 y(expansion,)26 b(arithmetic)12
 b Fc(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
-h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(28)2025 4676
+h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)38 b Fb(29)2025 4676
 y(expansion,)26 b(brace)10 b Fc(:)j(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g
 (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)
 h(:)f(:)g(:)36 b Fb(21)2025 4767 y(expansion,)26 b(\014lename)12
 b Fc(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
-g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)38 b Fb(29)2025
+g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)38 b Fb(30)2025
 4857 y(expansion,)26 b(parameter)14 b Fc(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)
 g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h
 (:)40 b Fb(23)2025 4948 y(expansion,)26 b(pathname)18
 b Fc(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g
-(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(29)2025
+(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)45 b Fb(30)2025
 5038 y(expansion,)26 b(tilde)8 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g
 (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
 g(:)g(:)g(:)h(:)f(:)g(:)34 b Fb(22)2025 5129 y(expressions,)27
@@ -20413,7 +20414,7 @@ g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g
 (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)42 b Fb(3)150
 589 y(\014lename)26 b(expansion)d Fc(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f
 (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)
-g(:)g(:)49 b Fb(29)150 676 y(foreground)24 b Fc(:)13
+g(:)g(:)49 b Fb(30)150 676 y(foreground)24 b Fc(:)13
 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g
 (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
 49 b Fb(97)150 764 y(functions,)26 b(shell)21 b Fc(:)14
@@ -20498,7 +20499,7 @@ b Fc(:)c(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)
 g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(20)2025
 474 y(pathname)25 b(expansion)12 b Fc(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g
 (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)
-h(:)38 b Fb(29)2025 562 y(pattern)25 b(matc)n(hing)14
+h(:)38 b Fb(30)2025 562 y(pattern)25 b(matc)n(hing)14
 b Fc(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)
 f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)41
 b Fb(30)2025 650 y(pip)r(eline)23 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g
index c82c0b906b330c7d370a94e6b6fc14992b170507..4fa5884d72e1069312fccaa7c66bf9cb939d2a33 100644 (file)
@@ -4003,6 +4003,10 @@ as with the @code{local} command, unless the @option{-g} option is used.
 If a variable name is followed by =@var{value}, the value of the variable
 is set to @var{value}.
 
+When using @option{-a} or @option{-A} and the compound assignment syntax to 
+create array variables, additional attributes do not take effect until
+subsequent assignments.
+
 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,
index 227f0ace70f10456847e0d64d15448f69b3d99a3..46d12412214b8792c165672d8b1e48bb31a5d5b3 100644 (file)
 @numsubsecentry{Tilde Expansion}{3.5.2}{Tilde Expansion}{22}
 @numsubsecentry{Shell Parameter Expansion}{3.5.3}{Shell Parameter Expansion}{23}
 @numsubsecentry{Command Substitution}{3.5.4}{Command Substitution}{28}
-@numsubsecentry{Arithmetic Expansion}{3.5.5}{Arithmetic Expansion}{28}
+@numsubsecentry{Arithmetic Expansion}{3.5.5}{Arithmetic Expansion}{29}
 @numsubsecentry{Process Substitution}{3.5.6}{Process Substitution}{29}
 @numsubsecentry{Word Splitting}{3.5.7}{Word Splitting}{29}
-@numsubsecentry{Filename Expansion}{3.5.8}{Filename Expansion}{29}
+@numsubsecentry{Filename Expansion}{3.5.8}{Filename Expansion}{30}
 @numsubsubsecentry{Pattern Matching}{3.5.8.1}{Pattern Matching}{30}
 @numsubsecentry{Quote Removal}{3.5.9}{Quote Removal}{31}
 @numsecentry{Redirections}{3.6}{Redirections}{31}
@@ -42,7 +42,7 @@
 @numsubsecentry{Redirecting Output}{3.6.2}{}{33}
 @numsubsecentry{Appending Redirected Output}{3.6.3}{}{33}
 @numsubsecentry{Redirecting Standard Output and Standard Error}{3.6.4}{}{33}
-@numsubsecentry{Appending Standard Output and Standard Error}{3.6.5}{}{33}
+@numsubsecentry{Appending Standard Output and Standard Error}{3.6.5}{}{34}
 @numsubsecentry{Here Documents}{3.6.6}{}{34}
 @numsubsecentry{Here Strings}{3.6.7}{}{34}
 @numsubsecentry{Duplicating File Descriptors}{3.6.8}{}{34}
index 99d5931ae528beb30e7e48ac0cca9834c53b1289..e42402b896e8ee7f63cc02ce7452a4fa6b2920a9 100644 (file)
@@ -1,6 +1,6 @@
 %!PS-Adobe-3.0
 %%Creator: groff version 1.19.2
-%%CreationDate: Thu Jan 23 15:52:06 2014
+%%CreationDate: Tue Feb  4 09:39:00 2014
 %%DocumentNeededResources: font Times-Roman
 %%+ font Times-Bold
 %%+ font Times-Italic
index 7ff52b349e24c35427f88467fa6c25e0beb1664f..fdf71adbe5e8cd1c6c0ed85bb0fcaa47fe1eff97 100644 (file)
@@ -1,6 +1,6 @@
 %!PS-Adobe-3.0
 %%Creator: groff version 1.19.2
-%%CreationDate: Thu Jan 23 15:52:06 2014
+%%CreationDate: Tue Feb  4 09:39:00 2014
 %%DocumentNeededResources: font Times-Roman
 %%+ font Times-Bold
 %%DocumentSuppliedResources: procset grops 1.19 2
diff --git a/examples/loadables/Makefile.in.save b/examples/loadables/Makefile.in.save
new file mode 100644 (file)
index 0000000..f6208f5
--- /dev/null
@@ -0,0 +1,238 @@
+#
+# Simple makefile for the sample loadable builtins
+#
+# Copyright (C) 1996 Free Software Foundation, Inc.     
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+# Include some boilerplate Gnu makefile definitions.
+prefix = @prefix@
+
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+infodir = @infodir@
+includedir = @includedir@
+
+topdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+
+@SET_MAKE@
+CC = @CC@
+RM = rm -f
+
+SHELL = @MAKE_SHELL@
+
+host_os = @host_os@
+host_cpu = @host_cpu@
+host_vendor = @host_vendor@
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@
+DEFS = @DEFS@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+CPPFLAGS = @CPPFLAGS@
+
+BASHINCDIR = ${topdir}/include
+
+LIBBUILD = ${BUILD_DIR}/lib
+
+INTL_LIBSRC = ${topdir}/lib/intl
+INTL_BUILDDIR = ${LIBBUILD}/intl
+INTL_INC = @INTL_INC@
+LIBINTL_H = @LIBINTL_H@
+
+CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(LOCAL_CFLAGS) $(CFLAGS)
+
+#
+# These values are generated for configure by ${topdir}/support/shobj-conf.
+# If your system is not supported by that script, but includes facilities for
+# dynamic loading of shared objects, please update the script and send the
+# changes to bash-maintainers@gnu.org.
+#
+SHOBJ_CC = @SHOBJ_CC@
+SHOBJ_CFLAGS = @SHOBJ_CFLAGS@
+SHOBJ_LD = @SHOBJ_LD@
+SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@
+SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@
+SHOBJ_LIBS = @SHOBJ_LIBS@
+SHOBJ_STATUS = @SHOBJ_STATUS@
+
+INC = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(topdir)/builtins \
+      -I$(BASHINCDIR) -I$(BUILD_DIR) -I$(LIBBUILD) \
+      -I$(BUILD_DIR)/builtins $(INTL_INC)
+
+.c.o:
+       $(SHOBJ_CC) $(SHOBJ_CFLAGS) $(CCFLAGS) $(INC) -c -o $@ $<
+
+
+ALLPROG = print truefalse sleep pushd finfo logname basename dirname \
+         tty pathchk tee head mkdir rmdir printenv id whoami \
+         uname sync push ln unlink cut realpath getconf strftime
+OTHERPROG = necho hello cat
+
+all:   $(SHOBJ_STATUS)
+
+supported:     $(ALLPROG)
+others:                $(OTHERPROG)
+
+unsupported:
+       @echo "Your system (${host_os}) is not supported by the"
+       @echo "${topdir}/support/shobj-conf script."
+       @echo "If your operating system provides facilities for dynamic"
+       @echo "loading of shared objects using the dlopen(3) interface,"
+       @echo "please update the script and re-run configure.
+       @echo "Please send the changes you made to bash-maintainers@gnu.org"
+       @echo "for inclusion in future bash releases."
+
+everything: supported others
+
+print: print.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ print.o $(SHOBJ_LIBS)
+
+necho: necho.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ necho.o $(SHOBJ_LIBS)
+
+getconf: getconf.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ getconf.o $(SHOBJ_LIBS)
+
+hello: hello.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ hello.o $(SHOBJ_LIBS)
+
+truefalse: truefalse.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ truefalse.o $(SHOBJ_LIBS)
+
+sleep: sleep.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sleep.o $(SHOBJ_LIBS)
+
+finfo: finfo.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ finfo.o $(SHOBJ_LIBS)
+
+cat:   cat.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ cat.o $(SHOBJ_LIBS)
+
+logname:       logname.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ logname.o $(SHOBJ_LIBS)
+
+basename:      basename.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ basename.o $(SHOBJ_LIBS)
+
+dirname:       dirname.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ dirname.o $(SHOBJ_LIBS)
+
+tty:   tty.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tty.o $(SHOBJ_LIBS)
+
+pathchk:       pathchk.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pathchk.o $(SHOBJ_LIBS)
+
+tee:   tee.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ tee.o $(SHOBJ_LIBS)
+
+mkdir: mkdir.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ mkdir.o $(SHOBJ_LIBS)
+
+rmdir: rmdir.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ rmdir.o $(SHOBJ_LIBS)
+
+head:  head.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ head.o $(SHOBJ_LIBS)
+
+printenv:      printenv.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ printenv.o $(SHOBJ_LIBS)
+
+id:    id.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ id.o $(SHOBJ_LIBS)
+
+whoami:        whoami.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ whoami.o $(SHOBJ_LIBS)
+
+uname: uname.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ uname.o $(SHOBJ_LIBS)
+
+sync:  sync.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ sync.o $(SHOBJ_LIBS)
+
+push:  push.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ push.o $(SHOBJ_LIBS)
+
+ln:    ln.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ ln.o $(SHOBJ_LIBS)
+
+unlink:        unlink.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ unlink.o $(SHOBJ_LIBS)
+
+cut:   cut.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ cut.o $(SHOBJ_LIBS)
+
+realpath:      realpath.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ realpath.o $(SHOBJ_LIBS)
+
+strftime:      strftime.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ strftime.o $(SHOBJ_LIBS)
+
+# pushd is a special case.  We use the same source that the builtin version
+# uses, with special compilation options.
+#
+pushd.c:       ${topdir}/builtins/pushd.def
+       $(RM) $@
+       ${BUILD_DIR}/builtins/mkbuiltins -D ${topdir}/builtins ${topdir}/builtins/pushd.def
+
+pushd.o:       pushd.c
+       $(RM) $@
+       $(SHOBJ_CC) -DHAVE_CONFIG_H -DPUSHD_AND_POPD -DLOADABLE_BUILTIN $(SHOBJ_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(INC) -c -o $@ $<
+
+pushd: pushd.o
+       $(SHOBJ_LD) $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) -o $@ pushd.o $(SHOBJ_LIBS)
+
+clean:
+       $(RM) $(ALLPROG) $(OTHERPROG) *.o
+       -( cd perl && ${MAKE} ${MFLAGS} $@ )
+
+mostlyclean:   clean
+       -( cd perl && ${MAKE} ${MFLAGS} $@ )
+
+distclean maintainer-clean: clean
+       $(RM) Makefile pushd.c
+       -( cd perl && ${MAKE} ${MFLAGS} $@ )
+
+print.o: print.c
+truefalse.o: truefalse.c
+sleep.o: sleep.c
+finfo.o: finfo.c
+logname.o: logname.c
+basename.o: basename.c
+dirname.o: dirname.c
+tty.o: tty.c
+pathchk.o: pathchk.c
+tee.o: tee.c
+head.o: head.c
+rmdir.o: rmdir.c
+necho.o: necho.c
+getconf.o: getconf.c
+hello.o: hello.c
+cat.o: cat.c
+printenv.o: printenv.c
+id.o: id.c
+whoami.o: whoami.c
+uname.o: uname.c
+sync.o: sync.c
+push.o: push.c
+mkdir.o: mkdir.c
+realpath.o: realpath.c
+strftime.o: strftime.c
diff --git a/input.c b/input.c
index 68b5af306f4f7a8416c93a077ffd7bc16254ef9b..14c6f4e0794e022eae6d96a64c7a7f147eb5563b 100644 (file)
--- a/input.c
+++ b/input.c
@@ -110,6 +110,8 @@ getc_with_restart (stream)
              local_index = local_bufused = 0;
              return EOF;
            }
+         else if (interrupt_state || terminating_signal)       /* QUIT; */
+           local_index = local_bufused = 0;
        }
       local_index = 0;
     }
diff --git a/lib/readline/doc/Makefile.old b/lib/readline/doc/Makefile.old
new file mode 100644 (file)
index 0000000..58d4dd7
--- /dev/null
@@ -0,0 +1,76 @@
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+RM = rm -f
+
+MAKEINFO    = makeinfo
+TEXI2DVI    = texi2dvi
+TEXI2HTML   = texi2html
+QUIETPS     = #set this to -q to shut up dvips
+DVIPS       = dvips -D 300 $(QUIETPS) -o $@     # tricky
+
+INSTALL_DATA = cp
+infodir = /usr/local/info
+
+RLSRC = rlman.texinfo rluser.texinfo rltech.texinfo
+HISTSRC = hist.texinfo hsuser.texinfo hstech.texinfo
+
+DVIOBJ = readline.dvi history.dvi
+INFOOBJ = readline.info history.info
+PSOBJ = readline.ps history.ps
+HTMLOBJ = readline.html history.html
+
+all: info dvi html ps
+nodvi: info html
+
+readline.dvi: $(RLSRC)
+       $(TEXI2DVI) rlman.texinfo
+       mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+       $(MAKEINFO) --no-split -o $@ rlman.texinfo
+
+history.dvi: ${HISTSRC}
+       $(TEXI2DVI) hist.texinfo
+       mv hist.dvi history.dvi
+
+history.info: ${HISTSRC}
+       $(MAKEINFO) --no-split -o $@ hist.texinfo
+
+readline.ps:   readline.dvi
+       $(RM) $@
+       $(DVIPS) readline.dvi
+
+history.ps:    history.dvi
+       $(RM) $@
+       $(DVIPS) history.dvi
+
+readline.html: ${RLSRC}
+       $(TEXI2HTML) rlman.texinfo
+       sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman.html > readline.html
+       sed -e 's:rlman.html:readline.html:' -e 's:rlman_toc.html:readline_toc.html:' rlman_toc.html > readline_toc.html
+       $(RM) rlman.html rlman_toc.html
+
+history.html:  ${HISTSRC}
+       $(TEXI2HTML) hist.texinfo
+       sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist.html > history.html
+       sed -e 's:hist.html:history.html:' -e 's:hist_toc.html:history_toc.html:' hist_toc.html > history_toc.html
+       $(RM) hist.html hist_toc.html
+
+info:  $(INFOOBJ)
+dvi:   $(DVIOBJ)
+ps:    $(PSOBJ)
+html:  $(HTMLOBJ)
+
+clean:
+       $(RM) *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+             *.fns *.kys *.tps *.vrs *.o core
+
+distclean: clean
+mostlyclean: clean
+
+maintainer-clean: clean
+       $(RM) *.dvi *.info *.info-* *.ps *.html
+
+install:       info
+       ${INSTALL_DATA} readline.info $(infodir)/readline.info
+       ${INSTALL_DATA} history.info $(infodir)/history.info
index 178296be86182228f392584387022e1b2fafa31c..40de49c4db6be5a66945fd4fd6101b4ba4907008 100644 (file)
@@ -440,6 +440,8 @@ If non-zero, Readline will call indirectly through this pointer
 to get a character from the input stream.  By default, it is set to
 @code{rl_getc}, the default Readline character input function
 (@pxref{Character Input}).
+In general, an application that sets @var{rl_getc_function} should consider
+setting @var{rl_input_available_hook} as well.
 @end deftypevar
 
 @deftypevar {rl_hook_func_t *} rl_signal_event_hook
@@ -451,14 +453,22 @@ call is interrupted when Readline is reading terminal input.
 If non-zero, Readline will use this function's return value when it needs
 to determine whether or not there is available input on the current input
 source.
+The default hook checks @code{rl_instream}; if an application is using a
+different input source, it should set the hook appropriately.
 Readline queries for available input when implementing intra-key-sequence
 timeouts during input and incremental searches.
 This may use an application-specific timeout before returning a value;
 Readline uses the value passed to @code{rl_set_keyboard_input_timeout()}
 or the value of the user-settable @var{keyseq-timeout} variable.
-This is designed for use by functions using Readline's callback interface
+This is designed for use by applications using Readline's callback interface
 (@pxref{Alternate Interface}), which may not use the traditional
-@code{read(2)} and file descriptor interface.
+@code{read(2)} and file descriptor interface, or other applications using
+a different input mechanism.
+If an application uses an input mechanism or hook that can potentially exceed
+the value of @var{keyseq-timeout}, it should increase the timeout or set
+this hook appropriately even when not using the callback interface.
+In general, an application that sets @var{rl_getc_function} should consider
+setting @var{rl_input_available_hook} as well.
 @end deftypevar
 
 @deftypevar {rl_voidfunc_t *} rl_redisplay_function
index 9c915242914a977484fd4bb0d3467f7688c5f4b9..0af6c02e13573fb2d8d316b8eda46c59220aa8ca 100644 (file)
@@ -586,6 +586,8 @@ the input read so far, or can take additional input to complete a longer
 key sequence).
 If no input is received within the timeout, Readline will use the shorter
 but complete key sequence.
+Readline uses this value to determine whether or not input is
+available on the current input source (@code{rl_instream} by default).
 The value is specified in milliseconds, so a value of 1000 means that
 Readline will wait one second for additional input.
 If this variable is set to a value less than or equal to zero, or to a
index 18ba05a58c0e6b8217aaff2909cd60db3cefcd58..ed5754a92147dee47035c37cf462b745f536c0d7 100644 (file)
@@ -278,8 +278,11 @@ ansic_quote (str, flags, rlen)
       if (clen == 1)
        *r++ = c;
       else
-       for (b = 0; b < (int)clen; c = b ? *++s : c)
-         *r++ = c;
+       {
+         for (b = 0; b < (int)clen; b++)
+           *r++ = (unsigned char)s[b];
+         s += clen - 1;        /* -1 because of the increment above */
+       }
     }
 
   *r++ = '\'';
diff --git a/support/mk-takehome b/support/mk-takehome
new file mode 100755 (executable)
index 0000000..419572d
--- /dev/null
@@ -0,0 +1,70 @@
+#! /bin/bash
+
+DATE=$(date +%Y%m%d)
+
+PARENT=/fs2/chet/bash
+FROOT=bash-$DATE
+DIR=$PARENT/$FROOT
+TARF=${FROOT}.tar
+SRC=/usr/homes/chet/src/bash/src
+
+fflag= sflag= dflag=
+while getopts "dfsp:" opt
+do
+       case $opt in
+       d)      dflag=1 ;;
+       f)      fflag=1 ;;
+       p)      PARENT=$OPTARG
+               if [ ! -d "$PARENT" ]; then
+                       echo "mk-takehome: $PARENT: directory does not exist" 2>&1
+                       exit 2
+               fi ;;
+       s)      sflag=1 ;;
+       *)      echo "mk-takehome: usage: mk-takehome [-dfs]" 2>&1
+               exit 2;;
+       esac
+done
+
+shift $(($OPTIND - 1))
+
+if [ -n "$fflag" ]; then
+       rm -rf "$DIR"
+fi
+
+mkdir $DIR || exit 1
+
+cd $DIR || exit 1
+
+cd $SRC || exit 1
+
+tar cf - . | (cd $DIR ; tar xvpf - )
+
+cd $DIR || exit 1
+
+find . -type f -name '*~' -print | xargs rm -f
+
+find . -type d -name 'savedir' -print | xargs rm -rf
+
+rm parser-built y.tab.c y.tab.h
+# bison -y -d parse.y          # make sure y.tab.h present for dependencies
+
+rm -f d d? ddd ddd?            # convention for temp diff files
+
+cd $PARENT || exit 1
+
+tar cvf ${TARF} $FROOT
+
+gzip -v ${TARF}
+
+REMHOST=z4
+
+if [ -n "$sflag" ]; then
+       scp ${TARF}.gz ${REMHOST}:
+fi
+
+if [ -n "$dflag" ]; then
+       if [ ! -d $HOME/Dropbox ]; then
+               HOME=~chet
+       fi
+       cp ${TARF}.gz $HOME/Dropbox/
+fi
diff --git a/test.c b/test.c
index b9b2c874b9c1b74dcbc6f9e3173e0dc3ce54ba73..7f0b28d54f20c01c39cfb6abfd54609f35cb6089 100644 (file)
--- a/test.c
+++ b/test.c
@@ -622,6 +622,27 @@ unary_test (op, arg)
 
     case 'v':
       v = find_variable (arg);
+#if defined (ARRAY_VARS)
+      if (v == 0 && valid_array_reference (arg))
+       {
+         char *t;
+         t = array_value (arg, 0, 0, (int *)0, (arrayind_t *)0);
+         return (t ? TRUE : FALSE);
+       }
+     else if (v && invisible_p (v) == 0 && array_p (v))
+       {
+         char *t;
+         /* [[ -v foo ]] == [[ -v foo[0] ]] */
+         t = array_reference (array_cell (v), 0);
+         return (t ? TRUE : FALSE);
+       }
+      else if (v && invisible_p (v) == 0 && assoc_p (v))
+       {
+         char *t;
+         t = assoc_reference (assoc_cell (v), "0");
+         return (t ? TRUE : FALSE);
+       }
+#endif
       return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE);
 
     case 'R':
index 593ab3794533a033bd56556306563a22e7e18ac9..0307d6b49217ca3984a12bf92130924cd03b2a70 100644 (file)
@@ -380,3 +380,11 @@ strlen(4four) = 5
 1 2 xx 3
 1 2 0 3
 1 2 xx 3
+foo index 1: ok
+foo index 2: ok
+foo: implicit reference to element 0: ok
+foo: arithmetic evaluation: ok
+bar: array with element zero unset: ok
+bar: element zero: ok
+qux: unset array: ok
+qux: unset array element 0: ok
index 53c7d8c0481885cd3dd3823aa983cc49ae134c86..4c176514a0b8f9ab928654601a858b224a7065f7 100644 (file)
@@ -398,3 +398,5 @@ ${THIS_SH} ./array13.sub
 ${THIS_SH} ./array14.sub
 
 ${THIS_SH} ./array15.sub
+
+${THIS_SH} ./array16.sub
diff --git a/tests/array16.sub b/tests/array16.sub
new file mode 100644 (file)
index 0000000..10024bc
--- /dev/null
@@ -0,0 +1,21 @@
+foo[0]=a
+foo[1]=b
+
+[[ -v foo[1] ]] && echo foo index 1: ok
+[[ -v foo[2] ]] || echo foo index 2: ok
+
+[[ -v foo ]] && echo foo: implicit reference to element 0: ok
+
+typeset -i foo
+
+[[ -v foo[1] ]] && echo foo: arithmetic evaluation: ok
+
+typeset -a bar
+bar[1]=set
+
+[[ -v bar ]] || echo bar: array with element zero unset: ok
+[[ -v bar[0] ]] || echo bar: element zero: ok
+
+typeset -a qux
+[[ -v qux ]] || echo qux: unset array: ok
+[[ -v qux[0] ]] || echo qux: unset array element 0: ok
diff --git a/tests/misc/regress/log.orig b/tests/misc/regress/log.orig
new file mode 100644 (file)
index 0000000..c1f1e19
--- /dev/null
@@ -0,0 +1,50 @@
+:; ./shx
+
+sh:
+<&$fd  ok
+nlbq   Mon Aug  3 02:45:00 EDT 1992
+bang   geoff
+quote  712824302
+setbq  defmsgid=<1992Aug3.024502.6176@host>
+bgwait sleep done... wait 6187
+
+
+bash:
+<&$fd  ok
+nlbq   Mon Aug  3 02:45:09 EDT 1992
+bang   geoff
+quote  712824311
+setbq  defmsgid=<1992Aug3.024512.6212@host>
+bgwait sleep done... wait 6223
+
+
+ash:
+<&$fd  shx1: 4: Syntax error: Bad fd number
+nlbq   Mon Aug  3 02:45:19 EDT 1992
+bang   geoff
+quote  getdate: `"now"' not a valid date
+
+setbq  defmsgid=<1992Aug3.` echo 024521
+bgwait sleep done... wait 6241
+
+
+ksh:
+<&$fd  ok
+nlbq   ./shx: 6248 Memory fault - core dumped
+bang   geoff
+quote  getdate: `"now"' not a valid date
+
+setbq  defmsgid=<1992Aug3.024530.6257@host>
+bgwait no such job: 6265
+wait 6265
+sleep done... 
+
+zsh:
+<&$fd  ok
+nlbq   Mon Aug 3 02:45:36 EDT 1992
+bang   shx3: event not found: /s/ [4]
+quote  712824337
+setbq  defmsgid=<..6290@host>
+bgwait shx7: unmatched " [9]
+sleep done... 
+:; 
diff --git a/tests/misc/regress/shx.orig b/tests/misc/regress/shx.orig
new file mode 100644 (file)
index 0000000..4b3bf2b
--- /dev/null
@@ -0,0 +1,10 @@
+#! /bin/sh
+for cmd in sh bash ash ksh zsh
+do
+       echo
+       echo $cmd:
+       for demo in shx?
+       do
+               $cmd $demo
+       done
+done
diff --git a/trap.c b/trap.c
index 5c31ff6034d5fb3090358923f77790a86c5d2178..15d3fc81cff58e258a5055d664c4eb9ea722c8f1 100644 (file)
--- a/trap.c
+++ b/trap.c
@@ -755,7 +755,11 @@ restore_default_signal (sig)
     return;
 
   /* If we aren't trapping this signal, don't bother doing anything else. */
-  if ((sigmodes[sig] & SIG_TRAPPED) == 0)
+  /* We special-case SIGCHLD and IMPOSSIBLE_TRAP_HANDLER (see above) as a
+     sentinel to determine whether or not disposition is reset to the default
+     while the trap handler is executing. */
+  if (((sigmodes[sig] & SIG_TRAPPED) == 0) &&
+      (sig != SIGCHLD || (sigmodes[sig] & SIG_INPROGRESS) == 0 || trap_list[sig] != (char *)IMPOSSIBLE_TRAP_HANDLER))
     return;
 
   /* Only change the signal handler for SIG if it allows it. */